From e24eca186fb5bdf6ee044a8f6a3bb0dc0415b888 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 27 Oct 2026 09:28:24 +0000 Subject: [PATCH 1/3] Pin the DLR, drop obsolete 1.9.1 libraries and committed binaries - CI and release check out IronLanguages/dlr at a pinned DLR_REF (current main, which all Build/dlr-patches apply to) instead of whatever main is on the day, so a release can be rebuilt and upstream changes arrive only when the pin is moved. - Remove libraries from Src/StdLib/ruby/1.9.1 that CRuby dropped years ago and nothing outside that tree requires: xmlrpc, syck (and yaml/syck), dl, gserver, shell, net/telnet, sync, thwait, e2mmap, ubygems. Also remove the 1.9 rdoc, which ruby/4.0's rdoc 7 shadows and which carried jQuery 1.2.6. These shipped in every release. - Remove committed binaries of the unused legacy build: Util/NuGet/nuget.exe (2.8), Build/CustomTasks/CustomTasks.dll (built from CustomTasks.cs by Bootstrap.targets) and Src/Scripts/Rewriter with its corapi/raw DLLs. - Microsoft.Data.Sqlite 8.0.10 -> 8.0.33, the latest 8.0 patch. - actions/setup-node v4 -> v6 in release.yml. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01KPwZf7csSRV3oAVQ31sLDS --- .github/workflows/ci.yml | 6 + .github/workflows/release.yml | 7 +- Build/CustomTasks/CustomTasks.dll | Bin 6144 -> 0 bytes Build/dlr-patches/README.md | 6 +- README.md | 2 + Src/Libraries/IronRuby.Libraries.csproj | 7 +- Src/Scripts/Rewriter/Assemblies.txt | 7 - Src/Scripts/Rewriter/RewriteAll.cmd | 4 - Src/Scripts/Rewriter/corapi.dll | Bin 240128 -> 0 bytes Src/Scripts/Rewriter/raw.dll | Bin 49664 -> 0 bytes Src/Scripts/Rewriter/rewrite.rb | 192 -- Src/StdLib/ruby/1.9.1/dl.rb | 12 - Src/StdLib/ruby/1.9.1/dl/callback.rb | 96 - Src/StdLib/ruby/1.9.1/dl/cparser.rb | 109 -- Src/StdLib/ruby/1.9.1/dl/func.rb | 187 -- Src/StdLib/ruby/1.9.1/dl/import.rb | 235 --- Src/StdLib/ruby/1.9.1/dl/pack.rb | 128 -- Src/StdLib/ruby/1.9.1/dl/stack.rb | 116 -- Src/StdLib/ruby/1.9.1/dl/struct.rb | 213 --- Src/StdLib/ruby/1.9.1/dl/types.rb | 40 - Src/StdLib/ruby/1.9.1/dl/value.rb | 112 -- Src/StdLib/ruby/1.9.1/e2mmap.rb | 172 -- Src/StdLib/ruby/1.9.1/gserver.rb | 253 --- Src/StdLib/ruby/1.9.1/net/telnet.rb | 759 -------- Src/StdLib/ruby/1.9.1/rdoc.rb | 421 ----- Src/StdLib/ruby/1.9.1/rdoc/alias.rb | 54 - Src/StdLib/ruby/1.9.1/rdoc/anon_class.rb | 10 - Src/StdLib/ruby/1.9.1/rdoc/any_method.rb | 290 --- Src/StdLib/ruby/1.9.1/rdoc/attr.rb | 178 -- Src/StdLib/ruby/1.9.1/rdoc/class_module.rb | 215 --- Src/StdLib/ruby/1.9.1/rdoc/code_object.rb | 180 -- Src/StdLib/ruby/1.9.1/rdoc/code_objects.rb | 23 - Src/StdLib/ruby/1.9.1/rdoc/constant.rb | 58 - Src/StdLib/ruby/1.9.1/rdoc/context.rb | 767 -------- Src/StdLib/ruby/1.9.1/rdoc/generator.rb | 8 - .../ruby/1.9.1/rdoc/generator/darkfish.rb | 453 ----- .../ruby/1.9.1/rdoc/generator/markup.rb | 171 -- Src/StdLib/ruby/1.9.1/rdoc/generator/ri.rb | 82 - .../template/darkfish/classpage.rhtml | 297 --- .../template/darkfish/filepage.rhtml | 124 -- .../template/darkfish/images/brick.png | Bin 452 -> 0 bytes .../template/darkfish/images/brick_link.png | Bin 764 -> 0 bytes .../template/darkfish/images/bug.png | Bin 774 -> 0 bytes .../template/darkfish/images/bullet_black.png | Bin 211 -> 0 bytes .../darkfish/images/bullet_toggle_minus.png | Bin 207 -> 0 bytes .../darkfish/images/bullet_toggle_plus.png | Bin 209 -> 0 bytes .../template/darkfish/images/date.png | Bin 626 -> 0 bytes .../template/darkfish/images/find.png | Bin 659 -> 0 bytes .../darkfish/images/loadingAnimation.gif | Bin 5886 -> 0 bytes .../template/darkfish/images/macFFBgHack.png | Bin 207 -> 0 bytes .../template/darkfish/images/package.png | Bin 853 -> 0 bytes .../template/darkfish/images/page_green.png | Bin 621 -> 0 bytes .../darkfish/images/page_white_text.png | Bin 342 -> 0 bytes .../darkfish/images/page_white_width.png | Bin 309 -> 0 bytes .../template/darkfish/images/plugin.png | Bin 591 -> 0 bytes .../template/darkfish/images/ruby.png | Bin 592 -> 0 bytes .../template/darkfish/images/tag_green.png | Bin 613 -> 0 bytes .../template/darkfish/images/wrench.png | Bin 610 -> 0 bytes .../darkfish/images/wrench_orange.png | Bin 584 -> 0 bytes .../template/darkfish/images/zoom.png | Bin 692 -> 0 bytes .../generator/template/darkfish/index.rhtml | 64 - .../template/darkfish/js/darkfish.js | 116 -- .../generator/template/darkfish/js/jquery.js | 32 - .../template/darkfish/js/quicksearch.js | 114 -- .../darkfish/js/thickbox-compressed.js | 10 - .../rdoc/generator/template/darkfish/rdoc.css | 706 -------- Src/StdLib/ruby/1.9.1/rdoc/ghost_method.rb | 8 - Src/StdLib/ruby/1.9.1/rdoc/include.rb | 61 - Src/StdLib/ruby/1.9.1/rdoc/known_classes.rb | 69 - Src/StdLib/ruby/1.9.1/rdoc/markup.rb | 124 -- .../1.9.1/rdoc/markup/attribute_manager.rb | 318 ---- .../ruby/1.9.1/rdoc/markup/blank_line.rb | 19 - Src/StdLib/ruby/1.9.1/rdoc/markup/document.rb | 72 - .../ruby/1.9.1/rdoc/markup/formatter.rb | 143 -- .../1.9.1/rdoc/markup/formatter_test_case.rb | 353 ---- Src/StdLib/ruby/1.9.1/rdoc/markup/heading.rb | 17 - Src/StdLib/ruby/1.9.1/rdoc/markup/inline.rb | 127 -- Src/StdLib/ruby/1.9.1/rdoc/markup/list.rb | 78 - .../ruby/1.9.1/rdoc/markup/list_item.rb | 83 - .../ruby/1.9.1/rdoc/markup/paragraph.rb | 11 - Src/StdLib/ruby/1.9.1/rdoc/markup/parser.rb | 529 ------ .../ruby/1.9.1/rdoc/markup/preprocess.rb | 130 -- Src/StdLib/ruby/1.9.1/rdoc/markup/raw.rb | 65 - Src/StdLib/ruby/1.9.1/rdoc/markup/rule.rb | 17 - Src/StdLib/ruby/1.9.1/rdoc/markup/to_ansi.rb | 72 - Src/StdLib/ruby/1.9.1/rdoc/markup/to_bs.rb | 74 - Src/StdLib/ruby/1.9.1/rdoc/markup/to_html.rb | 344 ---- .../1.9.1/rdoc/markup/to_html_crossref.rb | 148 -- Src/StdLib/ruby/1.9.1/rdoc/markup/to_rdoc.rb | 247 --- Src/StdLib/ruby/1.9.1/rdoc/markup/to_test.rb | 64 - Src/StdLib/ruby/1.9.1/rdoc/markup/verbatim.rb | 42 - Src/StdLib/ruby/1.9.1/rdoc/meta_method.rb | 8 - Src/StdLib/ruby/1.9.1/rdoc/normal_class.rb | 55 - Src/StdLib/ruby/1.9.1/rdoc/normal_module.rb | 64 - Src/StdLib/ruby/1.9.1/rdoc/options.rb | 441 ----- Src/StdLib/ruby/1.9.1/rdoc/parser.rb | 157 -- Src/StdLib/ruby/1.9.1/rdoc/parser/c.rb | 705 -------- Src/StdLib/ruby/1.9.1/rdoc/parser/perl.rb | 165 -- Src/StdLib/ruby/1.9.1/rdoc/parser/ruby.rb | 1599 ----------------- .../ruby/1.9.1/rdoc/parser/ruby_tools.rb | 157 -- Src/StdLib/ruby/1.9.1/rdoc/parser/simple.rb | 44 - Src/StdLib/ruby/1.9.1/rdoc/rdoc.rb | 457 ----- Src/StdLib/ruby/1.9.1/rdoc/require.rb | 32 - Src/StdLib/ruby/1.9.1/rdoc/ri.rb | 18 - Src/StdLib/ruby/1.9.1/rdoc/ri/driver.rb | 1054 ----------- Src/StdLib/ruby/1.9.1/rdoc/ri/formatter.rb | 5 - Src/StdLib/ruby/1.9.1/rdoc/ri/paths.rb | 112 -- Src/StdLib/ruby/1.9.1/rdoc/ri/store.rb | 248 --- Src/StdLib/ruby/1.9.1/rdoc/ruby_lex.rb | 1292 ------------- Src/StdLib/ruby/1.9.1/rdoc/ruby_token.rb | 416 ----- Src/StdLib/ruby/1.9.1/rdoc/single_class.rb | 13 - Src/StdLib/ruby/1.9.1/rdoc/stats.rb | 247 --- Src/StdLib/ruby/1.9.1/rdoc/task.rb | 33 - Src/StdLib/ruby/1.9.1/rdoc/text.rb | 130 -- Src/StdLib/ruby/1.9.1/rdoc/tokenstream.rb | 52 - Src/StdLib/ruby/1.9.1/rdoc/top_level.rb | 248 --- Src/StdLib/ruby/1.9.1/shell.rb | 300 ---- .../ruby/1.9.1/shell/builtin-command.rb | 160 -- .../ruby/1.9.1/shell/command-processor.rb | 593 ------ Src/StdLib/ruby/1.9.1/shell/error.rb | 25 - Src/StdLib/ruby/1.9.1/shell/filter.rb | 109 -- .../ruby/1.9.1/shell/process-controller.rb | 319 ---- Src/StdLib/ruby/1.9.1/shell/system-command.rb | 159 -- Src/StdLib/ruby/1.9.1/shell/version.rb | 15 - Src/StdLib/ruby/1.9.1/syck.rb | 447 ----- Src/StdLib/ruby/1.9.1/syck/baseemitter.rb | 242 --- Src/StdLib/ruby/1.9.1/syck/basenode.rb | 223 --- Src/StdLib/ruby/1.9.1/syck/constants.rb | 45 - Src/StdLib/ruby/1.9.1/syck/encoding.rb | 35 - Src/StdLib/ruby/1.9.1/syck/error.rb | 34 - Src/StdLib/ruby/1.9.1/syck/loader.rb | 14 - Src/StdLib/ruby/1.9.1/syck/rubytypes.rb | 464 ----- Src/StdLib/ruby/1.9.1/syck/stream.rb | 41 - Src/StdLib/ruby/1.9.1/syck/stringio.rb | 85 - Src/StdLib/ruby/1.9.1/syck/syck.rb | 16 - Src/StdLib/ruby/1.9.1/syck/tag.rb | 95 - Src/StdLib/ruby/1.9.1/syck/types.rb | 192 -- Src/StdLib/ruby/1.9.1/syck/yamlnode.rb | 54 - Src/StdLib/ruby/1.9.1/syck/ypath.rb | 54 - Src/StdLib/ruby/1.9.1/sync.rb | 307 ---- Src/StdLib/ruby/1.9.1/thwait.rb | 143 -- Src/StdLib/ruby/1.9.1/ubygems.rb | 10 - Src/StdLib/ruby/1.9.1/xmlrpc/base64.rb | 81 - Src/StdLib/ruby/1.9.1/xmlrpc/client.rb | 625 ------- Src/StdLib/ruby/1.9.1/xmlrpc/config.rb | 40 - Src/StdLib/ruby/1.9.1/xmlrpc/create.rb | 283 --- Src/StdLib/ruby/1.9.1/xmlrpc/datetime.rb | 142 -- Src/StdLib/ruby/1.9.1/xmlrpc/httpserver.rb | 178 -- Src/StdLib/ruby/1.9.1/xmlrpc/marshal.rb | 76 - Src/StdLib/ruby/1.9.1/xmlrpc/parser.rb | 813 --------- Src/StdLib/ruby/1.9.1/xmlrpc/server.rb | 778 -------- Src/StdLib/ruby/1.9.1/xmlrpc/utils.rb | 165 -- Src/StdLib/ruby/1.9.1/yaml/syck.rb | 14 - Util/NuGet/nuget.exe | Bin 1655808 -> 0 bytes 154 files changed, 22 insertions(+), 25357 deletions(-) delete mode 100644 Build/CustomTasks/CustomTasks.dll delete mode 100644 Src/Scripts/Rewriter/Assemblies.txt delete mode 100644 Src/Scripts/Rewriter/RewriteAll.cmd delete mode 100644 Src/Scripts/Rewriter/corapi.dll delete mode 100644 Src/Scripts/Rewriter/raw.dll delete mode 100644 Src/Scripts/Rewriter/rewrite.rb delete mode 100644 Src/StdLib/ruby/1.9.1/dl.rb delete mode 100644 Src/StdLib/ruby/1.9.1/dl/callback.rb delete mode 100644 Src/StdLib/ruby/1.9.1/dl/cparser.rb delete mode 100644 Src/StdLib/ruby/1.9.1/dl/func.rb delete mode 100644 Src/StdLib/ruby/1.9.1/dl/import.rb delete mode 100644 Src/StdLib/ruby/1.9.1/dl/pack.rb delete mode 100644 Src/StdLib/ruby/1.9.1/dl/stack.rb delete mode 100644 Src/StdLib/ruby/1.9.1/dl/struct.rb delete mode 100644 Src/StdLib/ruby/1.9.1/dl/types.rb delete mode 100644 Src/StdLib/ruby/1.9.1/dl/value.rb delete mode 100644 Src/StdLib/ruby/1.9.1/e2mmap.rb delete mode 100644 Src/StdLib/ruby/1.9.1/gserver.rb delete mode 100644 Src/StdLib/ruby/1.9.1/net/telnet.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/alias.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/anon_class.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/any_method.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/attr.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/class_module.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/code_object.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/code_objects.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/constant.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/context.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/generator.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/generator/darkfish.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/generator/markup.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/generator/ri.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/classpage.rhtml delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/filepage.rhtml delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/images/brick.png delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/images/brick_link.png delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/images/bug.png delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/images/bullet_black.png delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/images/bullet_toggle_minus.png delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/images/bullet_toggle_plus.png delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/images/date.png delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/images/find.png delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/images/loadingAnimation.gif delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/images/macFFBgHack.png delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/images/package.png delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/images/page_green.png delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/images/page_white_text.png delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/images/page_white_width.png delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/images/plugin.png delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/images/ruby.png delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/images/tag_green.png delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/images/wrench.png delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/images/wrench_orange.png delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/images/zoom.png delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/index.rhtml delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/js/darkfish.js delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/js/jquery.js delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/js/quicksearch.js delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/js/thickbox-compressed.js delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/rdoc.css delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/ghost_method.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/include.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/known_classes.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/markup.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/markup/attribute_manager.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/markup/blank_line.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/markup/document.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/markup/formatter.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/markup/formatter_test_case.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/markup/heading.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/markup/inline.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/markup/list.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/markup/list_item.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/markup/paragraph.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/markup/parser.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/markup/preprocess.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/markup/raw.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/markup/rule.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/markup/to_ansi.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/markup/to_bs.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/markup/to_html.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/markup/to_html_crossref.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/markup/to_rdoc.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/markup/to_test.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/markup/verbatim.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/meta_method.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/normal_class.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/normal_module.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/options.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/parser.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/parser/c.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/parser/perl.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/parser/ruby.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/parser/ruby_tools.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/parser/simple.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/rdoc.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/require.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/ri.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/ri/driver.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/ri/formatter.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/ri/paths.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/ri/store.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/ruby_lex.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/ruby_token.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/single_class.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/stats.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/task.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/text.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/tokenstream.rb delete mode 100644 Src/StdLib/ruby/1.9.1/rdoc/top_level.rb delete mode 100644 Src/StdLib/ruby/1.9.1/shell.rb delete mode 100644 Src/StdLib/ruby/1.9.1/shell/builtin-command.rb delete mode 100644 Src/StdLib/ruby/1.9.1/shell/command-processor.rb delete mode 100644 Src/StdLib/ruby/1.9.1/shell/error.rb delete mode 100644 Src/StdLib/ruby/1.9.1/shell/filter.rb delete mode 100644 Src/StdLib/ruby/1.9.1/shell/process-controller.rb delete mode 100644 Src/StdLib/ruby/1.9.1/shell/system-command.rb delete mode 100644 Src/StdLib/ruby/1.9.1/shell/version.rb delete mode 100644 Src/StdLib/ruby/1.9.1/syck.rb delete mode 100644 Src/StdLib/ruby/1.9.1/syck/baseemitter.rb delete mode 100644 Src/StdLib/ruby/1.9.1/syck/basenode.rb delete mode 100644 Src/StdLib/ruby/1.9.1/syck/constants.rb delete mode 100644 Src/StdLib/ruby/1.9.1/syck/encoding.rb delete mode 100644 Src/StdLib/ruby/1.9.1/syck/error.rb delete mode 100644 Src/StdLib/ruby/1.9.1/syck/loader.rb delete mode 100644 Src/StdLib/ruby/1.9.1/syck/rubytypes.rb delete mode 100644 Src/StdLib/ruby/1.9.1/syck/stream.rb delete mode 100644 Src/StdLib/ruby/1.9.1/syck/stringio.rb delete mode 100644 Src/StdLib/ruby/1.9.1/syck/syck.rb delete mode 100644 Src/StdLib/ruby/1.9.1/syck/tag.rb delete mode 100644 Src/StdLib/ruby/1.9.1/syck/types.rb delete mode 100644 Src/StdLib/ruby/1.9.1/syck/yamlnode.rb delete mode 100644 Src/StdLib/ruby/1.9.1/syck/ypath.rb delete mode 100644 Src/StdLib/ruby/1.9.1/sync.rb delete mode 100644 Src/StdLib/ruby/1.9.1/thwait.rb delete mode 100644 Src/StdLib/ruby/1.9.1/ubygems.rb delete mode 100644 Src/StdLib/ruby/1.9.1/xmlrpc/base64.rb delete mode 100644 Src/StdLib/ruby/1.9.1/xmlrpc/client.rb delete mode 100644 Src/StdLib/ruby/1.9.1/xmlrpc/config.rb delete mode 100644 Src/StdLib/ruby/1.9.1/xmlrpc/create.rb delete mode 100644 Src/StdLib/ruby/1.9.1/xmlrpc/datetime.rb delete mode 100644 Src/StdLib/ruby/1.9.1/xmlrpc/httpserver.rb delete mode 100644 Src/StdLib/ruby/1.9.1/xmlrpc/marshal.rb delete mode 100644 Src/StdLib/ruby/1.9.1/xmlrpc/parser.rb delete mode 100644 Src/StdLib/ruby/1.9.1/xmlrpc/server.rb delete mode 100644 Src/StdLib/ruby/1.9.1/xmlrpc/utils.rb delete mode 100644 Src/StdLib/ruby/1.9.1/yaml/syck.rb delete mode 100644 Util/NuGet/nuget.exe diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 25919472a..25e1752e0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,6 +18,10 @@ env: # the vendored Ruby half of prism in Src/StdLib belongs to; release.yml builds from the same # one. Move both together with Src/Prism/Generated when following prism. PRISM_REF: cd76b0d130a6f0311d168a69618197f15a912c69 + # The DLR revision Build/dlr-patches applies to; release.yml builds from the same one, so a + # release can be rebuilt and an upstream change only arrives when this is moved on purpose. + # Move both together, after checking the patches still apply. + DLR_REF: 922753f8ccbf5186c15899116d5a407b6b1723fb jobs: build-and-test: @@ -71,6 +75,7 @@ jobs: uses: actions/checkout@v7 with: repository: IronLanguages/dlr + ref: ${{ env.DLR_REF }} path: dlr # Pinned to the revision Src/Prism/Generated was generated from (Src/Prism/README.md), as @@ -373,6 +378,7 @@ jobs: - uses: actions/checkout@v7 with: repository: IronLanguages/dlr + ref: ${{ env.DLR_REF }} path: dlr - uses: actions/checkout@v7 with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 350d16298..0e2c357b9 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -32,6 +32,10 @@ env: # The prism revision Src/Prism/Generated was generated from (Src/Prism/README.md), the one # the vendored Ruby half of prism in Src/StdLib belongs to; ci.yml builds from the same one. PRISM_REF: cd76b0d130a6f0311d168a69618197f15a912c69 + # The DLR revision Build/dlr-patches applies to; ci.yml builds from the same one, so a + # release can be rebuilt and an upstream change only arrives when this is moved on purpose. + # Move both together, after checking the patches still apply. + DLR_REF: 922753f8ccbf5186c15899116d5a407b6b1723fb jobs: package: @@ -63,6 +67,7 @@ jobs: - uses: actions/checkout@v7 with: repository: IronLanguages/dlr + ref: ${{ env.DLR_REF }} path: dlr - uses: actions/checkout@v7 @@ -159,7 +164,7 @@ jobs: steps: - uses: actions/checkout@v7 - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v6 with: node-version: 22 diff --git a/Build/CustomTasks/CustomTasks.dll b/Build/CustomTasks/CustomTasks.dll deleted file mode 100644 index 6a38eb0fe536b0c4bc4d3fa5786ffebdf44b094d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6144 zcmeHLU2GKB6+U-ny%pEdyR(^{ z1-nsF`=OvnNTE`rqN=JOYSlJv8dM<_MYN$(6e&nit4NKav}$P8hgN+^ANtUyQs{Ti z%}989j& z3oB_JaVJ?w6I}_$F|8icL~E<$E(C)pR^uK6KTyL{p1I(Gzp)Mgo78qkeyFEYZpqET zEVZQ}@I;$&)*NY6pK?vxfuqzq4I{_eh_mKM6Ajc*5ifCHad2%K)zJ^zh^`}u67AhX zOOGPlIUe7nJp+uyyC~Y(rs>Zz>8#jM9_+x-&ZKJh$75xNb|$dv^a$dEG?Aty;TP4C zV9_Kx6Hj8fMCpFXxkXFXLDfl>oPJEWg)y1jkrQJ=I}^#d7dheFL`mG$cpRA9B2Gzk6D6(bqWaEiN!6N=0DY*h&B>%%lW#}PuqGx|yWdA- z3++s*c7M*OE3`9_IbFh>&@c2ciB%YNP-r~a2#9OR`=IFPj&5@ipy(u^TqEMz`j)z; zy6w$PbuOA--WGnpqcFhwll-dI6&3$%`YhoBl@VL zm!BsLCv-y|Lkyu!IN6SZ#ny%^Z&^q!dVW-S40E0n%j|KE@?aU&rxJ8oThWh%D7_FcM>${@1GWTPJ-r&R z7htQWYXSR~YQawbi-5hNHi5ktuU|uv&Cee^;HL_x0akHk;_PWY9x&9@!Zmqh4SNZ-74o zTd-czqVE@+7R(A-^f)}1L|zuWBzRfy`(nKz@>>$~cOw5uWTiNlA=oOI7VHi0^+UC?=5;b|rGp&QtNUJ!MP>}z~^L|at& z9wGRo#y*zTjdjiu6t0XBtV)*niHuS`jqpk^p^2HTotyZ7K$t(>5Ah~FubvU$nEHNr$YQ>y(_6UTUCh*|Vvm zo@HB}WtLLBkN;~kaax))y(vE{l|qrV{VsNQ)``HH3A0qTJ<$c?@Pe5uqlQ$@b6ncv z2ikjTYHA>xJB8Q7h-KQdw1*?C*7`A4>4Rz{YmjEJbimBcn(nH}jNtpQdB$;1(J0Sm z)HCxkqe^o|EZdZNS15Qc<7KZ{_Nw+8%GSeK4(yq(-+>y+RvwjEEc%hFWKV65RkPX? zW>{?tJJ-qT~_;v>a*$t){UT=$`wGwW>SukC!(Am)BC#GP5 zPnb`aEw|S0Pb2gn!f;vh-1af&42_n?%C1HLDL9x`$C87d>AEzyeb zaF7`*7@riZL*NFoIx>=TS|Tx~s&$9;@5k6XYjmJ7=o#vvK2+;}y6F%;-H6Atn8&9N zRp)`6`Pom1y+g8bCS|vMO}p~JvGm1P{vJ8~{+kymc4gnxmz#bS@6!!RL=2?>v^h}+ zX>$TP4X4tg2|Ws$gi8|E<^uXqxg4W{=w)h!gy)5svuZCH}r4ziF0M#^A{j9vE7sXFvY$ z;E6P0`poJ^5A7bKlcfdE{IPL z=IwuWVRJ$cXgexWRsSK`o^leWhBc4sf1IH<|r+`F6?t4kHe~9?ICPJ=~d +$ for p in Build/dlr-patches/*.patch; do git -C ../dlr apply "$PWD/$p"; done $ git clone https://github.com/ruby/prism ../prism $ (cd ../prism && ruby templates/template.rb && make shared) # libprism.so $ (cd Src/Prism && ruby generate.rb) # C# nodes + loader diff --git a/Src/Libraries/IronRuby.Libraries.csproj b/Src/Libraries/IronRuby.Libraries.csproj index 3081c6003..f9ffbbbfd 100644 --- a/Src/Libraries/IronRuby.Libraries.csproj +++ b/Src/Libraries/IronRuby.Libraries.csproj @@ -17,9 +17,10 @@ - - + + CR - self.write(string.gsub(/\n/n, CR)) - elsif @telnet_option["SGA"] - # IAC WILL SGA send EOL --> CR+NULL - self.write(string.gsub(/\n/n, CR + NULL)) - else - # NONE send EOL --> CR+LF - self.write(string.gsub(/\n/n, EOL)) - end - end - end - - # Sends a string to the host. - # - # Same as #print(), but appends a newline to the string. - def puts(string) - self.print(string + "\n") - end - - # Send a command to the host. - # - # More exactly, sends a string to the host, and reads in all received - # data until is sees the prompt or other matched sequence. - # - # If a block is given, the received data will be yielded to it as - # it is read in. Whether a block is given or not, the received data - # will be return as a string. Note that the received data includes - # the prompt and in most cases the host's echo of our command. - # - # +options+ is either a String, specified the string or command to - # send to the host; or it is a hash of options. If a hash, the - # following options can be specified: - # - # String:: the command or other string to send to the host. - # Match:: a regular expression, the sequence to look for in - # the received data before returning. If not specified, - # the Prompt option value specified when this instance - # was created will be used, or, failing that, the default - # prompt of /[$%#>] \z/n. - # Timeout:: the seconds to wait for data from the host before raising - # a Timeout error. If not specified, the Timeout option - # value specified when this instance was created will be - # used, or, failing that, the default value of 10 seconds. - # - # The command or other string will have the newline sequence appended - # to it. - def cmd(options) # :yield: recvdata - match = @options["Prompt"] - time_out = @options["Timeout"] - fail_eof = @options["FailEOF"] - - if options.kind_of?(Hash) - string = options["String"] - match = options["Match"] if options.has_key?("Match") - time_out = options["Timeout"] if options.has_key?("Timeout") - fail_eof = options["FailEOF"] if options.has_key?("FailEOF") - else - string = options - end - - self.puts(string) - if block_given? - waitfor({"Prompt" => match, "Timeout" => time_out, "FailEOF" => fail_eof}){|c| yield c } - else - waitfor({"Prompt" => match, "Timeout" => time_out, "FailEOF" => fail_eof}) - end - end - - # Login to the host with a given username and password. - # - # The username and password can either be provided as two string - # arguments in that order, or as a hash with keys "Name" and - # "Password". - # - # This method looks for the strings "login" and "Password" from the - # host to determine when to send the username and password. If the - # login sequence does not follow this pattern (for instance, you - # are connecting to a service other than telnet), you will need - # to handle login yourself. - # - # The password can be omitted, either by only - # provided one String argument, which will be used as the username, - # or by providing a has that has no "Password" key. In this case, - # the method will not look for the "Password:" prompt; if it is - # sent, it will have to be dealt with by later calls. - # - # The method returns all data received during the login process from - # the host, including the echoed username but not the password (which - # the host should not echo). If a block is passed in, this received - # data is also yielded to the block as it is received. - def login(options, password = nil) # :yield: recvdata - login_prompt = /[Ll]ogin[: ]*\z/n - password_prompt = /[Pp]ass(?:word|phrase)[: ]*\z/n - if options.kind_of?(Hash) - username = options["Name"] - password = options["Password"] - login_prompt = options["LoginPrompt"] if options["LoginPrompt"] - password_prompt = options["PasswordPrompt"] if options["PasswordPrompt"] - else - username = options - end - - if block_given? - line = waitfor(login_prompt){|c| yield c } - if password - line += cmd({"String" => username, - "Match" => password_prompt}){|c| yield c } - line += cmd(password){|c| yield c } - else - line += cmd(username){|c| yield c } - end - else - line = waitfor(login_prompt) - if password - line += cmd({"String" => username, - "Match" => password_prompt}) - line += cmd(password) - else - line += cmd(username) - end - end - line - end - - end # class Telnet -end # module Net - diff --git a/Src/StdLib/ruby/1.9.1/rdoc.rb b/Src/StdLib/ruby/1.9.1/rdoc.rb deleted file mode 100644 index 938fb4129..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc.rb +++ /dev/null @@ -1,421 +0,0 @@ -$DEBUG_RDOC = nil - -# :main: README.txt - -## -# = \RDoc - Ruby Documentation System -# -# This package contains RDoc and RDoc::Markup. RDoc is an application that -# produces documentation for one or more Ruby source files. It works similarly -# to JavaDoc, parsing the source, and extracting the definition for classes, -# modules, and methods (along with includes and requires). It associates with -# these optional documentation contained in the immediately preceding comment -# block, and then renders the result using a pluggable output formatter. -# RDoc::Markup is a library that converts plain text into various output -# formats. The markup library is used to interpret the comment blocks that -# RDoc uses to document methods, classes, and so on. -# -# == Roadmap -# -# * If you want to use RDoc to create documentation for your Ruby source files, -# read on. -# * If you want to generate documentation for extensions written in C, see -# RDoc::Parser::C -# * If you want to drive RDoc programmatically, see RDoc::RDoc. -# * If you want to use the library to format text blocks into HTML, have a look -# at RDoc::Markup. -# * If you want to try writing your own HTML output template, see -# RDoc::Generator::HTML -# -# == Summary -# -# Once installed, you can create documentation using the +rdoc+ command -# -# % rdoc [options] [names...] -# -# For an up-to-date option summary, type -# -# % rdoc --help -# -# A typical use might be to generate documentation for a package of Ruby -# source (such as RDoc itself). -# -# % rdoc -# -# This command generates documentation for all the Ruby and C source -# files in and below the current directory. These will be stored in a -# documentation tree starting in the subdirectory +doc+. -# -# You can make this slightly more useful for your readers by having the -# index page contain the documentation for the primary file. In our -# case, we could type -# -# % rdoc --main rdoc.rb -# -# You'll find information on the various formatting tricks you can use -# in comment blocks in the documentation this generates. -# -# RDoc uses file extensions to determine how to process each file. File names -# ending +.rb+ and +.rbw+ are assumed to be Ruby source. Files -# ending +.c+ are parsed as C files. All other files are assumed to -# contain just Markup-style markup (with or without leading '#' comment -# markers). If directory names are passed to RDoc, they are scanned -# recursively for C and Ruby source files only. -# -# == \Options -# -# rdoc can be passed a variety of command-line options. In addition, -# options can be specified via the +RDOCOPT+ environment variable, which -# functions similarly to the +RUBYOPT+ environment variable. -# -# % export RDOCOPT="-S" -# -# will make rdoc default to inline method source code. Command-line options -# always will override those in +RDOCOPT+. -# -# Run: -# -# rdoc --help -# -# for full details on rdoc's options. -# -# == Documenting Source Code -# -# Comment blocks can be written fairly naturally, either using # on -# successive lines of the comment, or by including the comment in -# a =begin/=end block. If you use the latter form, the =begin line must be -# flagged with an RDoc tag: -# -# =begin rdoc -# Documentation to be processed by RDoc. -# -# ... -# =end -# -# RDoc stops processing comments if it finds a comment line containing -# a --. This can be used to separate external from internal -# comments, or to stop a comment being associated with a method, class, or -# module. Commenting can be turned back on with a line that starts with a -# ++. -# -# ## -# # Extract the age and calculate the date-of-birth. -# #-- -# # FIXME: fails if the birthday falls on February 29th -# #++ -# # The DOB is returned as a Time object. -# -# def get_dob(person) -# # ... -# end -# -# Names of classes, files, and any method names containing an -# underscore or preceded by a hash character are automatically hyperlinked -# from comment text to their description. -# -# Method parameter lists are extracted and displayed with the method -# description. If a method calls +yield+, then the parameters passed to yield -# will also be displayed: -# -# def fred -# ... -# yield line, address -# -# This will get documented as: -# -# fred() { |line, address| ... } -# -# You can override this using a comment containing ':yields: ...' immediately -# after the method definition -# -# def fred # :yields: index, position -# # ... -# -# yield line, address -# -# which will get documented as -# -# fred() { |index, position| ... } -# -# +:yields:+ is an example of a documentation directive. These appear -# immediately after the start of the document element they are modifying. -# -# RDoc automatically cross-references words with underscores or camel-case. -# To suppress cross-references, prefix the word with a \\ character. To -# include special characters like "\\n", you'll need to use two \\ -# characters like "\\\\\\n". -# -# == \Markup -# -# * The markup engine looks for a document's natural left margin. This is -# used as the initial margin for the document. -# -# * Consecutive lines starting at this margin are considered to be a -# paragraph. -# -# * If a paragraph starts with a "*", "-", or with ".", then it is -# taken to be the start of a list. The margin in increased to be the first -# non-space following the list start flag. Subsequent lines should be -# indented to this new margin until the list ends. For example: -# -# * this is a list with three paragraphs in -# the first item. This is the first paragraph. -# -# And this is the second paragraph. -# -# 1. This is an indented, numbered list. -# 2. This is the second item in that list -# -# This is the third conventional paragraph in the -# first list item. -# -# * This is the second item in the original list -# -# * You can also construct labeled lists, sometimes called description -# or definition lists. Do this by putting the label in square brackets -# and indenting the list body: -# -# [cat] a small furry mammal -# that seems to sleep a lot -# -# [ant] a little insect that is known -# to enjoy picnics -# -# A minor variation on labeled lists uses two colons to separate the -# label from the list body: -# -# cat:: a small furry mammal -# that seems to sleep a lot -# -# ant:: a little insect that is known -# to enjoy picnics -# -# This latter style guarantees that the list bodies' left margins are -# aligned: think of them as a two column table. -# -# * Any line that starts to the right of the current margin is treated -# as verbatim text. This is useful for code listings. The example of a -# list above is also verbatim text. -# -# * A line starting with an equals sign (=) is treated as a -# heading. Level one headings have one equals sign, level two headings -# have two,and so on. -# -# * A line starting with three or more hyphens (at the current indent) -# generates a horizontal rule. The more hyphens, the thicker the rule -# (within reason, and if supported by the output device) -# -# * You can use markup within text (except verbatim) to change the -# appearance of parts of that text. Out of the box, RDoc::Markup -# supports word-based and general markup. -# -# Word-based markup uses flag characters around individual words: -# -# [\*word*] displays word in a *bold* font -# [\_word_] displays word in an _emphasized_ font -# [\+word+] displays word in a +code+ font -# -# General markup affects text between a start delimiter and and end -# delimiter. Not surprisingly, these delimiters look like HTML markup. -# -# [\text...] displays word in a *bold* font -# [\text...] displays word in an _emphasized_ font -# [\text...] displays word in an italicized font -# [\text...\] displays word in a +code+ font -# -# Unlike conventional Wiki markup, general markup can cross line -# boundaries. You can turn off the interpretation of markup by -# preceding the first character with a backslash. This only works for -# simple markup, not HTML-style markup. -# -# * Hyperlinks to the web starting http:, mailto:, ftp:, or www. are -# recognized. An HTTP url that references an external image file is -# converted into an inline \. Hyperlinks starting 'link:' are -# assumed to refer to local files whose path is relative to the --op -# directory. -# -# Hyperlinks can also be of the form label[url], in which -# case the label is used in the displayed text, and +url+ is -# used as the target. If +label+ contains multiple words, -# put it in braces: {multi word label}[url]. -# -# Example hyperlinks: -# -# link:RDoc.html -# http://rdoc.rubyforge.org -# mailto:user@example.com -# {RDoc Documentation}[http://rdoc.rubyforge.org] -# {RDoc Markup}[link:RDoc/Markup.html] -# -# == Directives -# -# [+:nodoc:+ / +:nodoc:+ all] -# This directive prevents documentation for the element from -# being generated. For classes and modules, the methods, aliases, -# constants, and attributes directly within the affected class or -# module also will be omitted. By default, though, modules and -# classes within that class of module _will_ be documented. This is -# turned off by adding the +all+ modifier. -# -# module MyModule # :nodoc: -# class Input -# end -# end -# -# module OtherModule # :nodoc: all -# class Output -# end -# end -# -# In the above code, only class MyModule::Input will be documented. -# The +:nodoc:+ directive is global across all files for the class or module -# to which it applies, so use +:stopdoc:+/+:startdoc:+ to suppress -# documentation only for a particular set of methods, etc. -# -# [+:doc:+] -# Forces a method or attribute to be documented even if it wouldn't be -# otherwise. Useful if, for example, you want to include documentation of a -# particular private method. -# -# [+:notnew:+] -# Only applicable to the +initialize+ instance method. Normally RDoc -# assumes that the documentation and parameters for +initialize+ are -# actually for the +new+ method, and so fakes out a +new+ for the class. -# The +:notnew:+ modifier stops this. Remember that +initialize+ is private, -# so you won't see the documentation unless you use the +-a+ command line -# option. -# -# Comment blocks can contain other directives: -# -# [:section: title] -# Starts a new section in the output. The title following +:section:+ is -# used as the section heading, and the remainder of the comment containing -# the section is used as introductory text. Subsequent methods, aliases, -# attributes, and classes will be documented in this section. A :section: -# comment block may have one or more lines before the :section: directive. -# These will be removed, and any identical lines at the end of the block are -# also removed. This allows you to add visual cues such as: -# -# # ---------------------------------------- -# # :section: My Section -# # This is the section that I wrote. -# # See it glisten in the noon-day sun. -# # ---------------------------------------- -# -# [+:call-seq:+] -# Lines up to the next blank line in the comment are treated as the method's -# calling sequence, overriding the default parsing of method parameters and -# yield arguments. -# -# [+:include:+ _filename_] -# \Include the contents of the named file at this point. The file will be -# searched for in the directories listed by the +--include+ option, or in -# the current directory by default. The contents of the file will be -# shifted to have the same indentation as the ':' at the start of -# the :include: directive. -# -# [+:title:+ _text_] -# Sets the title for the document. Equivalent to the --title -# command line parameter. (The command line parameter overrides any :title: -# directive in the source). -# -# [+:enddoc:+] -# Document nothing further at the current level. -# -# [+:main:+ _name_] -# Equivalent to the --main command line parameter. -# -# [+:stopdoc:+ / +:startdoc:+] -# Stop and start adding new documentation elements to the current container. -# For example, if a class has a number of constants that you don't want to -# document, put a +:stopdoc:+ before the first, and a +:startdoc:+ after the -# last. If you don't specify a +:startdoc:+ by the end of the container, -# disables documentation for the entire class or module. -# -# Further directives can be found in RDoc::Parser::Ruby and RDoc::Parser::C -# -# == Other stuff -# -# RDoc is currently being maintained by Eric Hodel -# -# Dave Thomas is the original author of RDoc. -# -# == Credits -# -# * The Ruby parser in rdoc/parse.rb is based heavily on the outstanding -# work of Keiju ISHITSUKA of Nippon Rational Inc, who produced the Ruby -# parser for irb and the rtags package. -# -# * Charset patch from MoonWolf. -# -# * Rich Kilmer wrote the kilmer.rb output template. -# -# * Dan Brickley led the design of the RDF format. -# -# == License -# -# RDoc is Copyright (c) 2001-2003 Dave Thomas, The Pragmatic Programmers. It -# is free software, and may be redistributed under the terms specified -# in the README file of the Ruby distribution. -# -# == Warranty -# -# This software is provided "as is" and without any express or implied -# warranties, including, without limitation, the implied warranties of -# merchantibility and fitness for a particular purpose. - -module RDoc - - ## - # Exception thrown by any rdoc error. - - class Error < RuntimeError; end - - def self.const_missing const_name # :nodoc: - if const_name.to_s == 'RDocError' then - warn "RDoc::RDocError is deprecated" - return Error - end - - super - end - - ## - # RDoc version you are using - - VERSION = '2.5.8' - - ## - # Name of the dotfile that contains the description of files to be processed - # in the current directory - - DOT_DOC_FILENAME = ".document" - - ## - # General RDoc modifiers - - GENERAL_MODIFIERS = %w[nodoc].freeze - - ## - # RDoc modifiers for classes - - CLASS_MODIFIERS = GENERAL_MODIFIERS - - ## - # RDoc modifiers for attributes - - ATTR_MODIFIERS = GENERAL_MODIFIERS - - ## - # RDoc modifiers for constants - - CONSTANT_MODIFIERS = GENERAL_MODIFIERS - - ## - # RDoc modifiers for methods - - METHOD_MODIFIERS = GENERAL_MODIFIERS + - %w[arg args yield yields notnew not-new not_new doc] - -end - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/alias.rb b/Src/StdLib/ruby/1.9.1/rdoc/alias.rb deleted file mode 100644 index 6f4bfc1b5..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/alias.rb +++ /dev/null @@ -1,54 +0,0 @@ -require 'rdoc/code_object' - -## -# Represent an alias, which is an old_name/new_name pair associated with a -# particular context - -class RDoc::Alias < RDoc::CodeObject - - ## - # Allow comments to be overridden - - attr_writer :comment - - ## - # Aliased name - - attr_accessor :new_name - - ## - # Aliasee's name - - attr_accessor :old_name - - ## - # Source file token stream - - attr_accessor :text - - ## - # Creates a new Alias with a token stream of +text+ that aliases +old_name+ - # to +new_name+ and has +comment+ - - def initialize(text, old_name, new_name, comment) - super() - @text = text - @old_name = old_name - @new_name = new_name - self.comment = comment - end - - def inspect # :nodoc: - parent_name = parent ? parent.name : '(unknown)' - "#<%s:0x%x %s.alias_method %s, %s>" % [ - self.class, object_id, - parent_name, @old_name, @new_name, - ] - end - - def to_s # :nodoc: - "alias: #{self.old_name} -> #{self.new_name}\n#{self.comment}" - end - -end - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/anon_class.rb b/Src/StdLib/ruby/1.9.1/rdoc/anon_class.rb deleted file mode 100644 index a6d64c44b..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/anon_class.rb +++ /dev/null @@ -1,10 +0,0 @@ -require 'rdoc/class_module' - -## -# An anonymous class like: -# -# c = Class.new do end - -class RDoc::AnonClass < RDoc::ClassModule -end - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/any_method.rb b/Src/StdLib/ruby/1.9.1/rdoc/any_method.rb deleted file mode 100644 index f7df6cfda..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/any_method.rb +++ /dev/null @@ -1,290 +0,0 @@ -require 'rdoc/code_object' -require 'rdoc/tokenstream' - -## -# AnyMethod is the base class for objects representing methods - -class RDoc::AnyMethod < RDoc::CodeObject - - MARSHAL_VERSION = 1 # :nodoc: - - include Comparable - - ## - # Method name - - attr_writer :name - - ## - # public, protected, private - - attr_accessor :visibility - - ## - # Parameters yielded by the called block - - attr_accessor :block_params - - ## - # Don't rename \#initialize to \::new - - attr_accessor :dont_rename_initialize - - ## - # Is this a singleton method? - - attr_accessor :singleton - - ## - # Source file token stream - - attr_reader :text - - ## - # Array of other names for this method - - attr_reader :aliases - - ## - # The method we're aliasing - - attr_accessor :is_alias_for - - ## - # Parameters for this method - - attr_accessor :params - - ## - # Different ways to call this method - - attr_accessor :call_seq - - include RDoc::TokenStream - - def initialize(text, name) - super() - - @text = text - @name = name - - @aliases = [] - @block_params = nil - @call_seq = nil - @dont_rename_initialize = false - @is_alias_for = nil - @params = nil - @parent_name = nil - @singleton = nil - @token_stream = nil - @visibility = :public - end - - ## - # Order by #singleton then #name - - def <=>(other) - [@singleton ? 0 : 1, @name] <=> [other.singleton ? 0 : 1, other.name] - end - - ## - # Adds +method+ as an alias for this method - - def add_alias(method) - @aliases << method - end - - ## - # HTML fragment reference for this method - - def aref - type = singleton ? 'c' : 'i' - - "method-#{type}-#{CGI.escape name}" - end - - ## - # The call_seq or the param_seq with method name, if there is no call_seq. - # - # Use this for displaying a method's argument lists. - - def arglists - if @call_seq then - @call_seq - elsif @params then - "#{name}#{param_seq}" - end - end - - ## - # HTML id-friendly method name - - def html_name - @name.gsub(/[^a-z]+/, '-') - end - - def inspect # :nodoc: - alias_for = @is_alias_for ? " (alias for #{@is_alias_for.name})" : nil - "#<%s:0x%x %s (%s)%s>" % [ - self.class, object_id, - full_name, - visibility, - alias_for, - ] - end - - ## - # Full method name including namespace - - def full_name - @full_name ||= "#{@parent ? @parent.full_name : '(unknown)'}#{pretty_name}" - end - - ## - # Dumps this AnyMethod for use by ri. See also #marshal_load - - def marshal_dump - aliases = @aliases.map do |a| - [a.full_name, parse(a.comment)] - end - - [ MARSHAL_VERSION, - @name, - full_name, - @singleton, - @visibility, - parse(@comment), - @call_seq, - @block_params, - aliases, - @params, - ] - end - - ## - # Loads this AnyMethod from +array+. For a loaded AnyMethod the following - # methods will return cached values: - # - # * #full_name - # * #parent_name - - def marshal_load(array) - @dont_rename_initialize = nil - @is_alias_for = nil - @token_stream = nil - @aliases = [] - - @name = array[1] - @full_name = array[2] - @singleton = array[3] - @visibility = array[4] - @comment = array[5] - @call_seq = array[6] - @block_params = array[7] - @params = array[9] - - @parent_name = if @full_name =~ /#/ then - $` - else - name = @full_name.split('::') - name.pop - name.join '::' - end - - array[8].each do |new_name, comment| - add_alias RDoc::Alias.new(nil, @name, new_name, comment) - end - end - - ## - # Method name - - def name - return @name if @name - - @name = @call_seq[/^.*?\.(\w+)/, 1] || @call_seq if @call_seq - end - - ## - # Pretty parameter list for this method - - def param_seq - params = @params.gsub(/\s*\#.*/, '') - params = params.tr("\n", " ").squeeze(" ") - params = "(#{params})" unless params[0] == ?( - - if @block_params then - # If this method has explicit block parameters, remove any explicit - # &block - params.sub!(/,?\s*&\w+/, '') - - block = @block_params.gsub(/\s*\#.*/, '') - block = block.tr("\n", " ").squeeze(" ") - if block[0] == ?( - block.sub!(/^\(/, '').sub!(/\)/, '') - end - params << " { |#{block}| ... }" - end - - params - end - - ## - # Name of our parent with special handling for un-marshaled methods - - def parent_name - @parent_name || super - end - - ## - # Path to this method - - def path - "#{@parent.path}##{aref}" - end - - ## - # Method name with class/instance indicator - - def pretty_name - "#{singleton ? '::' : '#'}#{@name}" - end - - def pretty_print q # :nodoc: - alias_for = @is_alias_for ? "alias for #{@is_alias_for.name}" : nil - - q.group 2, "[#{self.class.name} #{full_name} #{visibility}", "]" do - if alias_for then - q.breakable - q.text alias_for - end - - if text then - q.breakable - q.text "text:" - q.breakable - q.pp @text - end - - unless comment.empty? then - q.breakable - q.text "comment:" - q.breakable - q.pp @comment - end - end - end - - def to_s # :nodoc: - "#{self.class.name}: #{full_name} (#{@text})\n#{@comment}" - end - - ## - # Type of method (class or instance) - - def type - singleton ? 'class' : 'instance' - end - -end - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/attr.rb b/Src/StdLib/ruby/1.9.1/rdoc/attr.rb deleted file mode 100644 index 035ab6872..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/attr.rb +++ /dev/null @@ -1,178 +0,0 @@ -require 'rdoc/code_object' - -## -# An attribute created by \#attr, \#attr_reader, \#attr_writer or -# \#attr_accessor - -class RDoc::Attr < RDoc::CodeObject - - MARSHAL_VERSION = 0 # :nodoc: - - ## - # Name of the attribute - - attr_accessor :name - - ## - # Is the attribute readable, writable or both? - - attr_accessor :rw - - ## - # Source file token stream - - attr_accessor :text - - ## - # public, protected, private - - attr_accessor :visibility - - def initialize(text, name, rw, comment) - super() - @text = text - @name = name - @rw = rw - @visibility = :public - self.comment = comment - end - - ## - # Attributes are ordered by name - - def <=>(other) - self.name <=> other.name - end - - ## - # Attributes are equal when their names and rw is identical - - def == other - self.class == other.class and - self.name == other.name and - self.rw == other.rw - end - - ## - # Returns nil, for duck typing with RDoc::AnyMethod - - def arglists - end - - ## - # Returns nil, for duck typing with RDoc::AnyMethod - - def block_params - end - - ## - # Returns nil, for duck typing with RDoc::AnyMethod - - def call_seq - end - - ## - # Partially bogus as Attr has no parent. For duck typing with - # RDoc::AnyMethod. - - def full_name - @full_name ||= "#{@parent ? @parent.full_name : '(unknown)'}##{name}" - end - - ## - # An HTML id-friendly representation of #name - - def html_name - @name.gsub(/[^a-z]+/, '-') - end - - def inspect # :nodoc: - attr = case rw - when 'RW' then :attr_accessor - when 'R' then :attr_reader - when 'W' then :attr_writer - else - " (#{rw})" - end - - "#<%s:0x%x %s.%s :%s>" % [ - self.class, object_id, - parent_name, attr, @name, - ] - end - - ## - # Dumps this Attr for use by ri. See also #marshal_load - - def marshal_dump - [ MARSHAL_VERSION, - @name, - full_name, - @rw, - @visibility, - parse(@comment), - ] - end - - ## - # Loads this AnyMethod from +array+. For a loaded AnyMethod the following - # methods will return cached values: - # - # * #full_name - # * #parent_name - - def marshal_load array - @name = array[1] - @full_name = array[2] - @rw = array[3] - @visibility = array[4] - @comment = array[5] - - @parent_name = @full_name - end - - ## - # Name of our parent with special handling for un-marshaled methods - - def parent_name - @parent_name || super - end - - ## - # For duck typing with RDoc::AnyMethod, returns nil - - def params - nil - end - - ## - # URL path for this attribute - - def path - "#{@parent.path}##{@name}" - end - - ## - # For duck typing with RDoc::AnyMethod - - def singleton - false - end - - def to_s # :nodoc: - "#{type} #{name}\n#{comment}" - end - - ## - # Returns attr_reader, attr_writer or attr_accessor as appropriate - - def type - case @rw - when 'RW' then 'attr_accessor' - when 'R' then 'attr_reader' - when 'W' then 'attr_writer' - end - end - -end - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/class_module.rb b/Src/StdLib/ruby/1.9.1/rdoc/class_module.rb deleted file mode 100644 index ae1cc82fb..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/class_module.rb +++ /dev/null @@ -1,215 +0,0 @@ -require 'rdoc/context' - -## -# ClassModule is the base class for objects representing either a class or a -# module. - -class RDoc::ClassModule < RDoc::Context - - MARSHAL_VERSION = 0 # :nodoc: - - attr_accessor :diagram - - ## - # Creates a new ClassModule with +name+ with optional +superclass+ - - def initialize(name, superclass = 'Object') - @diagram = nil - @full_name = nil - @name = name - @superclass = superclass - super() - end - - ## - # Ancestors list for this ClassModule (abstract) - - def ancestors - raise NotImplementedError - end - - ## - # Appends +comment+ to the current comment, but separated by a rule. Works - # more like +=. - - def comment=(comment) - return if comment.empty? - - comment = "#{@comment}\n---\n#{normalize_comment comment}" unless - @comment.empty? - - super - end - - ## - # Finds a class or module with +name+ in this namespace or its descendents - - def find_class_named(name) - return self if full_name == name - return self if @name == name - - @classes.values.find do |klass| - next if klass == self - klass.find_class_named name - end - end - - ## - # Return the fully qualified name of this class or module - - def full_name - @full_name ||= if RDoc::ClassModule === @parent then - "#{@parent.full_name}::#{@name}" - else - @name - end - end - - ## - # 'module' or 'class' - - def type - module? ? 'module' : 'class' - end - - def marshal_dump # :nodoc: - attrs = attributes.sort.map do |attr| - [attr.name, attr.rw] - end - - method_types = methods_by_type.map do |type, visibilities| - visibilities = visibilities.map do |visibility, methods| - method_names = methods.map do |method| - method.name - end - - [visibility, method_names.uniq] - end - - [type, visibilities] - end - - [ MARSHAL_VERSION, - @name, - full_name, - @superclass, - parse(@comment), - attrs, - constants.map do |const| - [const.name, parse(const.comment)] - end, - includes.map do |incl| - [incl.name, parse(incl.comment)] - end, - method_types, - ] - end - - def marshal_load array # :nodoc: - initialize_methods_etc - @document_self = true - @done_documenting = false - @current_section = nil - - @name = array[1] - @full_name = array[2] - @superclass = array[3] - @comment = array[4] - - array[5].each do |name, rw| - add_attribute RDoc::Attr.new(nil, name, rw, nil) - end - - array[6].each do |name, comment| - add_constant RDoc::Constant.new(name, nil, comment) - end - - array[7].each do |name, comment| - add_include RDoc::Include.new(name, comment) - end - - array[8].each do |type, visibilities| - visibilities.each do |visibility, methods| - @visibility = visibility - - methods.each do |name| - method = RDoc::AnyMethod.new nil, name - method.singleton = true if type == 'class' - add_method method - end - end - end - end - - ## - # Merges +class_module+ into this ClassModule - - def merge class_module - comment = class_module.comment - - if comment then - document = parse @comment - - comment.parts.concat document.parts - - @comment = comment - end - - class_module.each_attribute do |attr| - if match = attributes.find { |a| a.name == attr.name } then - match.rw = [match.rw, attr.rw].compact.join - else - add_attribute attr - end - end - - class_module.each_constant do |const| - add_constant const - end - - class_module.each_include do |incl| - add_include incl - end - - class_module.each_method do |meth| - add_method meth - end - end - - ## - # Does this object represent a module? - - def module? - false - end - - ## - # Path to this class or module - - def path - http_url RDoc::RDoc.current.generator.class_dir - end - - ## - # Get the superclass of this class. Attempts to retrieve the superclass - # object, returns the name if it is not known. - - def superclass - RDoc::TopLevel.find_class_named_from(@superclass, parent) || @superclass - end - - ## - # Set the superclass of this class to +superclass+ - - def superclass=(superclass) - raise NoMethodError, "#{full_name} is a module" if module? - - @superclass = superclass if @superclass.nil? or @superclass == 'Object' - end - - def to_s # :nodoc: - "#{self.class}: #{full_name} #{@comment} #{super}" - end - -end - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/code_object.rb b/Src/StdLib/ruby/1.9.1/rdoc/code_object.rb deleted file mode 100644 index 7a57fd41f..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/code_object.rb +++ /dev/null @@ -1,180 +0,0 @@ -require 'rdoc' -require 'rdoc/text' - -## -# Base class for the RDoc code tree. -# -# We contain the common stuff for contexts (which are containers) and other -# elements (methods, attributes and so on) -# -# Here's the tree of the CodeObject subclasses: -# -# * RDoc::Context -# * RDoc::TopLevel -# * RDoc::ClassModule -# * RDoc::AnonClass -# * RDoc::NormalClass -# * RDoc::NormalModule -# * RDoc::SingleClass -# * RDoc::AnyMethod -# * RDoc::GhostMethod -# * RDoc::MetaMethod -# * RDoc::Alias -# * RDoc::Attr -# * RDoc::Constant -# * RDoc::Require -# * RDoc::Include - -class RDoc::CodeObject - - include RDoc::Text - - ## - # Our comment - - attr_reader :comment - - ## - # Do we document our children? - - attr_reader :document_children - - ## - # Do we document ourselves? - - attr_reader :document_self - - ## - # Are we done documenting (ie, did we come across a :enddoc:)? - - attr_accessor :done_documenting - - ## - # Force documentation of this CodeObject - - attr_accessor :force_documentation - - ## - # Hash of arbitrary metadata for this CodeObject - - attr_reader :metadata - - ## - # Our parent CodeObject - - attr_accessor :parent - - ## - # Which section are we in - - attr_accessor :section - - ## - # We are the model of the code, but we know that at some point we will be - # worked on by viewers. By implementing the Viewable protocol, viewers can - # associated themselves with these objects. - - attr_accessor :viewer - - ## - # Creates a new CodeObject that will document itself and its children - - def initialize - @metadata = {} - @comment = '' - - @document_children = true - @document_self = true - @done_documenting = false - @force_documentation = false - - @parent = nil - end - - ## - # Replaces our comment with +comment+, unless it is empty. - - def comment=(comment) - @comment = case comment - when NilClass then '' - when RDoc::Markup::Document then comment - else - if comment and not comment.empty? then - normalize_comment comment - else - @comment - end - end - end - - ## - # Enables or disables documentation of this CodeObject's children. Calls - # remove_classes_and_modules when disabling. - - def document_children=(document_children) - @document_children = document_children - remove_classes_and_modules unless document_children - end - - ## - # Enables or disables documentation of this CodeObject. Calls - # remove_methods_etc when disabling. - - def document_self=(document_self) - @document_self = document_self - remove_methods_etc unless document_self - end - - ## - # Does this class have a comment with content or is document_self false. - - def documented? - !(@document_self and @comment.empty?) - end - - ## - # File name of our parent - - def parent_file_name - @parent ? @parent.base_name : '(unknown)' - end - - ## - # Name of our parent - - def parent_name - @parent ? @parent.full_name : '(unknown)' - end - - ## - # Callback called upon disabling documentation of children. See - # #document_children= - - def remove_classes_and_modules - end - - ## - # Callback called upon disabling documentation of ourself. See - # #document_self= - - def remove_methods_etc - end - - ## - # Enable capture of documentation - - def start_doc - @document_self = true - @document_children = true - end - - ## - # Disable capture of documentation - - def stop_doc - @document_self = false - @document_children = false - end - -end - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/code_objects.rb b/Src/StdLib/ruby/1.9.1/rdoc/code_objects.rb deleted file mode 100644 index 6dd3b4f79..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/code_objects.rb +++ /dev/null @@ -1,23 +0,0 @@ -# We represent the various high-level code constructs that appear in Ruby -# programs: classes, modules, methods, and so on. - -require 'rdoc/code_object' -require 'rdoc/context' -require 'rdoc/top_level' - -require 'rdoc/class_module' -require 'rdoc/normal_class' -require 'rdoc/normal_module' -require 'rdoc/anon_class' -require 'rdoc/single_class' - -require 'rdoc/any_method' -require 'rdoc/alias' -require 'rdoc/ghost_method' -require 'rdoc/meta_method' - -require 'rdoc/attr' -require 'rdoc/constant' -require 'rdoc/require' -require 'rdoc/include' - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/constant.rb b/Src/StdLib/ruby/1.9.1/rdoc/constant.rb deleted file mode 100644 index 2fb01ceed..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/constant.rb +++ /dev/null @@ -1,58 +0,0 @@ -require 'rdoc/code_object' - -## -# A constant - -class RDoc::Constant < RDoc::CodeObject - - ## - # The constant's name - - attr_accessor :name - - ## - # The constant's value - - attr_accessor :value - - ## - # Creates a new constant with +name+, +value+ and +comment+ - - def initialize(name, value, comment) - super() - @name = name - @value = value - self.comment = comment - end - - ## - # Constants are ordered by name - - def <=> other - return unless self.class === other - - [parent_name, name] <=> [other.parent_name, other.name] - end - - def == other - self.class == other.class and - @parent == other.parent and - @name == other.name - end - - def inspect # :nodoc: - "#<%s:0x%x %s::%s>" % [ - self.class, object_id, - parent_name, @name, - ] - end - - ## - # Path to this constant - - def path - "#{@parent.path}##{@name}" - end - -end - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/context.rb b/Src/StdLib/ruby/1.9.1/rdoc/context.rb deleted file mode 100644 index 4abd5fe62..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/context.rb +++ /dev/null @@ -1,767 +0,0 @@ -require 'rdoc/code_object' - -## -# A Context is something that can hold modules, classes, methods, attributes, -# aliases, requires, and includes. Classes, modules, and files are all -# Contexts. - -class RDoc::Context < RDoc::CodeObject - - include Comparable - - ## - # Types of methods - - TYPES = %w[class instance] - - ## - # Method visibilities - - VISIBILITIES = [:public, :protected, :private] - - ## - # Aliased methods - - attr_reader :aliases - - ## - # attr* methods - - attr_reader :attributes - - ## - # Constants defined - - attr_reader :constants - - ## - # Current section of documentation - - attr_reader :current_section - - ## - # Files this context is found in - - attr_reader :in_files - - ## - # Modules this context includes - - attr_reader :includes - - ## - # Methods defined in this context - - attr_reader :method_list - - ## - # Name of this class excluding namespace. See also full_name - - attr_reader :name - - ## - # Files this context requires - - attr_reader :requires - - ## - # Sections in this context - - attr_reader :sections - - ## - # Aliases that haven't been resolved to a method - - attr_accessor :unmatched_alias_lists - - ## - # Current visibility of this context - - attr_reader :visibility - - ## - # A per-comment section of documentation like: - # - # # :SECTION: The title - # # The body - - class Section - - ## - # Section comment - - attr_reader :comment - - ## - # Context this Section lives in - - attr_reader :parent - - ## - # Section sequence number (for linking) - - attr_reader :sequence - - ## - # Section title - - attr_reader :title - - @@sequence = "SEC00000" - - ## - # Creates a new section with +title+ and +comment+ - - def initialize(parent, title, comment) - @parent = parent - @title = title - - @@sequence.succ! - @sequence = @@sequence.dup - - set_comment comment - end - - ## - # Sections are equal when they have the same #sequence - - def ==(other) - self.class === other and @sequence == other.sequence - end - - def inspect # :nodoc: - "#<%s:0x%x %s %p>" % [ - self.class, object_id, - @sequence, title - ] - end - - ## - # Set the comment for this section from the original comment block If - # the first line contains :section:, strip it and use the rest. - # Otherwise remove lines up to the line containing :section:, and look - # for those lines again at the end and remove them. This lets us write - # - # # blah blah blah - # # - # # :SECTION: The title - # # The body - - def set_comment(comment) - return unless comment - - if comment =~ /^#[ \t]*:section:.*\n/ then - start = $` - rest = $' - - if start.empty? - @comment = rest - else - @comment = rest.sub(/#{start.chomp}\Z/, '') - end - else - @comment = comment - end - - @comment = nil if @comment.empty? - end - - end - - ## - # Creates an unnamed empty context with public visibility - - def initialize - super - - @in_files = [] - - @name ||= "unknown" - @comment ||= "" - @parent = nil - @visibility = :public - - @current_section = Section.new self, nil, nil - @sections = [@current_section] - - initialize_methods_etc - initialize_classes_and_modules - end - - ## - # Sets the defaults for classes and modules - - def initialize_classes_and_modules - @classes = {} - @modules = {} - end - - ## - # Sets the defaults for methods and so-forth - - def initialize_methods_etc - @method_list = [] - @attributes = [] - @aliases = [] - @requires = [] - @includes = [] - @constants = [] - - # This Hash maps a method name to a list of unmatched aliases (aliases of - # a method not yet encountered). - @unmatched_alias_lists = {} - end - - ## - # Contexts are sorted by full_name - - def <=>(other) - full_name <=> other.full_name - end - - ## - # Adds +an_alias+ that is automatically resolved - - def add_alias(an_alias) - meth = find_instance_method_named(an_alias.old_name) - - if meth then - add_alias_impl an_alias, meth - else - add_to @aliases, an_alias - unmatched_alias_list = @unmatched_alias_lists[an_alias.old_name] ||= [] - unmatched_alias_list.push an_alias - end - - an_alias - end - - ## - # Turns +an_alias+ into an AnyMethod that points to +meth+ - - def add_alias_impl(an_alias, meth) - new_meth = RDoc::AnyMethod.new an_alias.text, an_alias.new_name - new_meth.is_alias_for = meth - new_meth.singleton = meth.singleton - new_meth.params = meth.params - - new_meth.comment = an_alias.comment - - meth.add_alias new_meth - - add_method new_meth - - # aliases don't use ongoing visibility - new_meth.visibility = meth.visibility - - new_meth - end - - ## - # Adds +attribute+ - - def add_attribute(attribute) - add_to @attributes, attribute - end - - ## - # Adds a class named +name+ with +superclass+. - # - # Given class Container::Item RDoc assumes +Container+ is a module - # unless it later sees class Container. add_class automatically - # upgrades +name+ to a class in this case. - - def add_class(class_type, name, superclass = 'Object') - klass = add_class_or_module @classes, class_type, name, superclass - - existing = klass.superclass - existing = existing.name if existing and not String === existing - - if superclass != existing and superclass != 'Object' then - klass.superclass = superclass - end - - # If the parser encounters Container::Item before encountering - # Container, then it assumes that Container is a module. This may not - # be the case, so remove Container from the module list if present and - # transfer any contained classes and modules to the new class. - - mod = RDoc::TopLevel.modules_hash.delete klass.full_name - - if mod then - klass.classes_hash.update mod.classes_hash - klass.modules_hash.update mod.modules_hash - klass.method_list.concat mod.method_list - - @modules.delete klass.name - end - - RDoc::TopLevel.classes_hash[klass.full_name] = klass - - klass - end - - ## - # Instantiates a +class_type+ named +name+ and adds it the modules or - # classes Hash +collection+. - - def add_class_or_module(collection, class_type, name, superclass = nil) - full_name = child_name name - - mod = collection[name] - - if mod then - mod.superclass = superclass unless mod.module? - else - all = if class_type == RDoc::NormalModule then - RDoc::TopLevel.modules_hash - else - RDoc::TopLevel.classes_hash - end - - mod = all[full_name] - - unless mod then - mod = class_type.new name, superclass - else - # If the class has been encountered already, check that its - # superclass has been set (it may not have been, depending on the - # context in which it was encountered). - if class_type == RDoc::NormalClass then - mod.superclass = superclass unless mod.superclass - end - end - - unless @done_documenting then - all[full_name] = mod - collection[name] = mod - end - - mod.section = @current_section - mod.parent = self - end - - mod - end - - ## - # Adds +constant+ - - def add_constant(constant) - add_to @constants, constant - end - - ## - # Adds included module +include+ - - def add_include(include) - add_to @includes, include - end - - ## - # Adds +method+ - - def add_method(method) - method.visibility = @visibility - add_to @method_list, method - - unmatched_alias_list = @unmatched_alias_lists[method.name] - if unmatched_alias_list then - unmatched_alias_list.each do |unmatched_alias| - add_alias_impl unmatched_alias, method - @aliases.delete unmatched_alias - end - - @unmatched_alias_lists.delete method.name - end - end - - ## - # Adds a module named +name+. If RDoc already knows +name+ is a class then - # that class is returned instead. See also #add_class - - def add_module(class_type, name) - return @classes[name] if @classes.key? name - - add_class_or_module @modules, class_type, name, nil - end - - ## - # Adds an alias from +from+ to +name+ - - def add_module_alias from, name - to_name = child_name name - - unless @done_documenting then - if from.module? then - RDoc::TopLevel.modules_hash - else - RDoc::TopLevel.classes_hash - end[to_name] = from - - if from.module? then - @modules - else - @classes - end[name] = from - end - - from - end - - ## - # Adds +require+ to this context's top level - - def add_require(require) - if RDoc::TopLevel === self then - add_to @requires, require - else - parent.add_require require - end - end - - ## - # Adds +thing+ to the collection +array+ - - def add_to(array, thing) - array << thing if @document_self and not @done_documenting - thing.parent = self - thing.section = @current_section - end - - ## - # Creates the full name for a child with +name+ - - def child_name name - if RDoc::TopLevel === self then - name - else - "#{self.full_name}::#{name}" - end - end - - ## - # Array of classes in this context - - def classes - @classes.values - end - - ## - # All classes and modules in this namespace - - def classes_and_modules - classes + modules - end - - ## - # Hash of classes keyed by class name - - def classes_hash - @classes - end - - ## - # Is part of this thing was defined in +file+? - - def defined_in?(file) - @in_files.include?(file) - end - - ## - # Iterator for attributes - - def each_attribute # :yields: attribute - @attributes.each { |a| yield a } - end - - ## - # Iterator for classes and modules - - def each_classmodule(&block) # :yields: module - classes_and_modules.sort.each(&block) - end - - ## - # Iterator for constants - - def each_constant # :yields: constant - @constants.each {|c| yield c} - end - - ## - # Iterator for included modules - - def each_include # :yields: include - @includes.each do |i| yield i end - end - - ## - # Iterator for methods - - def each_method # :yields: method - @method_list.sort.each {|m| yield m} - end - - ## - # Finds an attribute with +name+ in this context - - def find_attribute_named(name) - @attributes.find { |m| m.name == name } - end - - ## - # Finds a class method with +name+ in this context - - def find_class_method_named(name) - @method_list.find { |meth| meth.singleton && meth.name == name } - end - - ## - # Finds a constant with +name+ in this context - - def find_constant_named(name) - @constants.find {|m| m.name == name} - end - - ## - # Find a module at a higher scope - - def find_enclosing_module_named(name) - parent && parent.find_module_named(name) - end - - ## - # Finds a file with +name+ in this context - - def find_file_named(name) - top_level.class.find_file_named(name) - end - - ## - # Finds an instance method with +name+ in this context - - def find_instance_method_named(name) - @method_list.find { |meth| !meth.singleton && meth.name == name } - end - - ## - # Finds a method, constant, attribute, module or files named +symbol+ in - # this context - - def find_local_symbol(symbol) - find_method_named(symbol) or - find_constant_named(symbol) or - find_attribute_named(symbol) or - find_module_named(symbol) or - find_file_named(symbol) - end - - ## - # Finds a instance or module method with +name+ in this context - - def find_method_named(name) - case name - when /\A#/ then - find_instance_method_named name[1..-1] - when /\A::/ then - find_class_method_named name[2..-1] - else - @method_list.find { |meth| meth.name == name } - end - end - - ## - # Find a module with +name+ using ruby's scoping rules - - def find_module_named(name) - res = @modules[name] || @classes[name] - return res if res - return self if self.name == name - find_enclosing_module_named name - end - - ## - # Look up +symbol+. If +method+ is non-nil, then we assume the symbol - # references a module that contains that method. - - def find_symbol(symbol, method = nil) - result = nil - - case symbol - when /^::([A-Z].*)/ then - result = top_level.find_symbol($1) - when /::/ then - modules = symbol.split(/::/) - - unless modules.empty? then - module_name = modules.shift - result = find_module_named(module_name) - - if result then - modules.each do |name| - result = result.find_module_named name - break unless result - end - end - end - end - - unless result then - # if a method is specified, then we're definitely looking for - # a module, otherwise it could be any symbol - if method then - result = find_module_named symbol - else - result = find_local_symbol symbol - if result.nil? then - if symbol =~ /^[A-Z]/ then - result = parent - while result && result.name != symbol do - result = result.parent - end - end - end - end - end - - result = result.find_local_symbol method if result and method - - result - end - - ## - # The full name for this context. This method is overridden by subclasses. - - def full_name - '(unknown)' - end - - ## - # URL for this with a +prefix+ - - def http_url(prefix) - path = full_name - path = path.gsub(/<<\s*(\w*)/, 'from-\1') if path =~ /< $DEBUG_RDOC, :noop => $DARKFISH_DRYRUN } - - FileUtils.cp @template_dir + 'rdoc.css', '.', options - - Dir[(@template_dir + "{js,images}/**/*").to_s].each do |path| - next if File.directory? path - next if path =~ /#{File::SEPARATOR}\./ - - dst = Pathname.new(path).relative_path_from @template_dir - - # I suck at glob - dst_dir = dst.dirname - FileUtils.mkdir_p dst_dir, options unless File.exist? dst_dir - - FileUtils.cp @template_dir + path, dst, options - end - end - - ### Build the initial indices and output objects - ### based on an array of TopLevel objects containing - ### the extracted information. - def generate( top_levels ) - @outputdir = Pathname.new( @options.op_dir ).expand_path( @basedir ) - - @files = top_levels.sort - @classes = RDoc::TopLevel.all_classes_and_modules.sort - @methods = @classes.map { |m| m.method_list }.flatten.sort - @modsort = get_sorted_module_list( @classes ) - - # Now actually write the output - write_style_sheet - generate_index - generate_class_files - generate_file_files - - rescue StandardError => err - debug_msg "%s: %s\n %s" % [ err.class.name, err.message, err.backtrace.join("\n ") ] - raise - end - - ######### - protected - ######### - - ### Return a list of the documented modules sorted by salience first, then - ### by name. - def get_sorted_module_list( classes ) - nscounts = classes.inject({}) do |counthash, klass| - top_level = klass.full_name.gsub( /::.*/, '' ) - counthash[top_level] ||= 0 - counthash[top_level] += 1 - - counthash - end - - # Sort based on how often the top level namespace occurs, and then on the - # name of the module -- this works for projects that put their stuff into - # a namespace, of course, but doesn't hurt if they don't. - classes.sort_by do |klass| - top_level = klass.full_name.gsub( /::.*/, '' ) - [ - nscounts[ top_level ] * -1, - klass.full_name - ] - end.select do |klass| - klass.document_self - end - end - - ### Generate an index page which lists all the classes which - ### are documented. - def generate_index - template_file = @template_dir + 'index.rhtml' - return unless template_file.exist? - - debug_msg "Rendering the index page..." - - template_src = template_file.read - template = ERB.new( template_src, trim_mode: '<>' ) - template.filename = template_file.to_s - context = binding() - - output = nil - - begin - output = template.result( context ) - rescue NoMethodError => err - raise RDoc::Error, "Error while evaluating %s: %s (at %p)" % [ - template_file, - err.message, - eval( "_erbout[-50,50]", context ) - ], err.backtrace - end - - outfile = @basedir + @options.op_dir + 'index.html' - unless $DARKFISH_DRYRUN - debug_msg "Outputting to %s" % [outfile.expand_path] - outfile.open( 'w', 0644 ) do |fh| - fh.print( output ) - end - else - debug_msg "Would have output to %s" % [outfile.expand_path] - end - end - - ### Generate a documentation file for each class - def generate_class_files - template_file = @template_dir + 'classpage.rhtml' - return unless template_file.exist? - debug_msg "Generating class documentation in #@outputdir" - - @classes.each do |klass| - debug_msg " working on %s (%s)" % [ klass.full_name, klass.path ] - outfile = @outputdir + klass.path - rel_prefix = @outputdir.relative_path_from( outfile.dirname ) - svninfo = self.get_svninfo( klass ) - - debug_msg " rendering #{outfile}" - self.render_template( template_file, binding(), outfile ) - end - end - - ### Generate a documentation file for each file - def generate_file_files - template_file = @template_dir + 'filepage.rhtml' - return unless template_file.exist? - debug_msg "Generating file documentation in #@outputdir" - - @files.each do |file| - outfile = @outputdir + file.path - debug_msg " working on %s (%s)" % [ file.full_name, outfile ] - rel_prefix = @outputdir.relative_path_from( outfile.dirname ) - context = binding() - - debug_msg " rendering #{outfile}" - self.render_template( template_file, binding(), outfile ) - end - end - - - ### Return a string describing the amount of time in the given number of - ### seconds in terms a human can understand easily. - def time_delta_string( seconds ) - return 'less than a minute' if seconds < 1.minute - return (seconds / 1.minute).to_s + ' minute' + (seconds/60 == 1 ? '' : 's') if seconds < 50.minutes - return 'about one hour' if seconds < 90.minutes - return (seconds / 1.hour).to_s + ' hours' if seconds < 18.hours - return 'one day' if seconds < 1.day - return 'about one day' if seconds < 2.days - return (seconds / 1.day).to_s + ' days' if seconds < 1.week - return 'about one week' if seconds < 2.week - return (seconds / 1.week).to_s + ' weeks' if seconds < 3.months - return (seconds / 1.month).to_s + ' months' if seconds < 1.year - return (seconds / 1.year).to_s + ' years' - end - - - # %q$Id: darkfish.rb 52 2009-01-07 02:08:11Z deveiant $" - SVNID_PATTERN = / - \$Id:\s - (\S+)\s # filename - (\d+)\s # rev - (\d{4}-\d{2}-\d{2})\s # Date (YYYY-MM-DD) - (\d{2}:\d{2}:\d{2}Z)\s # Time (HH:MM:SSZ) - (\w+)\s # committer - \$$ - /x - - ### Try to extract Subversion information out of the first constant whose value looks like - ### a subversion Id tag. If no matching constant is found, and empty hash is returned. - def get_svninfo( klass ) - constants = klass.constants or return {} - - constants.find {|c| c.value =~ SVNID_PATTERN } or return {} - - filename, rev, date, time, committer = $~.captures - commitdate = Time.parse( date + ' ' + time ) - - return { - :filename => filename, - :rev => Integer( rev ), - :commitdate => commitdate, - :commitdelta => time_delta_string( Time.now.to_i - commitdate.to_i ), - :committer => committer, - } - end - - - ### Load and render the erb template in the given +template_file+ within the - ### specified +context+ (a Binding object) and write it out to +outfile+. - ### Both +template_file+ and +outfile+ should be Pathname-like objects. - - def render_template( template_file, context, outfile ) - template_src = template_file.read - template = ERB.new( template_src, trim_mode: '<>' ) - template.filename = template_file.to_s - - output = begin - template.result( context ) - rescue NoMethodError => err - raise RDoc::Error, "Error while evaluating %s: %s (at %p)" % [ - template_file.to_s, - err.message, - eval( "_erbout[-50,50]", context ) - ], err.backtrace - end - - unless $DARKFISH_DRYRUN - outfile.dirname.mkpath - outfile.open( 'w', 0644 ) do |ofh| - ofh.print( output ) - end - else - debug_msg " would have written %d bytes to %s" % - [ output.length, outfile ] - end - end - -end # Roc::Generator::Darkfish - -# :stopdoc: - -### Time constants -module TimeConstantMethods # :nodoc: - - ### Number of seconds (returns receiver unmodified) - def seconds - return self - end - alias_method :second, :seconds - - ### Returns number of seconds in minutes - def minutes - return self * 60 - end - alias_method :minute, :minutes - - ### Returns the number of seconds in hours - def hours - return self * 60.minutes - end - alias_method :hour, :hours - - ### Returns the number of seconds in days - def days - return self * 24.hours - end - alias_method :day, :days - - ### Return the number of seconds in weeks - def weeks - return self * 7.days - end - alias_method :week, :weeks - - ### Returns the number of seconds in fortnights - def fortnights - return self * 2.weeks - end - alias_method :fortnight, :fortnights - - ### Returns the number of seconds in months (approximate) - def months - return self * 30.days - end - alias_method :month, :months - - ### Returns the number of seconds in years (approximate) - def years - return (self * 365.25.days).to_i - end - alias_method :year, :years - - - ### Returns the Time number of seconds before the - ### specified +time+. E.g., 2.hours.before( header.expiration ) - def before( time ) - return time - self - end - - - ### Returns the Time number of seconds ago. (e.g., - ### expiration > 2.hours.ago ) - def ago - return self.before( ::Time.now ) - end - - - ### Returns the Time number of seconds after the given +time+. - ### E.g., 10.minutes.after( header.expiration ) - def after( time ) - return time + self - end - - # Reads best without arguments: 10.minutes.from_now - def from_now - return self.after( ::Time.now ) - end -end # module TimeConstantMethods - - -# Extend Numeric with time constants -class Numeric # :nodoc: - include TimeConstantMethods -end - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/generator/markup.rb b/Src/StdLib/ruby/1.9.1/rdoc/generator/markup.rb deleted file mode 100644 index 3c803f186..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/generator/markup.rb +++ /dev/null @@ -1,171 +0,0 @@ -require 'rdoc/text' -require 'rdoc/code_objects' -require 'rdoc/generator' -require 'rdoc/markup/to_html_crossref' - -## -# Handle common RDoc::Markup tasks for various CodeObjects - -module RDoc::Generator::Markup - - ## - # Generates a relative URL from this object's path to +target_path+ - - def aref_to(target_path) - RDoc::Markup::ToHtml.gen_relative_url path, target_path - end - - ## - # Generates a relative URL from +from_path+ to this object's path - - def as_href(from_path) - RDoc::Markup::ToHtml.gen_relative_url from_path, path - end - - ## - # Handy wrapper for marking up this object's comment - - def description - markup @comment - end - - ## - # Creates an RDoc::Markup::ToHtmlCrossref formatter - - def formatter - return @formatter if defined? @formatter - - show_hash = RDoc::RDoc.current.options.show_hash - this = RDoc::Context === self ? self : @parent - @formatter = RDoc::Markup::ToHtmlCrossref.new this.path, this, show_hash - end - - ## - # Build a webcvs URL starting for the given +url+ with +full_path+ appended - # as the destination path. If +url+ contains '%s' +full_path+ will be - # sprintf'd into +url+ instead. - - def cvs_url(url, full_path) - if /%s/ =~ url then - sprintf url, full_path - else - url + full_path - end - end - -end - -class RDoc::AnyMethod - - include RDoc::Generator::Markup - - ## - # Prepend +src+ with line numbers. Relies on the first line of a source - # code listing having: - # - # # File xxxxx, line dddd - - def add_line_numbers(src) - if src =~ /\A.*, line (\d+)/ then - first = $1.to_i - 1 - last = first + src.count("\n") - size = last.to_s.length - - line = first - src.gsub!(/^/) do - res = if line == first then - " " * (size + 2) - else - "%2$*1$d: " % [size, line] - end - - line += 1 - res - end - end - end - - ## - # Turns the method's token stream into HTML - - def markup_code - return '' unless @token_stream - - src = "" - - @token_stream.each do |t| - next unless t - # style = STYLE_MAP[t.class] - style = case t - when RDoc::RubyToken::TkCONSTANT then "ruby-constant" - when RDoc::RubyToken::TkKW then "ruby-keyword kw" - when RDoc::RubyToken::TkIVAR then "ruby-ivar" - when RDoc::RubyToken::TkOp then "ruby-operator" - when RDoc::RubyToken::TkId then "ruby-identifier" - when RDoc::RubyToken::TkNode then "ruby-node" - when RDoc::RubyToken::TkCOMMENT then "ruby-comment cmt" - when RDoc::RubyToken::TkREGEXP then "ruby-regexp re" - when RDoc::RubyToken::TkSTRING then "ruby-value str" - when RDoc::RubyToken::TkVal then "ruby-value" - else - nil - end - - text = CGI.escapeHTML t.text - - if style - src << "#{text}" - else - src << text - end - end - - add_line_numbers src - - src - end - -end - -class RDoc::Attr - - include RDoc::Generator::Markup - -end - -class RDoc::Constant - - include RDoc::Generator::Markup - -end - -class RDoc::Context - - include RDoc::Generator::Markup - -end - -class RDoc::Context::Section - - include RDoc::Generator::Markup - -end - -class RDoc::TopLevel - - ## - # Returns a URL for this source file on some web repository. Use the -W - # command line option to set. - - def cvs_url - url = RDoc::RDoc.current.options.webcvs - - if /%s/ =~ url then - url % @absolute_name - else - url + @absolute_name - end - end - -end - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/generator/ri.rb b/Src/StdLib/ruby/1.9.1/rdoc/generator/ri.rb deleted file mode 100644 index 83bd3e696..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/generator/ri.rb +++ /dev/null @@ -1,82 +0,0 @@ -require 'rdoc/generator' -require 'rdoc/ri' - -## -# Generates ri data files - -class RDoc::Generator::RI - - RDoc::RDoc.add_generator self - - def self.for options - new options - end - - ## - # Set up a new ri generator - - def initialize options #:not-new: - @options = options - @store = RDoc::RI::Store.new '.' - @old_siginfo = nil - @current = nil - end - - ## - # Build the initial indices and output objects based on an array of TopLevel - # objects containing the extracted information. - - def generate top_levels - install_siginfo_handler - - @store.load_cache - - RDoc::TopLevel.all_classes_and_modules.each do |klass| - @current = "#{klass.class}: #{klass.full_name}" - - @store.save_class klass - - klass.each_method do |method| - @current = "#{method.class}: #{method.full_name}" - @store.save_method klass, method - end - - klass.each_attribute do |attribute| - @store.save_method klass, attribute - end - end - - @current = 'saving cache' - - @store.save_cache - - ensure - @current = nil - - remove_siginfo_handler - end - - ## - # Installs a siginfo handler that prints the current filename. - - def install_siginfo_handler - return unless Signal.list.key? 'INFO' - - @old_siginfo = trap 'INFO' do - puts @current if @current - end - end - - ## - # Removes a siginfo handler and replaces the previous - - def remove_siginfo_handler - return unless Signal.list.key? 'INFO' - - handler = @old_siginfo || 'DEFAULT' - - trap 'INFO', handler - end - -end - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/classpage.rhtml b/Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/classpage.rhtml deleted file mode 100644 index 0edee13d5..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/classpage.rhtml +++ /dev/null @@ -1,297 +0,0 @@ -"?> - - - - - - <%= klass.type.capitalize %>: <%= klass.full_name %> - - - - - - - - - - - -
-
-
-

- Home - Classes - Methods -

-
-
- -
-
-

In Files

-
- -
-
- - <% if !svninfo.empty? %> -
-

Subversion Info

-
-
-
Rev
-
<%= svninfo[:rev] %>
- -
Last Checked In
-
<%= svninfo[:commitdate].strftime('%Y-%m-%d %H:%M:%S') %> - (<%= svninfo[:commitdelta] %> ago)
- -
Checked in by
-
<%= svninfo[:committer] %>
-
-
-
- <% end %> -
- -
- - - <% if klass.type == 'class' %> -
-

Parent

- <% unless String === klass.superclass %> - - <% else %> - - <% end %> -
- <% end %> - - - <% unless klass.classes_and_modules.empty? %> -
-

Namespace

- -
- <% end %> - - - <% unless klass.method_list.empty? %> -
-

Methods

- -
- <% end %> - - - <% unless klass.includes.empty? %> -
-

Included Modules

- -
- <% end %> -
- -
- <% simple_files = @files.select {|tl| tl.parser == RDoc::Parser::Simple } %> - <% unless simple_files.empty? then %> -
-

Files

- -
- <% end %> - -
-

Class Index - [+]

-
-
- Quicksearch - -
-
- - - -
- - <% if $DEBUG_RDOC %> -
toggle debugging
- <% end %> -
-
- -
-

<%= klass.full_name %>

- -
- <%= klass.description %> -
- - - <% unless klass.constants.empty? %> -
-

Constants

-
- <% klass.each_constant do |const| %> -
<%= const.name %>
- <% if const.comment %> -
<%= const.description.strip %>
- <% else %> -
(Not documented)
- <% end %> - <% end %> -
-
- <% end %> - - - <% unless klass.attributes.empty? %> -
-

Attributes

- - <% klass.each_attribute do |attrib| %> -
- - <% if attrib.rw =~ /w/i %> - - <% end %> -
- <%= h attrib.name %>[<%= attrib.rw %>] -
- -
- <% if attrib.comment %> - <%= attrib.description.strip %> - <% else %> -

(Not documented)

- <% end %> -
-
- <% end %> -
- <% end %> - - - <% klass.methods_by_type.each do |type, visibilities| - next if visibilities.empty? - visibilities.each do |visibility, methods| - next if methods.empty? %> -
-

<%= visibility.to_s.capitalize %> <%= type.capitalize %> Methods

- - <% methods.each do |method| %> -
"> - - -
- <% if method.call_seq %> - <%= method.call_seq.strip.gsub(/->/, '→').gsub( /^\w.+\./m, '') %> - click to toggle source - <% else %> - <%= h method.name %><%= method.params %> - click to toggle source - <% end %> -
- -
- <% if method.comment %> - <%= method.description.strip %> - <% else %> -

(Not documented)

- <% end %> - - <% if method.token_stream %> -
-
-<%= method.markup_code %>
-
-
- <% end %> -
- - <% unless method.aliases.empty? %> -
- Also aliased as: <%= method.aliases.map do |aka| - %{#{h aka.name}} - end.join(", ") %> -
- <% end %> - - <% if method.is_alias_for then %> - - <% end %> -
- - <% end %> -
- <% end - end %> - -
- - -
- <% if $DEBUG_RDOC - require 'pp' %> -
<%= h PP.pp(klass, _erbout) %>
-
- <% else %> -

Disabled; run with --debug to generate this.

- <% end %> - - -
-

[Validate]

-

Generated with the Darkfish - Rdoc Generator <%= RDoc::Generator::Darkfish::VERSION %>.

-
- - - - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/filepage.rhtml b/Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/filepage.rhtml deleted file mode 100644 index 65482fa71..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/filepage.rhtml +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - File: <%= file.base_name %> [<%= @options.title %>] - - - - - - - - - -<% if file.parser == RDoc::Parser::Simple %> - -
-
-
-

- Home - Classes - Methods -

-
-
- -
- <% simple_files = @files.select { |f| f.parser == RDoc::Parser::Simple } %> - <% unless simple_files.empty? then %> -
-

Files

- -
- <% end %> - -
-

Class Index - [+]

-
-
- Quicksearch - -
-
- - - -
- - <% if $DEBUG_RDOC %> -
toggle debugging
- <% end %> -
-
- -
- <%= file.description %> -
- -
-

[Validate]

-

Generated with the Darkfish - Rdoc Generator <%= RDoc::Generator::Darkfish::VERSION %>.

-
- -<% else %> - -
-
-
Last Modified
-
<%= file.last_modified %>
- - <% if file.requires %> -
Requires
-
-
    - <% file.requires.each do |require| %> -
  • <%= require.name %>
  • - <% end %> -
-
- <% end %> - - <% if @options.webcvs %> -
Trac URL
-
<%= file.cvs_url %>
- <% end %> -
-
- -
- <% if file.comment %> -
-

Description

- <%= file.description %> -
- <% end %> -
- -<% end %> - - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/images/brick.png b/Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/images/brick.png deleted file mode 100644 index 7851cf34c946e5667221e3478668503eb1cd733f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 452 zcmV;#0XzPQP)Pdwe5?6tW?r-ok|b$oDQj8FV%kZPq;(MWOV8?8;<)(iP}>hNMU> z7fbz%jjlr7h8uuoQ~J6}n}@Y@PdTk=)PxO{%7zmL?dchpZX*~n;I{!C>*(8cU;q(~ zAS%Po_@naEU!xidrBXD?;hN|x^%W|Ij)0y*r5vi|?W&Fub(NqJ@z0o=O&SR3v>A``^efOSo-hEdApp;^Jd;9y!%1UfzX6Bh- z%-mbG|0Na{7Ruai_Y+DEb1s+b!*9k%Q!whMxjtZKA*?o;i1g&jy0@( zaU=-@d-h+o%gal6JRXEXA&L3`d2 z%jIxzZ~*p9O-;EJp_Ds0If38rM<5W8ic~K>FOK&2_p!CLg^i63OioVb6k$)zWHLx3 z5;!|M!}<9+#QSi1dRlbEcxPt^;cysUuU8@%3}RwpLRIGG<|IKnoyP6$Eh3SKw7a*r zSDXP=IYc&YZf;7@?fCe($^l9ORaJ3wbAx0uiC8QqRr$2t-Cfy8%XCI3B%pxJW>XdM zw~zPt_s}#A@pxQ5Ly)4szaMtH9lgE1SXx@b+S(fW`ub$fYPE8J7#bSNDzme*Ub07{ zQKV8SjEs!%0@v5ql8ggm!@$6Rbi^E8vBqpRM-}l+@5OSMrl+TWj*gC^qoV@>u{fQb zov5v?g~?>X@bEC&+uLPaQ&Ypn-y~^mZA}+f(&2EFH8eE%dU|@ENpN*_1-)L6_4Rc* zFuq@`IjX9vp1QiaK9ZojyZhnQURP99d=u;%37VRkpwsD4U0sd3x;hEQB&e^i|3QN0 z=H|Os1fRqaw!?#igLmS4HE!G3*ce(`TF} zlgUq0Q544c8(ae&UR$8ps&snq6^bPY3v3xAmMW74Di$h~GCH6E3TaYs2#6A<7K*gC z777H71_Wa;(dfp+g-drPCSWu)#PInZi72LJ;o?i~$-U=y&UbQ89Dul3%3P+Axkzc* zbH-y;QF=hR{qLItf%ci2_&e5wNo0gnVatG?ul6Zw=o$I9Ljfn*ic3`U?>IfEim3g{ zujU&$-hy6wn;w(xme|zJm;lWJxtTFfM)q0`kX!Vu0+d${$}LCddK1<^htTe-fUYL3 zB`SdNsZD>RgvLj1<^@h6_+cDRK2Brcr2~>%$*5S)hyV33PV^teac3%|4lz@8p4?)5 z?t5o^?q+%^%)Yygo~I^U4VR!bTnWuE35hcWrfCDR3q+sxJ79e7Fg`&)RCqLA^2^y^ z0laVfadW90_Fz8Brm|r47sB^u1VgI>kanj)Z4`zMSfHlm8>CwXa$JVM`$2RrmZB-3 zN10m-!;BvH*Br3V8t`DH7m`jf#2upVDXl{5ff18_pzCPK1Zu$$CKKvd8FGeFf)+K<|x33pc7P&S#3GZT4mEw;nr(Ze*F z3&*?-4U-lm*#tber5 z%S_ceqB`b3ko6r~BbvDwdohTvP(3a(pq{x#T$yQsu#OKwEe}KuH^Mh@nxg_(Nw136 zq#a^3xNBke)In+!?qk3%4wB69{pF`Tzg`07*qoM6N<$ Eg55P&8UO$Q diff --git a/Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/images/bullet_black.png b/Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/images/bullet_black.png deleted file mode 100644 index 57619706d10d9736b1849a83f2c5694fbe09c53b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$h^>lFz(Kw&{<9vg>5sw~gS5O!4 zr|{HuUFIBKiQyL}eBJ-L{`UVT|6_O~L{G%N{Wbre{kQtZ_0LvEhC#5QQ<|d}62BjvZR2H60wE-$h^mK6y(Kw&{<9vg>(S^W+6Zii9 z|Nhthr~iNb*Z!}6uiN$Dz5neG3a-`baBX8yz1H+_;eX)`ni0%X8XBDc-`=Ph(Uan2 zYsR{H!kvIN--9isvHznRsC#5QQ<|d}62BjvZR2H60wE-$h_H=O!(Kw&{<9vg>(S^W+6Zii9 z|Nhthr~iNb*Z!}6uiN$Dz5neG3a-`baBX8yz4q@v|B?28{s)#N@CGn3@%_y|zAV9T z66e<&B4?b6oF&azg|C(V&1ZbI_D}pL`}(^FT2yXwG1Ph~$Q@h8mJYOz!PC{xWt~$( F699+YQR)By diff --git a/Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/images/date.png b/Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/images/date.png deleted file mode 100644 index 783c83357fdf90a1c7c024358e1d768b5c09c135..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 626 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 Dl)1NK diff --git a/Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/images/macFFBgHack.png b/Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/images/macFFBgHack.png deleted file mode 100644 index c6473b324ee1dae1faaacc0826639833f551116c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%1|*NXY)uAIEX7WqAsj$Z!;#Vf4nJ za0`Jjl>Qs8<JF;+Fd5q0wCR k?u=~bH}2*0f`J3~k>FVdQ&MBb@0BAfpf&c&j diff --git a/Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/images/package.png b/Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/images/package.png deleted file mode 100644 index da3c2a2d74bab159ba0f65d7db601768258afcb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 853 zcmV-b1FHOqP)5TQ^(M5v$(QKVE?W+9X! z*o}&~6c?_FreF)9NJB7b5Nbn{G0n4+%uJhR9(V5R|NFTpb|HgjefT!tIhLx@DR+N) zV+fHiR5Yt19}k|KnCsND{tH-`IMJ)3AE?OtyZ4>Un|6(d%h#JK`i&a7^xW9>`yBy` zS4SOHeOpC7$?hH5-#7Rswiue_8Ju*2N@$58=a#2OTA3png`w3v->gWif7t%e$ z$NLVS!tFT#8WL|Wa&K~+{%4P2cRfwesYV1_!F=3OaRVHl(>=`%&{x*s30c}#CNE@&;ItrAv!f!)Oy$Q9t$uS=(sD$-J{T*^(8Eez1E-l3}} zPrfHZ1`qsIFe&gipuL8-IZbo2Yg{lFGKs?ZZWcOaOdk*3`5T;$?AjbG1#`B510Er^h2)2r3Y{!8_2Gj=$KzuN5 zaErtW8W_Y2iJJjY)5pmTVJoPJYpanPOEuYHclM^C1F>${hFRpdi8a<2H|Xudf78bm(zwJ9`K%6I?q*Ua~ fW9JvIbn5*B+_J)rUMBs>00000NkvXXu0mjfH&TkY diff --git a/Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/images/page_green.png b/Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/images/page_green.png deleted file mode 100644 index de8e003f9fb8752c09e7f3655d5d8664b5c62fc3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 621 zcmV-z0+RiSP)QqUjAtB;_Vvt6}AS_5YgM`Uqu`yva+H8^=4U$e4gHb}u zAQ2N{V3A%pO|?Pv?tb6z=jC}SiRa$G^v3q?*6XcYz$p|cq{uLj@#~Fi`J(>5{@&&N zy%T^+;>8cXx%|o77anP?&W1?1A(>-T49z9pyeCl@7YI+Si zKti7=B~``}TImz(G{0PnlQA3P#MAd}sorMjkP!50B7$nAkU^%#nl{Q9lW0@}9fE-> zN(q7tRuiC_T1r|BBtVBTlQ2+70$Rf;eF`Z;lx46Cpu-rEgb)EBKq(b^W8l<^We(`D z43?0=01z<3G6+UUv6`CsWCk6^93!#+<;ws7007{zS3k2k9-zZKFO~(k`>s0y006+1 zgF_jyIhsL-`FMf~JL~C=cV75(CrJ|q;MVO961G=O zm9d)YpJg5g(4i_HKL75eSE}mq$Y}r}hyVdcV~p>6a}oXr80q`oj%+s700000NkvXX Hu0mjfPs|!l diff --git a/Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/images/page_white_text.png b/Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/images/page_white_text.png deleted file mode 100644 index 813f712f726c935f9adf8d2f2dd0d7683791ef11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 342 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-%6;pyTSA|c6o&@eC9QG)Hj&ExYL zO&oVL^)+cM^qd@ApywS>pwx0H@RDN}hq;7mU-SKczYQ-hnrr=;iDAQMZQ+*g=YOM= z!QlMQEn7FbaD->uKAYgo_j9)W&$$zS*W9}m(ey0q$&7l-XEWO0Y(9M=SnhLbwy;d>@~SY$Ku*0xPvIOQeV1x7u_z-2-X>_74(yfh7C znXL|3GZ+d2`3re2hs?MKC#5QQ<|d}62BjvZR2H60wE-$R?&;zfqH(@;q9b3Efq-lM(nr^( z=EYR73-9e)UYMWsXy%?aZsD68Yyv^2$~6QgEcljw%kx>O(f-gQ?@fOOx3A-0+Qw?O zRx~W)kn~Qe2d6f9nMG#g9Q04Mk==M~N!Dglvxk!fgVh#w@ZV$IY1+Xc`d{d2UcaP~ zfWp)_Ivqj}l2SPy^9ZWy6rG9Yx4v67_uA&&9|XA~5-#3)W3%em1peD8RWH^#O%XoM zxMPud%}GTj#~*+7JMxTd!`{^Q+>(D3*|@KV`*G2;{QnANOxu1$r2xIe;OXk;vd$@? F2>@zac~<}c diff --git a/Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/images/plugin.png b/Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/images/plugin.png deleted file mode 100644 index 6187b15aec001b7080b51a5f944f07591f26cc15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 591 zcmV-V0eEcNHZMNv|IbJ-M`( zKwWL~opzjJe^WpCmV9E;(0&ut2;4va_(#>M8)>9$R5viQnf(Nkh~VM$y>J(jqb$cj z+nL1Nm|mV)Gm|9MnHf*7Ja4OEAQz__^LRKOLEwqpiGV^^A*T=#&inGm-62Xs;dnSp zKj&H9T*boh2i)W+(n27l!C)>fq|L%VB1i ziC4p;NwV_}ZjW7$LRW#(_bKF#hp=!IqNO26Z*w2+LEwx{PVnZ&Sn}T;mtzb$;qA*nT@@+ zV5uQ@iXDTPoTbV#FRr~z04|PPh`wXTNoCm9*tG&?e3+fYl>K6+&3|Cc$KOpL`ER+_ dcRl5U#9zn6ZO}GFk7R5;7c zlif>`Q5?tj7Yw@ZCMtTF^Q|ZedeJhM%QPCR*bs8V79p$QTo7e94yQNXRs-{0?hOn_-8n0AMO@u1Ts zNl8QzJs1#rz%RBt?ux>l+amAvh+J!{$lkaqv}+Erb-6j2xp>K4GLQnNB*W`hFg*?P z^AL@~(h~Z+wfcWEXHqV^Tq-#z$7Y#o0;yFxA!00F}F2dX# zjE$iOgT#G4*1TR6kB1Gnn@>$meCh2a>c5YuIvFn-R2W@>4@M*m@-|jiDV?b)bccgA zyPfsMM!rjy>+1O2)5Eg29Z_*2p&qGnmS!OH?vZ(4>QB01d>j%9n4QINxkyT(Dos?I zjaWF$*IQmh`SF-?xU%xMEfjq1=6qY*g&lgG_cXv$BGoIWyfO5 zp>pdV*O+y=&6@N2WWFo(%RtT`Q(H^6zn^a%epE~Kx^mEJ{c8`luC$nc*z9j|4Ms8aJK-la^5T)AZ%#@G{_P{NCN^P z(J0zvSn~SSm(Ur);-M~8^*;61*VRI`T1BN&LAhK;sZ>I-SVW;vfUfJv=ko^ugnc0x zhJodBxe>iyk3%w<%wC8holUJ4(iv>tL{`DQt zPOsyUbO_Cmc&*iHkqbm3ku`|GcC^OhF>jj9W*GkH;^g!iUVpib_h*=@udp4h(P+e*zL_~ZmJjh(y^BxULwq>9zXoYE8sq{#pN~U0C6!8vY)5N2 z9P*}mw}7X$O^qTtJef1ACWvJT9^wt-)Zh0r~j#0bT`f;-zv6 z^Tmw22!%rMcs!TaUX<-8s;X-B`+Xbo+_uWuFa z1yIPc?DTrQ7KvRhmt*TG|L=EYQ=LqFX;=Lp`4}jx6BE-@00000NkvXXu0mjf=s_29 diff --git a/Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/images/wrench.png b/Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/images/wrench.png deleted file mode 100644 index 5c8213fef5ab969f03189d4367e32e597e38bd7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 610 zcmV-o0-gPdP)^jb z4`0v}DG1te)wmeb(>p90leRz?_mO+^JKy=v&2<29Od6?F%9%(c8los#f*@G`-%W&* z$)uBj2i@u-@SgX}gtyWPe6d*|w6h%R? zScK2#Yn%$sum0cy>90DmY*i{1XqpClEtktsRTZ)lCUe z<FogV^*tm>8*AlX za4oiR!&85LrobG57qUHUX#{>Vz(RHpB5|@>9O6N$jqB8>%($0wxE5R3)b>Y~xtCo$ zCgEk&A?_#IxHdN)9tqre^o{ho4{?hmPuf@^@I3-wncaRd%|~O3xbrKY=&TiwPYkJroM{;WUQTuMY8vpg}f4o)2%U3C;eEDoiEh?94d(rV57VIF#8VqzW$HrDC|#U`x@QDbgi zVl)t9GGz&YY#D?gc%>hISA+_EBpnXt#pnC`p6@xw0$8TCbULjhlgVx(kuc)%xbgqq zR5+DNDFRN0!y)7Gm}oT0i39}h4h928qY?Rho^UvPGJ#kuW|-Amtrn`Pmd&+bFo@sp z$LI4IQw7BG?|#2ewOS<<3VjL$0=lMY^m;wqZujv5kx1l%Sl;V&Iy4#$ip3&@LV2!7vhhN=PCz%^9v24`qb(+m4W?!q-&~=?ssf5GfnAmJKV;3bvpDm0(NhahZ=&^sqo6Odj6>)Dq_3p~4~ zvb`d3Mydwjt&Df^hVmLtI2x=U&h9(JVYX-!y~z3zi;1>=LY;o(bL$(Yf$lf)dMf0-u^0HrpTG Wk@)HE*94aU0000m+BBgry{~j2fHLegbHP( zrgXNbr0}2;^nywdjLjZe?uxtrd3D(pZH@fFFc0{BW_~jxoO1w7-VX;6vK@ROA$$R6 zEmo;Ht-Mj|>5jUy{bQ^V5@53LRI8AgLpUm|m+15sqcz@QtVSo|oz7ArM8?pIn+>gN z0b=4_b5O|4A*;Q+vc9Vqr~%3V155*NV~@gTz}KSUiKB-uJzjMZ>5%Q#n24H!V{ zTY(LLAE*NAHZ}C#wnj%Bw5OFIkRhkkAW#kDC3j9Wm0YXRaXlyyp>#mVfYG)eC;@ab zDb=T-BCAY4LI(Z@GOTr2V_A{pRwSmz+8Be>CjAw(=gnbVWAeguvZa93JmL(EDxv1m z0OP4q=fpAK1Mq!C2`OkEn37o;m#wF#(t(8Pu#S?2f#x<~4EO{@fmm`p9veD6RZ_jp z@Au4};q&`XuKEYgIiB4((kgxOs#YdqJw0fY>9^K_agEu5+$#k;w#%I2N>n_?)YIqu z`tq&#_^p?-%K*U0^}|7+9U(&k0?s;=r=uCZ%)H9_edH8wK}gB(nUB1FFk+2Ol%BXV zHoFY`D~2x|2 - - - - - - - <%= h @options.title %> - - - - - - - - - - - - <% $stderr.sync = true %> -

<%= h @options.title %>

- - <% if @options.main_page && main_page = @files.find { |f| f.full_name == @options.main_page } %> -
- <%= main_page.description.sub(%r{^\s*}i, '') %> -
- <% else %> -

This is the API documentation for '<%= @options.title %>'.

- <% end %> - - <% simple_files = @files.select {|tl| tl.parser == RDoc::Parser::Simple } %> - <% unless simple_files.empty? then %> -

Files

- - <% end %> - -

Classes/Modules

- - -

Methods

- - -
-

[Validate]

-

Generated with the Darkfish - Rdoc Generator <%= RDoc::Generator::Darkfish::VERSION %>.

-
- - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/js/darkfish.js b/Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/js/darkfish.js deleted file mode 100644 index 5a471e8b9..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/js/darkfish.js +++ /dev/null @@ -1,116 +0,0 @@ -/** - * - * Darkfish Page Functions - * $Id: darkfish.js 53 2009-01-07 02:52:03Z deveiant $ - * - * Author: Michael Granger - * - */ - -/* Provide console simulation for firebug-less environments */ -if (!("console" in window) || !("firebug" in console)) { - var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml", - "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"]; - - window.console = {}; - for (var i = 0; i < names.length; ++i) - window.console[names[i]] = function() {}; -}; - - -/** - * Unwrap the first element that matches the given @expr@ from the targets and return them. - */ -$.fn.unwrap = function( expr ) { - return this.each( function() { - $(this).parents( expr ).eq( 0 ).after( this ).remove(); - }); -}; - - -function showSource( e ) { - var target = e.target; - var codeSections = $(target). - parents('.method-detail'). - find('.method-source-code'); - - $(target). - parents('.method-detail'). - find('.method-source-code'). - slideToggle(); -}; - -function hookSourceViews() { - $('.method-description,.method-heading').click( showSource ); -}; - -function toggleDebuggingSection() { - $('.debugging-section').slideToggle(); -}; - -function hookDebuggingToggle() { - $('#debugging-toggle img').click( toggleDebuggingSection ); -}; - -function hookQuickSearch() { - $('.quicksearch-field').each( function() { - var searchElems = $(this).parents('.section').find( 'li' ); - var toggle = $(this).parents('.section').find('h3 .search-toggle'); - // console.debug( "Toggle is: %o", toggle ); - var qsbox = $(this).parents('form').get( 0 ); - - $(this).quicksearch( this, searchElems, { - noSearchResultsIndicator: 'no-class-search-results', - focusOnLoad: false - }); - $(toggle).click( function() { - // console.debug( "Toggling qsbox: %o", qsbox ); - $(qsbox).toggle(); - }); - }); -}; - -function highlightTarget( anchor ) { - console.debug( "Highlighting target '%s'.", anchor ); - - $("a[name=" + anchor + "]").each( function() { - if ( !$(this).parent().parent().hasClass('target-section') ) { - console.debug( "Wrapping the target-section" ); - $('div.method-detail').unwrap( 'div.target-section' ); - $(this).parent().wrap( '
' ); - } else { - console.debug( "Already wrapped." ); - } - }); -}; - -function highlightLocationTarget() { - console.debug( "Location hash: %s", window.location.hash ); - if ( ! window.location.hash || window.location.hash.length == 0 ) return; - - var anchor = window.location.hash.substring(1); - console.debug( "Found anchor: %s; matching %s", anchor, "a[name=" + anchor + "]" ); - - highlightTarget( anchor ); -}; - -function highlightClickTarget( event ) { - console.debug( "Highlighting click target for event %o", event.target ); - try { - var anchor = $(event.target).attr( 'href' ).substring(1); - console.debug( "Found target anchor: %s", anchor ); - highlightTarget( anchor ); - } catch ( err ) { - console.error( "Exception while highlighting: %o", err ); - }; -}; - - -$(document).ready( function() { - hookSourceViews(); - hookDebuggingToggle(); - hookQuickSearch(); - highlightLocationTarget(); - - $('ul.link-list a').bind( "click", highlightClickTarget ); -}); diff --git a/Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/js/jquery.js b/Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/js/jquery.js deleted file mode 100644 index eae453a7b..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/js/jquery.js +++ /dev/null @@ -1,32 +0,0 @@ -/* - * jQuery 1.2.6 - New Wave Javascript - * - * Copyright (c) 2008 John Resig (jquery.com) - * Dual licensed under the MIT (MIT-LICENSE.txt) - * and GPL (GPL-LICENSE.txt) licenses. - * - * $Date: 2008-09-25 09:50:52 -0700 (Thu, 25 Sep 2008) $ - * $Rev: 38 $ - */ -(function(){var _jQuery=window.jQuery,_$=window.$;var jQuery=window.jQuery=window.$=function(selector,context){return new jQuery.fn.init(selector,context);};var quickExpr=/^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,isSimple=/^.[^:#\[\.]*$/,undefined;jQuery.fn=jQuery.prototype={init:function(selector,context){selector=selector||document;if(selector.nodeType){this[0]=selector;this.length=1;return this;}if(typeof selector=="string"){var match=quickExpr.exec(selector);if(match&&(match[1]||!context)){if(match[1])selector=jQuery.clean([match[1]],context);else{var elem=document.getElementById(match[3]);if(elem){if(elem.id!=match[3])return jQuery().find(selector);return jQuery(elem);}selector=[];}}else -return jQuery(context).find(selector);}else if(jQuery.isFunction(selector))return jQuery(document)[jQuery.fn.ready?"ready":"load"](selector);return this.setArray(jQuery.makeArray(selector));},jquery:"1.2.6",size:function(){return this.length;},length:0,get:function(num){return num==undefined?jQuery.makeArray(this):this[num];},pushStack:function(elems){var ret=jQuery(elems);ret.prevObject=this;return ret;},setArray:function(elems){this.length=0;Array.prototype.push.apply(this,elems);return this;},each:function(callback,args){return jQuery.each(this,callback,args);},index:function(elem){var ret=-1;return jQuery.inArray(elem&&elem.jquery?elem[0]:elem,this);},attr:function(name,value,type){var options=name;if(name.constructor==String)if(value===undefined)return this[0]&&jQuery[type||"attr"](this[0],name);else{options={};options[name]=value;}return this.each(function(i){for(name in options)jQuery.attr(type?this.style:this,name,jQuery.prop(this,options[name],type,i,name));});},css:function(key,value){if((key=='width'||key=='height')&&parseFloat(value)<0)value=undefined;return this.attr(key,value,"curCSS");},text:function(text){if(typeof text!="object"&&text!=null)return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(text));var ret="";jQuery.each(text||this,function(){jQuery.each(this.childNodes,function(){if(this.nodeType!=8)ret+=this.nodeType!=1?this.nodeValue:jQuery.fn.text([this]);});});return ret;},wrapAll:function(html){if(this[0])jQuery(html,this[0].ownerDocument).clone().insertBefore(this[0]).map(function(){var elem=this;while(elem.firstChild)elem=elem.firstChild;return elem;}).append(this);return this;},wrapInner:function(html){return this.each(function(){jQuery(this).contents().wrapAll(html);});},wrap:function(html){return this.each(function(){jQuery(this).wrapAll(html);});},append:function(){return this.domManip(arguments,true,false,function(elem){if(this.nodeType==1)this.appendChild(elem);});},prepend:function(){return this.domManip(arguments,true,true,function(elem){if(this.nodeType==1)this.insertBefore(elem,this.firstChild);});},before:function(){return this.domManip(arguments,false,false,function(elem){this.parentNode.insertBefore(elem,this);});},after:function(){return this.domManip(arguments,false,true,function(elem){this.parentNode.insertBefore(elem,this.nextSibling);});},end:function(){return this.prevObject||jQuery([]);},find:function(selector){var elems=jQuery.map(this,function(elem){return jQuery.find(selector,elem);});return this.pushStack(/[^+>] [^+>]/.test(selector)||selector.indexOf("..")>-1?jQuery.unique(elems):elems);},clone:function(events){var ret=this.map(function(){if(jQuery.browser.msie&&!jQuery.isXMLDoc(this)){var clone=this.cloneNode(true),container=document.createElement("div");container.appendChild(clone);return jQuery.clean([container.innerHTML])[0];}else -return this.cloneNode(true);});var clone=ret.find("*").andSelf().each(function(){if(this[expando]!=undefined)this[expando]=null;});if(events===true)this.find("*").andSelf().each(function(i){if(this.nodeType==3)return;var events=jQuery.data(this,"events");for(var type in events)for(var handler in events[type])jQuery.event.add(clone[i],type,events[type][handler],events[type][handler].data);});return ret;},filter:function(selector){return this.pushStack(jQuery.isFunction(selector)&&jQuery.grep(this,function(elem,i){return selector.call(elem,i);})||jQuery.multiFilter(selector,this));},not:function(selector){if(selector.constructor==String)if(isSimple.test(selector))return this.pushStack(jQuery.multiFilter(selector,this,true));else -selector=jQuery.multiFilter(selector,this);var isArrayLike=selector.length&&selector[selector.length-1]!==undefined&&!selector.nodeType;return this.filter(function(){return isArrayLike?jQuery.inArray(this,selector)<0:this!=selector;});},add:function(selector){return this.pushStack(jQuery.unique(jQuery.merge(this.get(),typeof selector=='string'?jQuery(selector):jQuery.makeArray(selector))));},is:function(selector){return!!selector&&jQuery.multiFilter(selector,this).length>0;},hasClass:function(selector){return this.is("."+selector);},val:function(value){if(value==undefined){if(this.length){var elem=this[0];if(jQuery.nodeName(elem,"select")){var index=elem.selectedIndex,values=[],options=elem.options,one=elem.type=="select-one";if(index<0)return null;for(var i=one?index:0,max=one?index+1:options.length;i=0||jQuery.inArray(this.name,value)>=0);else if(jQuery.nodeName(this,"select")){var values=jQuery.makeArray(value);jQuery("option",this).each(function(){this.selected=(jQuery.inArray(this.value,values)>=0||jQuery.inArray(this.text,values)>=0);});if(!values.length)this.selectedIndex=-1;}else -this.value=value;});},html:function(value){return value==undefined?(this[0]?this[0].innerHTML:null):this.empty().append(value);},replaceWith:function(value){return this.after(value).remove();},eq:function(i){return this.slice(i,i+1);},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments));},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem);}));},andSelf:function(){return this.add(this.prevObject);},data:function(key,value){var parts=key.split(".");parts[1]=parts[1]?"."+parts[1]:"";if(value===undefined){var data=this.triggerHandler("getData"+parts[1]+"!",[parts[0]]);if(data===undefined&&this.length)data=jQuery.data(this[0],key);return data===undefined&&parts[1]?this.data(parts[0]):data;}else -return this.trigger("setData"+parts[1]+"!",[parts[0],value]).each(function(){jQuery.data(this,key,value);});},removeData:function(key){return this.each(function(){jQuery.removeData(this,key);});},domManip:function(args,table,reverse,callback){var clone=this.length>1,elems;return this.each(function(){if(!elems){elems=jQuery.clean(args,this.ownerDocument);if(reverse)elems.reverse();}var obj=this;if(table&&jQuery.nodeName(this,"table")&&jQuery.nodeName(elems[0],"tr"))obj=this.getElementsByTagName("tbody")[0]||this.appendChild(this.ownerDocument.createElement("tbody"));var scripts=jQuery([]);jQuery.each(elems,function(){var elem=clone?jQuery(this).clone(true)[0]:this;if(jQuery.nodeName(elem,"script"))scripts=scripts.add(elem);else{if(elem.nodeType==1)scripts=scripts.add(jQuery("script",elem).remove());callback.call(obj,elem);}});scripts.each(evalScript);});}};jQuery.fn.init.prototype=jQuery.fn;function evalScript(i,elem){if(elem.src)jQuery.ajax({url:elem.src,async:false,dataType:"script"});else -jQuery.globalEval(elem.text||elem.textContent||elem.innerHTML||"");if(elem.parentNode)elem.parentNode.removeChild(elem);}function now(){return+new Date;}jQuery.extend=jQuery.fn.extend=function(){var target=arguments[0]||{},i=1,length=arguments.length,deep=false,options;if(target.constructor==Boolean){deep=target;target=arguments[1]||{};i=2;}if(typeof target!="object"&&typeof target!="function")target={};if(length==i){target=this;--i;}for(;i-1;}},swap:function(elem,options,callback){var old={};for(var name in options){old[name]=elem.style[name];elem.style[name]=options[name];}callback.call(elem);for(var name in options)elem.style[name]=old[name];},css:function(elem,name,force){if(name=="width"||name=="height"){var val,props={position:"absolute",visibility:"hidden",display:"block"},which=name=="width"?["Left","Right"]:["Top","Bottom"];function getWH(){val=name=="width"?elem.offsetWidth:elem.offsetHeight;var padding=0,border=0;jQuery.each(which,function(){padding+=parseFloat(jQuery.curCSS(elem,"padding"+this,true))||0;border+=parseFloat(jQuery.curCSS(elem,"border"+this+"Width",true))||0;});val-=Math.round(padding+border);}if(jQuery(elem).is(":visible"))getWH();else -jQuery.swap(elem,props,getWH);return Math.max(0,val);}return jQuery.curCSS(elem,name,force);},curCSS:function(elem,name,force){var ret,style=elem.style;function color(elem){if(!jQuery.browser.safari)return false;var ret=defaultView.getComputedStyle(elem,null);return!ret||ret.getPropertyValue("color")=="";}if(name=="opacity"&&jQuery.browser.msie){ret=jQuery.attr(style,"opacity");return ret==""?"1":ret;}if(jQuery.browser.opera&&name=="display"){var save=style.outline;style.outline="0 solid black";style.outline=save;}if(name.match(/float/i))name=styleFloat;if(!force&&style&&style[name])ret=style[name];else if(defaultView.getComputedStyle){if(name.match(/float/i))name="float";name=name.replace(/([A-Z])/g,"-$1").toLowerCase();var computedStyle=defaultView.getComputedStyle(elem,null);if(computedStyle&&!color(elem))ret=computedStyle.getPropertyValue(name);else{var swap=[],stack=[],a=elem,i=0;for(;a&&color(a);a=a.parentNode)stack.unshift(a);for(;i]*?)\/>/g,function(all,front,tag){return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?all:front+">";});var tags=jQuery.trim(elem).toLowerCase(),div=context.createElement("div");var wrap=!tags.indexOf("",""]||!tags.indexOf("",""]||tags.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"","
"]||!tags.indexOf("",""]||(!tags.indexOf("",""]||!tags.indexOf("",""]||jQuery.browser.msie&&[1,"div
","
"]||[0,"",""];div.innerHTML=wrap[1]+elem+wrap[2];while(wrap[0]--)div=div.lastChild;if(jQuery.browser.msie){var tbody=!tags.indexOf(""&&tags.indexOf("=0;--j)if(jQuery.nodeName(tbody[j],"tbody")&&!tbody[j].childNodes.length)tbody[j].parentNode.removeChild(tbody[j]);if(/^\s/.test(elem))div.insertBefore(context.createTextNode(elem.match(/^\s*/)[0]),div.firstChild);}elem=jQuery.makeArray(div.childNodes);}if(elem.length===0&&(!jQuery.nodeName(elem,"form")&&!jQuery.nodeName(elem,"select")))return;if(elem[0]==undefined||jQuery.nodeName(elem,"form")||elem.options)ret.push(elem);else -ret=jQuery.merge(ret,elem);});return ret;},attr:function(elem,name,value){if(!elem||elem.nodeType==3||elem.nodeType==8)return undefined;var notxml=!jQuery.isXMLDoc(elem),set=value!==undefined,msie=jQuery.browser.msie;name=notxml&&jQuery.props[name]||name;if(elem.tagName){var special=/href|src|style/.test(name);if(name=="selected"&&jQuery.browser.safari)elem.parentNode.selectedIndex;if(name in elem&¬xml&&!special){if(set){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode)throw"type property can't be changed";elem[name]=value;}if(jQuery.nodeName(elem,"form")&&elem.getAttributeNode(name))return elem.getAttributeNode(name).nodeValue;return elem[name];}if(msie&¬xml&&name=="style")return jQuery.attr(elem.style,"cssText",value);if(set)elem.setAttribute(name,""+value);var attr=msie&¬xml&&special?elem.getAttribute(name,2):elem.getAttribute(name);return attr===null?undefined:attr;}if(msie&&name=="opacity"){if(set){elem.zoom=1;elem.filter=(elem.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(value)+''=="NaN"?"":"alpha(opacity="+value*100+")");}return elem.filter&&elem.filter.indexOf("opacity=")>=0?(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1])/100)+'':"";}name=name.replace(/-([a-z])/ig,function(all,letter){return letter.toUpperCase();});if(set)elem[name]=value;return elem[name];},trim:function(text){return(text||"").replace(/^\s+|\s+$/g,"");},makeArray:function(array){var ret=[];if(array!=null){var i=array.length;if(i==null||array.split||array.setInterval||array.call)ret[0]=array;else -while(i)ret[--i]=array[i];}return ret;},inArray:function(elem,array){for(var i=0,length=array.length;i*",this).remove();while(this.firstChild)this.removeChild(this.firstChild);}},function(name,fn){jQuery.fn[name]=function(){return this.each(fn,arguments);};});jQuery.each(["Height","Width"],function(i,name){var type=name.toLowerCase();jQuery.fn[type]=function(size){return this[0]==window?jQuery.browser.opera&&document.body["client"+name]||jQuery.browser.safari&&window["inner"+name]||document.compatMode=="CSS1Compat"&&document.documentElement["client"+name]||document.body["client"+name]:this[0]==document?Math.max(Math.max(document.body["scroll"+name],document.documentElement["scroll"+name]),Math.max(document.body["offset"+name],document.documentElement["offset"+name])):size==undefined?(this.length?jQuery.css(this[0],type):null):this.css(type,size.constructor==String?size:size+"px");};});function num(elem,prop){return elem[0]&&parseInt(jQuery.curCSS(elem[0],prop,true),10)||0;}var chars=jQuery.browser.safari&&parseInt(jQuery.browser.version)<417?"(?:[\\w*_-]|\\\\.)":"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",quickChild=new RegExp("^>\\s*("+chars+"+)"),quickID=new RegExp("^("+chars+"+)(#)("+chars+"+)"),quickClass=new RegExp("^([#.]?)("+chars+"*)");jQuery.extend({expr:{"":function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},"#":function(a,i,m){return a.getAttribute("id")==m[2];},":":{lt:function(a,i,m){return im[3]-0;},nth:function(a,i,m){return m[3]-0==i;},eq:function(a,i,m){return m[3]-0==i;},first:function(a,i){return i==0;},last:function(a,i,m,r){return i==r.length-1;},even:function(a,i){return i%2==0;},odd:function(a,i){return i%2;},"first-child":function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},"last-child":function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},"only-child":function(a){return!jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},parent:function(a){return a.firstChild;},empty:function(a){return!a.firstChild;},contains:function(a,i,m){return(a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},visible:function(a){return"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},hidden:function(a){return"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},enabled:function(a){return!a.disabled;},disabled:function(a){return a.disabled;},checked:function(a){return a.checked;},selected:function(a){return a.selected||jQuery.attr(a,"selected");},text:function(a){return"text"==a.type;},radio:function(a){return"radio"==a.type;},checkbox:function(a){return"checkbox"==a.type;},file:function(a){return"file"==a.type;},password:function(a){return"password"==a.type;},submit:function(a){return"submit"==a.type;},image:function(a){return"image"==a.type;},reset:function(a){return"reset"==a.type;},button:function(a){return"button"==a.type||jQuery.nodeName(a,"button");},input:function(a){return/input|select|textarea|button/i.test(a.nodeName);},has:function(a,i,m){return jQuery.find(m[3],a).length;},header:function(a){return/h\d/i.test(a.nodeName);},animated:function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}}},parse:[/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,new RegExp("^([:.#]*)("+chars+"+)")],multiFilter:function(expr,elems,not){var old,cur=[];while(expr&&expr!=old){old=expr;var f=jQuery.filter(expr,elems,not);expr=f.t.replace(/^\s*,\s*/,"");cur=not?elems=f.r:jQuery.merge(cur,f.r);}return cur;},find:function(t,context){if(typeof t!="string")return[t];if(context&&context.nodeType!=1&&context.nodeType!=9)return[];context=context||document;var ret=[context],done=[],last,nodeName;while(t&&last!=t){var r=[];last=t;t=jQuery.trim(t);var foundToken=false,re=quickChild,m=re.exec(t);if(m){nodeName=m[1].toUpperCase();for(var i=0;ret[i];i++)for(var c=ret[i].firstChild;c;c=c.nextSibling)if(c.nodeType==1&&(nodeName=="*"||c.nodeName.toUpperCase()==nodeName))r.push(c);ret=r;t=t.replace(re,"");if(t.indexOf(" ")==0)continue;foundToken=true;}else{re=/^([>+~])\s*(\w*)/i;if((m=re.exec(t))!=null){r=[];var merge={};nodeName=m[2].toUpperCase();m=m[1];for(var j=0,rl=ret.length;j=0;if(!not&&pass||not&&!pass)tmp.push(r[i]);}return tmp;},filter:function(t,r,not){var last;while(t&&t!=last){last=t;var p=jQuery.parse,m;for(var i=0;p[i];i++){m=p[i].exec(t);if(m){t=t.substring(m[0].length);m[2]=m[2].replace(/\\/g,"");break;}}if(!m)break;if(m[1]==":"&&m[2]=="not")r=isSimple.test(m[3])?jQuery.filter(m[3],r,true).r:jQuery(r).not(m[3]);else if(m[1]==".")r=jQuery.classFilter(r,m[2],not);else if(m[1]=="["){var tmp=[],type=m[3];for(var i=0,rl=r.length;i=0)^not)tmp.push(a);}r=tmp;}else if(m[1]==":"&&m[2]=="nth-child"){var merge={},tmp=[],test=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(m[3]=="even"&&"2n"||m[3]=="odd"&&"2n+1"||!/\D/.test(m[3])&&"0n+"+m[3]||m[3]),first=(test[1]+(test[2]||1))-0,last=test[3]-0;for(var i=0,rl=r.length;i=0)add=true;if(add^not)tmp.push(node);}r=tmp;}else{var fn=jQuery.expr[m[1]];if(typeof fn=="object")fn=fn[m[2]];if(typeof fn=="string")fn=eval("false||function(a,i){return "+fn+";}");r=jQuery.grep(r,function(elem,i){return fn(elem,i,m,r);},not);}}return{r:r,t:t};},dir:function(elem,dir){var matched=[],cur=elem[dir];while(cur&&cur!=document){if(cur.nodeType==1)matched.push(cur);cur=cur[dir];}return matched;},nth:function(cur,result,dir,elem){result=result||1;var num=0;for(;cur;cur=cur[dir])if(cur.nodeType==1&&++num==result)break;return cur;},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType==1&&n!=elem)r.push(n);}return r;}});jQuery.event={add:function(elem,types,handler,data){if(elem.nodeType==3||elem.nodeType==8)return;if(jQuery.browser.msie&&elem.setInterval)elem=window;if(!handler.guid)handler.guid=this.guid++;if(data!=undefined){var fn=handler;handler=this.proxy(fn,function(){return fn.apply(this,arguments);});handler.data=data;}var events=jQuery.data(elem,"events")||jQuery.data(elem,"events",{}),handle=jQuery.data(elem,"handle")||jQuery.data(elem,"handle",function(){if(typeof jQuery!="undefined"&&!jQuery.event.triggered)return jQuery.event.handle.apply(arguments.callee.elem,arguments);});handle.elem=elem;jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];handler.type=parts[1];var handlers=events[type];if(!handlers){handlers=events[type]={};if(!jQuery.event.special[type]||jQuery.event.special[type].setup.call(elem)===false){if(elem.addEventListener)elem.addEventListener(type,handle,false);else if(elem.attachEvent)elem.attachEvent("on"+type,handle);}}handlers[handler.guid]=handler;jQuery.event.global[type]=true;});elem=null;},guid:1,global:{},remove:function(elem,types,handler){if(elem.nodeType==3||elem.nodeType==8)return;var events=jQuery.data(elem,"events"),ret,index;if(events){if(types==undefined||(typeof types=="string"&&types.charAt(0)=="."))for(var type in events)this.remove(elem,type+(types||""));else{if(types.type){handler=types.handler;types=types.type;}jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];if(events[type]){if(handler)delete events[type][handler.guid];else -for(handler in events[type])if(!parts[1]||events[type][handler].type==parts[1])delete events[type][handler];for(ret in events[type])break;if(!ret){if(!jQuery.event.special[type]||jQuery.event.special[type].teardown.call(elem)===false){if(elem.removeEventListener)elem.removeEventListener(type,jQuery.data(elem,"handle"),false);else if(elem.detachEvent)elem.detachEvent("on"+type,jQuery.data(elem,"handle"));}ret=null;delete events[type];}}});}for(ret in events)break;if(!ret){var handle=jQuery.data(elem,"handle");if(handle)handle.elem=null;jQuery.removeData(elem,"events");jQuery.removeData(elem,"handle");}}},trigger:function(type,data,elem,donative,extra){data=jQuery.makeArray(data);if(type.indexOf("!")>=0){type=type.slice(0,-1);var exclusive=true;}if(!elem){if(this.global[type])jQuery("*").add([window,document]).trigger(type,data);}else{if(elem.nodeType==3||elem.nodeType==8)return undefined;var val,ret,fn=jQuery.isFunction(elem[type]||null),event=!data[0]||!data[0].preventDefault;if(event){data.unshift({type:type,target:elem,preventDefault:function(){},stopPropagation:function(){},timeStamp:now()});data[0][expando]=true;}data[0].type=type;if(exclusive)data[0].exclusive=true;var handle=jQuery.data(elem,"handle");if(handle)val=handle.apply(elem,data);if((!fn||(jQuery.nodeName(elem,'a')&&type=="click"))&&elem["on"+type]&&elem["on"+type].apply(elem,data)===false)val=false;if(event)data.shift();if(extra&&jQuery.isFunction(extra)){ret=extra.apply(elem,val==null?data:data.concat(val));if(ret!==undefined)val=ret;}if(fn&&donative!==false&&val!==false&&!(jQuery.nodeName(elem,'a')&&type=="click")){this.triggered=true;try{elem[type]();}catch(e){}}this.triggered=false;}return val;},handle:function(event){var val,ret,namespace,all,handlers;event=arguments[0]=jQuery.event.fix(event||window.event);namespace=event.type.split(".");event.type=namespace[0];namespace=namespace[1];all=!namespace&&!event.exclusive;handlers=(jQuery.data(this,"events")||{})[event.type];for(var j in handlers){var handler=handlers[j];if(all||handler.type==namespace){event.handler=handler;event.data=handler.data;ret=handler.apply(this,arguments);if(val!==false)val=ret;if(ret===false){event.preventDefault();event.stopPropagation();}}}return val;},fix:function(event){if(event[expando]==true)return event;var originalEvent=event;event={originalEvent:originalEvent};var props="altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" ");for(var i=props.length;i;i--)event[props[i]]=originalEvent[props[i]];event[expando]=true;event.preventDefault=function(){if(originalEvent.preventDefault)originalEvent.preventDefault();originalEvent.returnValue=false;};event.stopPropagation=function(){if(originalEvent.stopPropagation)originalEvent.stopPropagation();originalEvent.cancelBubble=true;};event.timeStamp=event.timeStamp||now();if(!event.target)event.target=event.srcElement||document;if(event.target.nodeType==3)event.target=event.target.parentNode;if(!event.relatedTarget&&event.fromElement)event.relatedTarget=event.fromElement==event.target?event.toElement:event.fromElement;if(event.pageX==null&&event.clientX!=null){var doc=document.documentElement,body=document.body;event.pageX=event.clientX+(doc&&doc.scrollLeft||body&&body.scrollLeft||0)-(doc.clientLeft||0);event.pageY=event.clientY+(doc&&doc.scrollTop||body&&body.scrollTop||0)-(doc.clientTop||0);}if(!event.which&&((event.charCode||event.charCode===0)?event.charCode:event.keyCode))event.which=event.charCode||event.keyCode;if(!event.metaKey&&event.ctrlKey)event.metaKey=event.ctrlKey;if(!event.which&&event.button)event.which=(event.button&1?1:(event.button&2?3:(event.button&4?2:0)));return event;},proxy:function(fn,proxy){proxy.guid=fn.guid=fn.guid||proxy.guid||this.guid++;return proxy;},special:{ready:{setup:function(){bindReady();return;},teardown:function(){return;}},mouseenter:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseover",jQuery.event.special.mouseenter.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseover",jQuery.event.special.mouseenter.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseenter";return jQuery.event.handle.apply(this,arguments);}},mouseleave:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseout",jQuery.event.special.mouseleave.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseout",jQuery.event.special.mouseleave.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseleave";return jQuery.event.handle.apply(this,arguments);}}}};jQuery.fn.extend({bind:function(type,data,fn){return type=="unload"?this.one(type,data,fn):this.each(function(){jQuery.event.add(this,type,fn||data,fn&&data);});},one:function(type,data,fn){var one=jQuery.event.proxy(fn||data,function(event){jQuery(this).unbind(event,one);return(fn||data).apply(this,arguments);});return this.each(function(){jQuery.event.add(this,type,one,fn&&data);});},unbind:function(type,fn){return this.each(function(){jQuery.event.remove(this,type,fn);});},trigger:function(type,data,fn){return this.each(function(){jQuery.event.trigger(type,data,this,true,fn);});},triggerHandler:function(type,data,fn){return this[0]&&jQuery.event.trigger(type,data,this[0],false,fn);},toggle:function(fn){var args=arguments,i=1;while(i=0){var selector=url.slice(off,url.length);url=url.slice(0,off);}callback=callback||function(){};var type="GET";if(params)if(jQuery.isFunction(params)){callback=params;params=null;}else{params=jQuery.param(params);type="POST";}var self=this;jQuery.ajax({url:url,type:type,dataType:"html",data:params,complete:function(res,status){if(status=="success"||status=="notmodified")self.html(selector?jQuery("
").append(res.responseText.replace(//g,"")).find(selector):res.responseText);self.each(callback,[res.responseText,status,res]);}});return this;},serialize:function(){return jQuery.param(this.serializeArray());},serializeArray:function(){return this.map(function(){return jQuery.nodeName(this,"form")?jQuery.makeArray(this.elements):this;}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type));}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:val.constructor==Array?jQuery.map(val,function(val,i){return{name:elem.name,value:val};}):{name:elem.name,value:val};}).get();}});jQuery.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(i,o){jQuery.fn[o]=function(f){return this.bind(o,f);};});var jsc=now();jQuery.extend({get:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data=null;}return jQuery.ajax({type:"GET",url:url,data:data,success:callback,dataType:type});},getScript:function(url,callback){return jQuery.get(url,null,callback,"script");},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json");},post:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data={};}return jQuery.ajax({type:"POST",url:url,data:data,success:callback,dataType:type});},ajaxSetup:function(settings){jQuery.extend(jQuery.ajaxSettings,settings);},ajaxSettings:{url:location.href,global:true,type:"GET",timeout:0,contentType:"application/x-www-form-urlencoded",processData:true,async:true,data:null,username:null,password:null,accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(s){s=jQuery.extend(true,s,jQuery.extend(true,{},jQuery.ajaxSettings,s));var jsonp,jsre=/=\?(&|$)/g,status,data,type=s.type.toUpperCase();if(s.data&&s.processData&&typeof s.data!="string")s.data=jQuery.param(s.data);if(s.dataType=="jsonp"){if(type=="GET"){if(!s.url.match(jsre))s.url+=(s.url.match(/\?/)?"&":"?")+(s.jsonp||"callback")+"=?";}else if(!s.data||!s.data.match(jsre))s.data=(s.data?s.data+"&":"")+(s.jsonp||"callback")+"=?";s.dataType="json";}if(s.dataType=="json"&&(s.data&&s.data.match(jsre)||s.url.match(jsre))){jsonp="jsonp"+jsc++;if(s.data)s.data=(s.data+"").replace(jsre,"="+jsonp+"$1");s.url=s.url.replace(jsre,"="+jsonp+"$1");s.dataType="script";window[jsonp]=function(tmp){data=tmp;success();complete();window[jsonp]=undefined;try{delete window[jsonp];}catch(e){}if(head)head.removeChild(script);};}if(s.dataType=="script"&&s.cache==null)s.cache=false;if(s.cache===false&&type=="GET"){var ts=now();var ret=s.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+ts+"$2");s.url=ret+((ret==s.url)?(s.url.match(/\?/)?"&":"?")+"_="+ts:"");}if(s.data&&type=="GET"){s.url+=(s.url.match(/\?/)?"&":"?")+s.data;s.data=null;}if(s.global&&!jQuery.active++)jQuery.event.trigger("ajaxStart");var remote=/^(?:\w+:)?\/\/([^\/?#]+)/;if(s.dataType=="script"&&type=="GET"&&remote.test(s.url)&&remote.exec(s.url)[1]!=location.host){var head=document.getElementsByTagName("head")[0];var script=document.createElement("script");script.src=s.url;if(s.scriptCharset)script.charset=s.scriptCharset;if(!jsonp){var done=false;script.onload=script.onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){done=true;success();complete();head.removeChild(script);}};}head.appendChild(script);return undefined;}var requestDone=false;var xhr=window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();if(s.username)xhr.open(type,s.url,s.async,s.username,s.password);else -xhr.open(type,s.url,s.async);try{if(s.data)xhr.setRequestHeader("Content-Type",s.contentType);if(s.ifModified)xhr.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url]||"Thu, 01 Jan 1970 00:00:00 GMT");xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");xhr.setRequestHeader("Accept",s.dataType&&s.accepts[s.dataType]?s.accepts[s.dataType]+", */*":s.accepts._default);}catch(e){}if(s.beforeSend&&s.beforeSend(xhr,s)===false){s.global&&jQuery.active--;xhr.abort();return false;}if(s.global)jQuery.event.trigger("ajaxSend",[xhr,s]);var onreadystatechange=function(isTimeout){if(!requestDone&&xhr&&(xhr.readyState==4||isTimeout=="timeout")){requestDone=true;if(ival){clearInterval(ival);ival=null;}status=isTimeout=="timeout"&&"timeout"||!jQuery.httpSuccess(xhr)&&"error"||s.ifModified&&jQuery.httpNotModified(xhr,s.url)&&"notmodified"||"success";if(status=="success"){try{data=jQuery.httpData(xhr,s.dataType,s.dataFilter);}catch(e){status="parsererror";}}if(status=="success"){var modRes;try{modRes=xhr.getResponseHeader("Last-Modified");}catch(e){}if(s.ifModified&&modRes)jQuery.lastModified[s.url]=modRes;if(!jsonp)success();}else -jQuery.handleError(s,xhr,status);complete();if(s.async)xhr=null;}};if(s.async){var ival=setInterval(onreadystatechange,13);if(s.timeout>0)setTimeout(function(){if(xhr){xhr.abort();if(!requestDone)onreadystatechange("timeout");}},s.timeout);}try{xhr.send(s.data);}catch(e){jQuery.handleError(s,xhr,null,e);}if(!s.async)onreadystatechange();function success(){if(s.success)s.success(data,status);if(s.global)jQuery.event.trigger("ajaxSuccess",[xhr,s]);}function complete(){if(s.complete)s.complete(xhr,status);if(s.global)jQuery.event.trigger("ajaxComplete",[xhr,s]);if(s.global&&!--jQuery.active)jQuery.event.trigger("ajaxStop");}return xhr;},handleError:function(s,xhr,status,e){if(s.error)s.error(xhr,status,e);if(s.global)jQuery.event.trigger("ajaxError",[xhr,s,e]);},active:0,httpSuccess:function(xhr){try{return!xhr.status&&location.protocol=="file:"||(xhr.status>=200&&xhr.status<300)||xhr.status==304||xhr.status==1223||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpNotModified:function(xhr,url){try{var xhrRes=xhr.getResponseHeader("Last-Modified");return xhr.status==304||xhrRes==jQuery.lastModified[url]||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpData:function(xhr,type,filter){var ct=xhr.getResponseHeader("content-type"),xml=type=="xml"||!type&&ct&&ct.indexOf("xml")>=0,data=xml?xhr.responseXML:xhr.responseText;if(xml&&data.documentElement.tagName=="parsererror")throw"parsererror";if(filter)data=filter(data,type);if(type=="script")jQuery.globalEval(data);if(type=="json")data=eval("("+data+")");return data;},param:function(a){var s=[];if(a.constructor==Array||a.jquery)jQuery.each(a,function(){s.push(encodeURIComponent(this.name)+"="+encodeURIComponent(this.value));});else -for(var j in a)if(a[j]&&a[j].constructor==Array)jQuery.each(a[j],function(){s.push(encodeURIComponent(j)+"="+encodeURIComponent(this));});else -s.push(encodeURIComponent(j)+"="+encodeURIComponent(jQuery.isFunction(a[j])?a[j]():a[j]));return s.join("&").replace(/%20/g,"+");}});jQuery.fn.extend({show:function(speed,callback){return speed?this.animate({height:"show",width:"show",opacity:"show"},speed,callback):this.filter(":hidden").each(function(){this.style.display=this.oldblock||"";if(jQuery.css(this,"display")=="none"){var elem=jQuery("<"+this.tagName+" />").appendTo("body");this.style.display=elem.css("display");if(this.style.display=="none")this.style.display="block";elem.remove();}}).end();},hide:function(speed,callback){return speed?this.animate({height:"hide",width:"hide",opacity:"hide"},speed,callback):this.filter(":visible").each(function(){this.oldblock=this.oldblock||jQuery.css(this,"display");this.style.display="none";}).end();},_toggle:jQuery.fn.toggle,toggle:function(fn,fn2){return jQuery.isFunction(fn)&&jQuery.isFunction(fn2)?this._toggle.apply(this,arguments):fn?this.animate({height:"toggle",width:"toggle",opacity:"toggle"},fn,fn2):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();});},slideDown:function(speed,callback){return this.animate({height:"show"},speed,callback);},slideUp:function(speed,callback){return this.animate({height:"hide"},speed,callback);},slideToggle:function(speed,callback){return this.animate({height:"toggle"},speed,callback);},fadeIn:function(speed,callback){return this.animate({opacity:"show"},speed,callback);},fadeOut:function(speed,callback){return this.animate({opacity:"hide"},speed,callback);},fadeTo:function(speed,to,callback){return this.animate({opacity:to},speed,callback);},animate:function(prop,speed,easing,callback){var optall=jQuery.speed(speed,easing,callback);return this[optall.queue===false?"each":"queue"](function(){if(this.nodeType!=1)return false;var opt=jQuery.extend({},optall),p,hidden=jQuery(this).is(":hidden"),self=this;for(p in prop){if(prop[p]=="hide"&&hidden||prop[p]=="show"&&!hidden)return opt.complete.call(this);if(p=="height"||p=="width"){opt.display=jQuery.css(this,"display");opt.overflow=this.style.overflow;}}if(opt.overflow!=null)this.style.overflow="hidden";opt.curAnim=jQuery.extend({},prop);jQuery.each(prop,function(name,val){var e=new jQuery.fx(self,opt,name);if(/toggle|show|hide/.test(val))e[val=="toggle"?hidden?"show":"hide":val](prop);else{var parts=val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),start=e.cur(true)||0;if(parts){var end=parseFloat(parts[2]),unit=parts[3]||"px";if(unit!="px"){self.style[name]=(end||1)+unit;start=((end||1)/e.cur(true))*start;self.style[name]=start+unit;}if(parts[1])end=((parts[1]=="-="?-1:1)*end)+start;e.custom(start,end,unit);}else -e.custom(start,val,"");}});return true;});},queue:function(type,fn){if(jQuery.isFunction(type)||(type&&type.constructor==Array)){fn=type;type="fx";}if(!type||(typeof type=="string"&&!fn))return queue(this[0],type);return this.each(function(){if(fn.constructor==Array)queue(this,type,fn);else{queue(this,type).push(fn);if(queue(this,type).length==1)fn.call(this);}});},stop:function(clearQueue,gotoEnd){var timers=jQuery.timers;if(clearQueue)this.queue([]);this.each(function(){for(var i=timers.length-1;i>=0;i--)if(timers[i].elem==this){if(gotoEnd)timers[i](true);timers.splice(i,1);}});if(!gotoEnd)this.dequeue();return this;}});var queue=function(elem,type,array){if(elem){type=type||"fx";var q=jQuery.data(elem,type+"queue");if(!q||array)q=jQuery.data(elem,type+"queue",jQuery.makeArray(array));}return q;};jQuery.fn.dequeue=function(type){type=type||"fx";return this.each(function(){var q=queue(this,type);q.shift();if(q.length)q[0].call(this);});};jQuery.extend({speed:function(speed,easing,fn){var opt=speed&&speed.constructor==Object?speed:{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&easing.constructor!=Function&&easing};opt.duration=(opt.duration&&opt.duration.constructor==Number?opt.duration:jQuery.fx.speeds[opt.duration])||jQuery.fx.speeds.def;opt.old=opt.complete;opt.complete=function(){if(opt.queue!==false)jQuery(this).dequeue();if(jQuery.isFunction(opt.old))opt.old.call(this);};return opt;},easing:{linear:function(p,n,firstNum,diff){return firstNum+diff*p;},swing:function(p,n,firstNum,diff){return((-Math.cos(p*Math.PI)/2)+0.5)*diff+firstNum;}},timers:[],timerId:null,fx:function(elem,options,prop){this.options=options;this.elem=elem;this.prop=prop;if(!options.orig)options.orig={};}});jQuery.fx.prototype={update:function(){if(this.options.step)this.options.step.call(this.elem,this.now,this);(jQuery.fx.step[this.prop]||jQuery.fx.step._default)(this);if(this.prop=="height"||this.prop=="width")this.elem.style.display="block";},cur:function(force){if(this.elem[this.prop]!=null&&this.elem.style[this.prop]==null)return this.elem[this.prop];var r=parseFloat(jQuery.css(this.elem,this.prop,force));return r&&r>-10000?r:parseFloat(jQuery.curCSS(this.elem,this.prop))||0;},custom:function(from,to,unit){this.startTime=now();this.start=from;this.end=to;this.unit=unit||this.unit||"px";this.now=this.start;this.pos=this.state=0;this.update();var self=this;function t(gotoEnd){return self.step(gotoEnd);}t.elem=this.elem;jQuery.timers.push(t);if(jQuery.timerId==null){jQuery.timerId=setInterval(function(){var timers=jQuery.timers;for(var i=0;ithis.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var done=true;for(var i in this.options.curAnim)if(this.options.curAnim[i]!==true)done=false;if(done){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(jQuery.css(this.elem,"display")=="none")this.elem.style.display="block";}if(this.options.hide)this.elem.style.display="none";if(this.options.hide||this.options.show)for(var p in this.options.curAnim)jQuery.attr(this.elem.style,p,this.options.orig[p]);}if(done)this.options.complete.call(this.elem);return false;}else{var n=t-this.startTime;this.state=n/this.options.duration;this.pos=jQuery.easing[this.options.easing||(jQuery.easing.swing?"swing":"linear")](this.state,n,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update();}return true;}};jQuery.extend(jQuery.fx,{speeds:{slow:600,fast:200,def:400},step:{scrollLeft:function(fx){fx.elem.scrollLeft=fx.now;},scrollTop:function(fx){fx.elem.scrollTop=fx.now;},opacity:function(fx){jQuery.attr(fx.elem.style,"opacity",fx.now);},_default:function(fx){fx.elem.style[fx.prop]=fx.now+fx.unit;}}});jQuery.fn.offset=function(){var left=0,top=0,elem=this[0],results;if(elem)with(jQuery.browser){var parent=elem.parentNode,offsetChild=elem,offsetParent=elem.offsetParent,doc=elem.ownerDocument,safari2=safari&&parseInt(version)<522&&!/adobeair/i.test(userAgent),css=jQuery.curCSS,fixed=css(elem,"position")=="fixed";if(elem.getBoundingClientRect){var box=elem.getBoundingClientRect();add(box.left+Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),box.top+Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));add(-doc.documentElement.clientLeft,-doc.documentElement.clientTop);}else{add(elem.offsetLeft,elem.offsetTop);while(offsetParent){add(offsetParent.offsetLeft,offsetParent.offsetTop);if(mozilla&&!/^t(able|d|h)$/i.test(offsetParent.tagName)||safari&&!safari2)border(offsetParent);if(!fixed&&css(offsetParent,"position")=="fixed")fixed=true;offsetChild=/^body$/i.test(offsetParent.tagName)?offsetChild:offsetParent;offsetParent=offsetParent.offsetParent;}while(parent&&parent.tagName&&!/^body|html$/i.test(parent.tagName)){if(!/^inline|table.*$/i.test(css(parent,"display")))add(-parent.scrollLeft,-parent.scrollTop);if(mozilla&&css(parent,"overflow")!="visible")border(parent);parent=parent.parentNode;}if((safari2&&(fixed||css(offsetChild,"position")=="absolute"))||(mozilla&&css(offsetChild,"position")!="absolute"))add(-doc.body.offsetLeft,-doc.body.offsetTop);if(fixed)add(Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));}results={top:top,left:left};}function border(elem){add(jQuery.curCSS(elem,"borderLeftWidth",true),jQuery.curCSS(elem,"borderTopWidth",true));}function add(l,t){left+=parseInt(l,10)||0;top+=parseInt(t,10)||0;}return results;};jQuery.fn.extend({position:function(){var left=0,top=0,results;if(this[0]){var offsetParent=this.offsetParent(),offset=this.offset(),parentOffset=/^body|html$/i.test(offsetParent[0].tagName)?{top:0,left:0}:offsetParent.offset();offset.top-=num(this,'marginTop');offset.left-=num(this,'marginLeft');parentOffset.top+=num(offsetParent,'borderTopWidth');parentOffset.left+=num(offsetParent,'borderLeftWidth');results={top:offset.top-parentOffset.top,left:offset.left-parentOffset.left};}return results;},offsetParent:function(){var offsetParent=this[0].offsetParent;while(offsetParent&&(!/^body|html$/i.test(offsetParent.tagName)&&jQuery.css(offsetParent,'position')=='static'))offsetParent=offsetParent.offsetParent;return jQuery(offsetParent);}});jQuery.each(['Left','Top'],function(i,name){var method='scroll'+name;jQuery.fn[method]=function(val){if(!this[0])return;return val!=undefined?this.each(function(){this==window||this==document?window.scrollTo(!i?val:jQuery(window).scrollLeft(),i?val:jQuery(window).scrollTop()):this[method]=val;}):this[0]==window||this[0]==document?self[i?'pageYOffset':'pageXOffset']||jQuery.boxModel&&document.documentElement[method]||document.body[method]:this[0][method];};});jQuery.each(["Height","Width"],function(i,name){var tl=i?"Left":"Top",br=i?"Right":"Bottom";jQuery.fn["inner"+name]=function(){return this[name.toLowerCase()]()+num(this,"padding"+tl)+num(this,"padding"+br);};jQuery.fn["outer"+name]=function(margin){return this["inner"+name]()+num(this,"border"+tl+"Width")+num(this,"border"+br+"Width")+(margin?num(this,"margin"+tl)+num(this,"margin"+br):0);};});})(); \ No newline at end of file diff --git a/Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/js/quicksearch.js b/Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/js/quicksearch.js deleted file mode 100644 index ef9343c7c..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/js/quicksearch.js +++ /dev/null @@ -1,114 +0,0 @@ -/** - * - * JQuery QuickSearch - Hook up a form field to hide non-matching elements. - * $Id: quicksearch.js 53 2009-01-07 02:52:03Z deveiant $ - * - * Author: Michael Granger - * - */ -jQuery.fn.quicksearch = function( target, searchElems, options ) { - // console.debug( "Quicksearch fn" ); - - var settings = { - delay: 250, - clearButton: false, - highlightMatches: false, - focusOnLoad: false, - noSearchResultsIndicator: null - }; - if ( options ) $.extend( settings, options ); - - return jQuery(this).each( function() { - // console.debug( "Creating a new quicksearch on %o for %o", this, searchElems ); - new jQuery.quicksearch( this, searchElems, settings ); - }); -}; - - -jQuery.quicksearch = function( searchBox, searchElems, settings ) { - var timeout; - var boxdiv = $(searchBox).parents('div').eq(0); - - function init() { - setupKeyEventHandlers(); - focusOnLoad(); - }; - - function setupKeyEventHandlers() { - // console.debug( "Hooking up the 'keypress' event to %o", searchBox ); - $(searchBox). - unbind( 'keyup' ). - keyup( function(e) { return onSearchKey( e.keyCode ); }); - $(searchBox). - unbind( 'keypress' ). - keypress( function(e) { - switch( e.which ) { - // Execute the search on Enter, Tab, or Newline - case 9: - case 13: - case 10: - clearTimeout( timeout ); - e.preventDefault(); - doQuickSearch(); - break; - - // Allow backspace - case 8: - return true; - break; - - // Only allow valid search characters - default: - return validQSChar( e.charCode ); - } - }); - }; - - function focusOnLoad() { - if ( !settings.focusOnLoad ) return false; - $(searchBox).focus(); - }; - - function onSearchKey ( code ) { - clearTimeout( timeout ); - // console.debug( "...scheduling search." ); - timeout = setTimeout( doQuickSearch, settings.delay ); - }; - - function validQSChar( code ) { - var c = String.fromCharCode( code ); - return ( - (c == ':') || - (c >= 'a' && c <= 'z') || - (c >= 'A' && c <= 'Z') - ); - }; - - function doQuickSearch() { - var searchText = searchBox.value; - var pat = new RegExp( searchText, "im" ); - var shownCount = 0; - - if ( settings.noSearchResultsIndicator ) { - $('#' + settings.noSearchResultsIndicator).hide(); - } - - // All elements start out hidden - $(searchElems).each( function(index) { - var str = $(this).text(); - - if ( pat.test(str) ) { - shownCount += 1; - $(this).fadeIn(); - } else { - $(this).hide(); - } - }); - - if ( shownCount == 0 && settings.noSearchResultsIndicator ) { - $('#' + settings.noSearchResultsIndicator).slideDown(); - } - }; - - init(); -}; diff --git a/Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/js/thickbox-compressed.js b/Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/js/thickbox-compressed.js deleted file mode 100644 index e67e0872c..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/generator/template/darkfish/js/thickbox-compressed.js +++ /dev/null @@ -1,10 +0,0 @@ -/* - * Thickbox 3 - One Box To Rule Them All. - * By Cody Lindley (http://www.codylindley.com) - * Copyright (c) 2007 cody lindley - * Licensed under the MIT License: http://www.opensource.org/licenses/mit-license.php -*/ - -var tb_pathToImage = "../images/loadingAnimation.gif"; - -eval(function(p,a,c,k,e,r){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('$(o).2S(9(){1u(\'a.18, 3n.18, 3i.18\');1w=1p 1t();1w.L=2H});9 1u(b){$(b).s(9(){6 t=X.Q||X.1v||M;6 a=X.u||X.23;6 g=X.1N||P;19(t,a,g);X.2E();H P})}9 19(d,f,g){3m{3(2t o.v.J.2i==="2g"){$("v","11").r({A:"28%",z:"28%"});$("11").r("22","2Z");3(o.1Y("1F")===M){$("v").q("<4 5=\'B\'><4 5=\'8\'>");$("#B").s(G)}}n{3(o.1Y("B")===M){$("v").q("<4 5=\'B\'><4 5=\'8\'>");$("#B").s(G)}}3(1K()){$("#B").1J("2B")}n{$("#B").1J("2z")}3(d===M){d=""}$("v").q("<4 5=\'K\'><1I L=\'"+1w.L+"\' />");$(\'#K\').2y();6 h;3(f.O("?")!==-1){h=f.3l(0,f.O("?"))}n{h=f}6 i=/\\.2s$|\\.2q$|\\.2m$|\\.2l$|\\.2k$/;6 j=h.1C().2h(i);3(j==\'.2s\'||j==\'.2q\'||j==\'.2m\'||j==\'.2l\'||j==\'.2k\'){1D="";1G="";14="";1z="";1x="";R="";1n="";1r=P;3(g){E=$("a[@1N="+g+"]").36();25(D=0;((D&1d;&1d;2T &2R;"}n{1D=E[D].Q;1G=E[D].u;14="<1e 5=\'1U\'>&1d;&1d;&2O; 2N"}}n{1r=1b;1n="1t "+(D+1)+" 2L "+(E.1c)}}}S=1p 1t();S.1g=9(){S.1g=M;6 a=2x();6 x=a[0]-1M;6 y=a[1]-1M;6 b=S.z;6 c=S.A;3(b>x){c=c*(x/b);b=x;3(c>y){b=b*(y/c);c=y}}n 3(c>y){b=b*(y/c);c=y;3(b>x){c=c*(x/b);b=x}}13=b+30;1a=c+2G;$("#8").q("<1I 5=\'2F\' L=\'"+f+"\' z=\'"+b+"\' A=\'"+c+"\' 23=\'"+d+"\'/>"+"<4 5=\'2D\'>"+d+"<4 5=\'2C\'>"+1n+14+R+"<4 5=\'2A\'>1l 1k 1j 1s");$("#Z").s(G);3(!(14==="")){9 12(){3($(o).N("s",12)){$(o).N("s",12)}$("#8").C();$("v").q("<4 5=\'8\'>");19(1D,1G,g);H P}$("#1U").s(12)}3(!(R==="")){9 1i(){$("#8").C();$("v").q("<4 5=\'8\'>");19(1z,1x,g);H P}$("#1X").s(1i)}o.1h=9(e){3(e==M){I=2w.2v}n{I=e.2u}3(I==27){G()}n 3(I==3k){3(!(R=="")){o.1h="";1i()}}n 3(I==3j){3(!(14=="")){o.1h="";12()}}};16();$("#K").C();$("#1L").s(G);$("#8").r({Y:"T"})};S.L=f}n{6 l=f.2r(/^[^\\?]+\\??/,\'\');6 m=2p(l);13=(m[\'z\']*1)+30||3h;1a=(m[\'A\']*1)+3g||3f;W=13-30;V=1a-3e;3(f.O(\'2j\')!=-1){1E=f.1B(\'3d\');$("#15").C();3(m[\'1A\']!="1b"){$("#8").q("<4 5=\'2f\'><4 5=\'1H\'>"+d+"<4 5=\'2e\'>1l 1k 1j 1s ")}n{$("#B").N();$("#8").q(" ")}}n{3($("#8").r("Y")!="T"){3(m[\'1A\']!="1b"){$("#8").q("<4 5=\'2f\'><4 5=\'1H\'>"+d+"<4 5=\'2e\'>1l 1k 1j 1s<4 5=\'F\' J=\'z:"+W+"p;A:"+V+"p\'>")}n{$("#B").N();$("#8").q("<4 5=\'F\' 3c=\'3b\' J=\'z:"+W+"p;A:"+V+"p;\'>")}}n{$("#F")[0].J.z=W+"p";$("#F")[0].J.A=V+"p";$("#F")[0].3a=0;$("#1H").11(d)}}$("#Z").s(G);3(f.O(\'37\')!=-1){$("#F").q($(\'#\'+m[\'26\']).1T());$("#8").24(9(){$(\'#\'+m[\'26\']).q($("#F").1T())});16();$("#K").C();$("#8").r({Y:"T"})}n 3(f.O(\'2j\')!=-1){16();3($.1q.35){$("#K").C();$("#8").r({Y:"T"})}}n{$("#F").34(f+="&1y="+(1p 33().32()),9(){16();$("#K").C();1u("#F a.18");$("#8").r({Y:"T"})})}}3(!m[\'1A\']){o.21=9(e){3(e==M){I=2w.2v}n{I=e.2u}3(I==27){G()}}}}31(e){}}9 1m(){$("#K").C();$("#8").r({Y:"T"})}9 G(){$("#2Y").N("s");$("#Z").N("s");$("#8").2X("2W",9(){$(\'#8,#B,#1F\').2V("24").N().C()});$("#K").C();3(2t o.v.J.2i=="2g"){$("v","11").r({A:"1Z",z:"1Z"});$("11").r("22","")}o.1h="";o.21="";H P}9 16(){$("#8").r({2U:\'-\'+20((13/2),10)+\'p\',z:13+\'p\'});3(!(1V.1q.2Q&&1V.1q.2P<7)){$("#8").r({38:\'-\'+20((1a/2),10)+\'p\'})}}9 2p(a){6 b={};3(!a){H b}6 c=a.1B(/[;&]/);25(6 i=0;i - * - */ - -/* Base Green is: #6C8C22 */ - -*{ padding: 0; margin: 0; } - -body { - background: #efefef; - font: 14px "Helvetica Neue", Helvetica, Tahoma, sans-serif; -} -body.class, body.module, body.file { - margin-left: 40px; -} -body.file-popup { - font-size: 90%; - margin-left: 0; -} - -h1 { - font-size: 300%; - text-shadow: rgba(135,145,135,0.65) 2px 2px 3px; - color: #6C8C22; -} -h2,h3,h4 { margin-top: 1.5em; } - -:link, -:visited { - color: #6C8C22; - text-decoration: none; -} -:link:hover, -:visited:hover { - border-bottom: 1px dotted #6C8C22; -} - -pre { - background: #ddd; - padding: 0.5em 0; -} - - -/* @group Generic Classes */ - -.initially-hidden { - display: none; -} - -.quicksearch-field { - width: 98%; - background: #ddd; - border: 1px solid #aaa; - height: 1.5em; - -webkit-border-radius: 4px; -} -.quicksearch-field:focus { - background: #f1edba; -} - -.missing-docs { - font-size: 120%; - background: white url(images/wrench_orange.png) no-repeat 4px center; - color: #ccc; - line-height: 2em; - border: 1px solid #d00; - opacity: 1; - padding-left: 20px; - text-indent: 24px; - letter-spacing: 3px; - font-weight: bold; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; -} - -.target-section { - border: 2px solid #dcce90; - border-left-width: 8px; - padding: 0 1em; - background: #fff3c2; -} - -/* @end */ - - -/* @group Index Page, Standalone file pages */ -body.indexpage { - margin: 1em 3em; -} -body.indexpage p, -body.indexpage div, -body.file p { - margin: 1em 0; -} - -.indexpage ul, -.file #documentation ul { - line-height: 160%; - list-style: none; -} -.indexpage ul :link, -.indexpage ul :visited { - font-size: 16px; -} - -.indexpage li, -.file #documentation li { - padding-left: 20px; - background: url(images/bullet_black.png) no-repeat left 4px; -} -.indexpage li.module { - background: url(images/package.png) no-repeat left 4px; -} -.indexpage li.class { - background: url(images/ruby.png) no-repeat left 4px; -} -.indexpage li.file { - background: url(images/page_white_text.png) no-repeat left 4px; -} -.file li p, -.indexpage li p { - margin: 0 0; -} - -/* @end */ - -/* @group Top-Level Structure */ - -.class #metadata, -.file #metadata, -.module #metadata { - float: left; - width: 260px; -} - -.class #documentation, -.file #documentation, -.module #documentation { - margin: 2em 1em 5em 300px; - min-width: 340px; -} - -.file #metadata { - margin: 0.8em; -} - -#validator-badges { - clear: both; - margin: 1em 1em 2em; -} - -/* @end */ - -/* @group Metadata Section */ -#metadata .section { - background-color: #dedede; - -moz-border-radius: 5px; - -webkit-border-radius: 5px; - border: 1px solid #aaa; - margin: 0 8px 16px; - font-size: 90%; - overflow: hidden; -} -#metadata h3.section-header { - margin: 0; - padding: 2px 8px; - background: #ccc; - color: #666; - -moz-border-radius-topleft: 4px; - -moz-border-radius-topright: 4px; - -webkit-border-top-left-radius: 4px; - -webkit-border-top-right-radius: 4px; - border-bottom: 1px solid #aaa; -} -#metadata #home-section h3.section-header { - border-bottom: 0; -} - -#metadata ul, -#metadata dl, -#metadata p { - padding: 8px; - list-style: none; -} - -#file-metadata ul { - padding-left: 28px; - list-style-image: url(images/page_green.png); -} - -dl.svninfo { - color: #666; - margin: 0; -} -dl.svninfo dt { - font-weight: bold; -} - -ul.link-list li { - white-space: nowrap; -} -ul.link-list .type { - font-size: 8px; - text-transform: uppercase; - color: white; - background: #969696; - padding: 2px 4px; - -webkit-border-radius: 5px; -} - -/* @end */ - - -/* @group Project Metadata Section */ -#project-metadata { - margin-top: 3em; -} - -.file #project-metadata { - margin-top: 0em; -} - -#project-metadata .section { - border: 1px solid #aaa; -} -#project-metadata h3.section-header { - border-bottom: 1px solid #aaa; - position: relative; -} -#project-metadata h3.section-header .search-toggle { - position: absolute; - right: 5px; -} - - -#project-metadata form { - color: #777; - background: #ccc; - padding: 8px 8px 16px; - border-bottom: 1px solid #bbb; -} -#project-metadata fieldset { - border: 0; -} - -#no-class-search-results { - margin: 0 auto 1em; - text-align: center; - font-size: 14px; - font-weight: bold; - color: #aaa; -} - -/* @end */ - - -/* @group Documentation Section */ -#description { - font-size: 100%; - color: #333; -} - -#description p { - margin: 1em 0.4em; -} - -#description li p { - margin: 0; -} - -#description ul { - margin-left: 1.5em; -} -#description ul li { - line-height: 1.4em; -} - -#description dl, -#documentation dl { - margin: 8px 1.5em; - border: 1px solid #ccc; -} -#description dl { - font-size: 14px; -} - -#description dt, -#documentation dt { - padding: 2px 4px; - font-weight: bold; - background: #ddd; -} -#description dd, -#documentation dd { - padding: 2px 12px; -} -#description dd + dt, -#documentation dd + dt { - margin-top: 0.7em; -} - -#documentation .section { - font-size: 90%; -} -#documentation h3.section-header { - margin-top: 2em; - padding: 0.75em 0.5em; - background-color: #dedede; - color: #333; - font-size: 150%; - border: 1px solid #bbb; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; -} - -#constants-list > dl, -#attributes-list > dl { - margin: 1em 0 2em; - border: 0; -} -#constants-list > dl dt, -#attributes-list > dl dt { - padding-left: 0; - font-weight: bold; - font-family: Monaco, "Andale Mono"; - background: inherit; -} -#constants-list > dl dt a, -#attributes-list > dl dt a { - color: inherit; -} -#constants-list > dl dd, -#attributes-list > dl dd { - margin: 0 0 1em 0; - padding: 0; - color: #666; -} - -/* @group Method Details */ - -#documentation .method-source-code { - display: none; -} - -#documentation .method-detail { - margin: 0.5em 0; - padding: 0.5em 0; - cursor: pointer; -} -#documentation .method-detail:hover { - background-color: #f1edba; -} -#documentation .method-heading { - position: relative; - padding: 2px 4px 0 20px; - font-size: 125%; - font-weight: bold; - color: #333; - background: url(images/brick.png) no-repeat left bottom; -} -#documentation .method-heading :link, -#documentation .method-heading :visited { - color: inherit; -} -#documentation .method-click-advice { - position: absolute; - top: 2px; - right: 5px; - font-size: 10px; - color: #9b9877; - visibility: hidden; - padding-right: 20px; - line-height: 20px; - background: url(images/zoom.png) no-repeat right top; -} -#documentation .method-detail:hover .method-click-advice { - visibility: visible; -} - -#documentation .method-alias .method-heading { - color: #666; - background: url(images/brick_link.png) no-repeat left bottom; -} - -#documentation .method-description, -#documentation .aliases { - margin: 0 20px; - line-height: 1.2em; - color: #666; -} -#documentation .aliases { - padding-top: 4px; - font-style: italic; - cursor: default; -} -#documentation .method-description p { - padding: 0; -} -#documentation .method-description p + p { - margin-bottom: 0.5em; -} -#documentation .method-description ul { - margin-left: 1.5em; -} - -#documentation .attribute-method-heading { - background: url(images/tag_green.png) no-repeat left bottom; -} -#documentation #attribute-method-details .method-detail:hover { - background-color: transparent; - cursor: default; -} -#documentation .attribute-access-type { - font-size: 60%; - text-transform: uppercase; - vertical-align: super; - padding: 0 2px; -} -/* @end */ - -/* @end */ - - - -/* @group Source Code */ - -div.method-source-code { - background: #262626; - color: #efefef; - margin: 1em; - padding: 0.5em; - border: 1px dashed #999; - overflow: hidden; -} - -div.method-source-code pre { - background: inherit; - padding: 0; - color: white; - overflow: auto; -} - -/* @group Ruby keyword styles */ - -.ruby-constant { color: #7fffd4; background: transparent; } -.ruby-keyword { color: #00ffff; background: transparent; } -.ruby-ivar { color: #eedd82; background: transparent; } -.ruby-operator { color: #00ffee; background: transparent; } -.ruby-identifier { color: #ffdead; background: transparent; } -.ruby-node { color: #ffa07a; background: transparent; } -.ruby-comment { color: #b22222; font-weight: bold; background: transparent; } -.ruby-regexp { color: #ffa07a; background: transparent; } -.ruby-value { color: #7fffd4; background: transparent; } - -/* @end */ -/* @end */ - - -/* @group File Popup Contents */ - -.file #metadata, -.file-popup #metadata { -} - -.file-popup dl { - font-size: 80%; - padding: 0.75em; - background-color: #dedede; - color: #333; - border: 1px solid #bbb; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; -} -.file dt { - font-weight: bold; - padding-left: 22px; - line-height: 20px; - background: url(images/page_white_width.png) no-repeat left top; -} -.file dt.modified-date { - background: url(images/date.png) no-repeat left top; -} -.file dt.requires { - background: url(images/plugin.png) no-repeat left top; -} -.file dt.scs-url { - background: url(images/wrench.png) no-repeat left top; -} - -.file dl dd { - margin: 0 0 1em 0; -} -.file #metadata dl dd ul { - list-style: circle; - margin-left: 20px; - padding-top: 0; -} -.file #metadata dl dd ul li { -} - - -.file h2 { - margin-top: 2em; - padding: 0.75em 0.5em; - background-color: #dedede; - color: #333; - font-size: 120%; - border: 1px solid #bbb; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; -} - -/* @end */ - - - - -/* @group ThickBox Styles */ -#TB_window { - font: 12px Arial, Helvetica, sans-serif; - color: #333333; -} - -#TB_secondLine { - font: 10px Arial, Helvetica, sans-serif; - color:#666666; -} - -#TB_window :link, -#TB_window :visited { color: #666666; } -#TB_window :link:hover, -#TB_window :visited:hover { color: #000; } -#TB_window :link:active, -#TB_window :visited:active { color: #666666; } -#TB_window :link:focus, -#TB_window :visited:focus { color: #666666; } - -#TB_overlay { - position: fixed; - z-index:100; - top: 0px; - left: 0px; - height:100%; - width:100%; -} - -.TB_overlayMacFFBGHack {background: url(images/macFFBgHack.png) repeat;} -.TB_overlayBG { - background-color:#000; - filter:alpha(opacity=75); - -moz-opacity: 0.75; - opacity: 0.75; -} - -* html #TB_overlay { /* ie6 hack */ - position: absolute; - height: expression(document.body.scrollHeight > document.body.offsetHeight ? document.body.scrollHeight : document.body.offsetHeight + 'px'); -} - -#TB_window { - position: fixed; - background: #ffffff; - z-index: 102; - color:#000000; - display:none; - border: 4px solid #525252; - text-align:left; - top:50%; - left:50%; -} - -* html #TB_window { /* ie6 hack */ -position: absolute; -margin-top: expression(0 - parseInt(this.offsetHeight / 2) + (TBWindowMargin = document.documentElement && document.documentElement.scrollTop || document.body.scrollTop) + 'px'); -} - -#TB_window img#TB_Image { - display:block; - margin: 15px 0 0 15px; - border-right: 1px solid #ccc; - border-bottom: 1px solid #ccc; - border-top: 1px solid #666; - border-left: 1px solid #666; -} - -#TB_caption{ - height:25px; - padding:7px 30px 10px 25px; - float:left; -} - -#TB_closeWindow{ - height:25px; - padding:11px 25px 10px 0; - float:right; -} - -#TB_closeAjaxWindow{ - padding:7px 10px 5px 0; - margin-bottom:1px; - text-align:right; - float:right; -} - -#TB_ajaxWindowTitle{ - float:left; - padding:7px 0 5px 10px; - margin-bottom:1px; - font-size: 22px; -} - -#TB_title{ - background-color: #6C8C22; - color: #dedede; - height:40px; -} -#TB_title :link, -#TB_title :visited { - color: white !important; - border-bottom: 1px dotted #dedede; -} - -#TB_ajaxContent{ - clear:both; - padding:2px 15px 15px 15px; - overflow:auto; - text-align:left; - line-height:1.4em; -} - -#TB_ajaxContent.TB_modal{ - padding:15px; -} - -#TB_ajaxContent p{ - padding:5px 0px 5px 0px; -} - -#TB_load{ - position: fixed; - display:none; - height:13px; - width:208px; - z-index:103; - top: 50%; - left: 50%; - margin: -6px 0 0 -104px; /* -height/2 0 0 -width/2 */ -} - -* html #TB_load { /* ie6 hack */ -position: absolute; -margin-top: expression(0 - parseInt(this.offsetHeight / 2) + (TBWindowMargin = document.documentElement && document.documentElement.scrollTop || document.body.scrollTop) + 'px'); -} - -#TB_HideSelect{ - z-index:99; - position:fixed; - top: 0; - left: 0; - background-color:#fff; - border:none; - filter:alpha(opacity=0); - -moz-opacity: 0; - opacity: 0; - height:100%; - width:100%; -} - -* html #TB_HideSelect { /* ie6 hack */ - position: absolute; - height: expression(document.body.scrollHeight > document.body.offsetHeight ? document.body.scrollHeight : document.body.offsetHeight + 'px'); -} - -#TB_iframeContent{ - clear:both; - border:none; - margin-bottom:-1px; - margin-top:1px; - _margin-bottom:1px; -} - -/* @end */ - -/* @group Debugging Section */ - -#debugging-toggle { - text-align: center; -} -#debugging-toggle img { - cursor: pointer; -} - -#rdoc-debugging-section-dump { - display: none; - margin: 0 2em 2em; - background: #ccc; - border: 1px solid #999; -} - - - -/* @end */ diff --git a/Src/StdLib/ruby/1.9.1/rdoc/ghost_method.rb b/Src/StdLib/ruby/1.9.1/rdoc/ghost_method.rb deleted file mode 100644 index 2d9891321..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/ghost_method.rb +++ /dev/null @@ -1,8 +0,0 @@ -require 'rdoc/any_method' - -## -# GhostMethod represents a method referenced only by a comment - -class RDoc::GhostMethod < RDoc::AnyMethod -end - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/include.rb b/Src/StdLib/ruby/1.9.1/rdoc/include.rb deleted file mode 100644 index a27f5da8f..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/include.rb +++ /dev/null @@ -1,61 +0,0 @@ -require 'rdoc/code_object' - -## -# A Module include in a class with \#include - -class RDoc::Include < RDoc::CodeObject - - ## - # Name of included module - - attr_accessor :name - - ## - # Creates a new Include for +name+ with +comment+ - - def initialize(name, comment) - super() - @name = name - self.comment = comment - end - - ## - # Includes are sorted by name - - def <=> other - return unless self.class === other - - name <=> other.name - end - - def == other # :nodoc: - self.class == other.class and - self.name == other.name - end - - ## - # Full name based on #module - - def full_name - m = self.module - RDoc::ClassModule === m ? m.full_name : @name - end - - def inspect # :nodoc: - "#<%s:0x%x %s.include %s>" % [ - self.class, - object_id, - parent_name, @name, - ] - end - - ## - # Attempts to locate the included module object. Returns the name if not - # known. - - def module - RDoc::TopLevel.find_module_named(@name) || @name - end - -end - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/known_classes.rb b/Src/StdLib/ruby/1.9.1/rdoc/known_classes.rb deleted file mode 100644 index a7e397c5f..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/known_classes.rb +++ /dev/null @@ -1,69 +0,0 @@ -module RDoc - - ## - # Ruby's built-in classes, modules and exceptions - - KNOWN_CLASSES = { - "rb_cArray" => "Array", - "rb_cBasicObject" => "BasicObject", - "rb_cBignum" => "Bignum", - "rb_cClass" => "Class", - "rb_cData" => "Data", - "rb_cDir" => "Dir", - "rb_cFalseClass" => "FalseClass", - "rb_cFile" => "File", - "rb_cFixnum" => "Fixnum", - "rb_cFloat" => "Float", - "rb_cHash" => "Hash", - "rb_cIO" => "IO", - "rb_cInteger" => "Integer", - "rb_cModule" => "Module", - "rb_cNilClass" => "NilClass", - "rb_cNumeric" => "Numeric", - "rb_cObject" => "Object", - "rb_cProc" => "Proc", - "rb_cRange" => "Range", - "rb_cRegexp" => "Regexp", - "rb_cRubyVM" => "RubyVM", - "rb_cString" => "String", - "rb_cStruct" => "Struct", - "rb_cSymbol" => "Symbol", - "rb_cThread" => "Thread", - "rb_cTime" => "Time", - "rb_cTrueClass" => "TrueClass", - - "rb_eArgError" => "ArgError", - "rb_eEOFError" => "EOFError", - "rb_eException" => "Exception", - "rb_eFatal" => "Fatal", - "rb_eFloatDomainError" => "FloatDomainError", - "rb_eIOError" => "IOError", - "rb_eIndexError" => "IndexError", - "rb_eInterrupt" => "Interrupt", - "rb_eLoadError" => "LoadError", - "rb_eNameError" => "NameError", - "rb_eNoMemError" => "NoMemError", - "rb_eNotImpError" => "NotImpError", - "rb_eRangeError" => "RangeError", - "rb_eRuntimeError" => "RuntimeError", - "rb_eScriptError" => "ScriptError", - "rb_eSecurityError" => "SecurityError", - "rb_eSignal" => "Signal", - "rb_eStandardError" => "StandardError", - "rb_eSyntaxError" => "SyntaxError", - "rb_eSystemCallError" => "SystemCallError", - "rb_eSystemExit" => "SystemExit", - "rb_eTypeError" => "TypeError", - "rb_eZeroDivError" => "ZeroDivError", - - "rb_mComparable" => "Comparable", - "rb_mEnumerable" => "Enumerable", - "rb_mErrno" => "Errno", - "rb_mFileTest" => "FileTest", - "rb_mGC" => "GC", - "rb_mKernel" => "Kernel", - "rb_mMath" => "Math", - "rb_mProcess" => "Process" - } - -end diff --git a/Src/StdLib/ruby/1.9.1/rdoc/markup.rb b/Src/StdLib/ruby/1.9.1/rdoc/markup.rb deleted file mode 100644 index 65fbceace..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/markup.rb +++ /dev/null @@ -1,124 +0,0 @@ -require 'rdoc' - -## -# RDoc::Markup parses plain text documents and attempts to decompose them into -# their constituent parts. Some of these parts are high-level: paragraphs, -# chunks of verbatim text, list entries and the like. Other parts happen at -# the character level: a piece of bold text, a word in code font. This markup -# is similar in spirit to that used on WikiWiki webs, where folks create web -# pages using a simple set of formatting rules. -# -# RDoc::Markup itself does no output formatting: this is left to a different -# set of classes. -# -# RDoc::Markup is extendable at runtime: you can add \new markup elements to -# be recognised in the documents that RDoc::Markup parses. -# -# RDoc::Markup is intended to be the basis for a family of tools which share -# the common requirement that simple, plain-text should be rendered in a -# variety of different output formats and media. It is envisaged that -# RDoc::Markup could be the basis for formatting RDoc style comment blocks, -# Wiki entries, and online FAQs. -# -# == Synopsis -# -# This code converts +input_string+ to HTML. The conversion takes place in -# the +convert+ method, so you can use the same RDoc::Markup converter to -# convert multiple input strings. -# -# require 'rdoc/markup/to_html' -# -# h = RDoc::Markup::ToHtml.new -# -# puts h.convert(input_string) -# -# You can extend the RDoc::Markup parser to recognise new markup -# sequences, and to add special processing for text that matches a -# regular expression. Here we make WikiWords significant to the parser, -# and also make the sequences {word} and \text... signify -# strike-through text. When then subclass the HTML output class to deal -# with these: -# -# require 'rdoc/markup' -# require 'rdoc/markup/to_html' -# -# class WikiHtml < RDoc::Markup::ToHtml -# def handle_special_WIKIWORD(special) -# "" + special.text + "" -# end -# end -# -# m = RDoc::Markup.new -# m.add_word_pair("{", "}", :STRIKE) -# m.add_html("no", :STRIKE) -# -# m.add_special(/\b([A-Z][a-z]+[A-Z]\w+)/, :WIKIWORD) -# -# wh = WikiHtml.new -# wh.add_tag(:STRIKE, "", "") -# -# puts "#{wh.convert ARGF.read}" -# -#-- -# Author:: Dave Thomas, dave@pragmaticprogrammer.com -# License:: Ruby license - -class RDoc::Markup - - attr_reader :attribute_manager - - ## - # Take a block of text and use various heuristics to determine it's - # structure (paragraphs, lists, and so on). Invoke an event handler as we - # identify significant chunks. - - def initialize - @attribute_manager = RDoc::Markup::AttributeManager.new - @output = nil - end - - ## - # Add to the sequences used to add formatting to an individual word (such - # as *bold*). Matching entries will generate attributes that the output - # formatters can recognize by their +name+. - - def add_word_pair(start, stop, name) - @attribute_manager.add_word_pair(start, stop, name) - end - - ## - # Add to the sequences recognized as general markup. - - def add_html(tag, name) - @attribute_manager.add_html(tag, name) - end - - ## - # Add to other inline sequences. For example, we could add WikiWords using - # something like: - # - # parser.add_special(/\b([A-Z][a-z]+[A-Z]\w+)/, :WIKIWORD) - # - # Each wiki word will be presented to the output formatter via the - # accept_special method. - - def add_special(pattern, name) - @attribute_manager.add_special(pattern, name) - end - - ## - # We take +text+, parse it then invoke the output +formatter+ using a - # Visitor to render the result. - - def convert text, formatter - document = RDoc::Markup::Parser.parse text - - document.accept formatter - end - -end - -require 'rdoc/markup/parser' -require 'rdoc/markup/attribute_manager' -require 'rdoc/markup/inline' - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/markup/attribute_manager.rb b/Src/StdLib/ruby/1.9.1/rdoc/markup/attribute_manager.rb deleted file mode 100644 index 03e94b0d8..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/markup/attribute_manager.rb +++ /dev/null @@ -1,318 +0,0 @@ -## -# Manages changes of attributes in a block of text - -class RDoc::Markup::AttributeManager - - ## - # The NUL character - - NULL = "\000".freeze - - #-- - # We work by substituting non-printing characters in to the text. For now - # I'm assuming that I can substitute a character in the range 0..8 for a 7 - # bit character without damaging the encoded string, but this might be - # optimistic - #++ - - A_PROTECT = 004 # :nodoc: - - PROTECT_ATTR = A_PROTECT.chr # :nodoc: - - ## - # This maps delimiters that occur around words (such as *bold* or +tt+) - # where the start and end delimiters and the same. This lets us optimize - # the regexp - - attr_reader :matching_word_pairs - - ## - # And this is used when the delimiters aren't the same. In this case the - # hash maps a pattern to the attribute character - - attr_reader :word_pair_map - - ## - # This maps HTML tags to the corresponding attribute char - - attr_reader :html_tags - - ## - # A \ in front of a character that would normally be processed turns off - # processing. We do this by turning \< into <#{PROTECT} - - attr_reader :protectable - - ## - # And this maps _special_ sequences to a name. A special sequence is - # something like a WikiWord - - attr_reader :special - - ## - # Creates a new attribute manager that understands bold, emphasized and - # teletype text. - - def initialize - @html_tags = {} - @matching_word_pairs = {} - @protectable = %w[<\\] - @special = {} - @word_pair_map = {} - - add_word_pair "*", "*", :BOLD - add_word_pair "_", "_", :EM - add_word_pair "+", "+", :TT - - add_html "em", :EM - add_html "i", :EM - add_html "b", :BOLD - add_html "tt", :TT - add_html "code", :TT - end - - - ## - # Return an attribute object with the given turn_on and turn_off bits set - - def attribute(turn_on, turn_off) - RDoc::Markup::AttrChanger.new turn_on, turn_off - end - - def change_attribute(current, new) - diff = current ^ new - attribute(new & diff, current & diff) - end - - def changed_attribute_by_name(current_set, new_set) - current = new = 0 - current_set.each do |name| - current |= RDoc::Markup::Attribute.bitmap_for(name) - end - - new_set.each do |name| - new |= RDoc::Markup::Attribute.bitmap_for(name) - end - - change_attribute(current, new) - end - - def copy_string(start_pos, end_pos) - res = @str[start_pos...end_pos] - res.gsub!(/\000/, '') - res - end - - ## - # Map attributes like textto the sequence - # \001\002\001\003, where is a per-attribute specific - # character - - def convert_attrs(str, attrs) - # first do matching ones - tags = @matching_word_pairs.keys.join("") - - re = /(^|\W)([#{tags}])([#:\\]?[\w.\/-]+?\S?)\2(\W|$)/ - - 1 while str.gsub!(re) do - attr = @matching_word_pairs[$2] - attrs.set_attrs($`.length + $1.length + $2.length, $3.length, attr) - $1 + NULL * $2.length + $3 + NULL * $2.length + $4 - end - - # then non-matching - unless @word_pair_map.empty? then - @word_pair_map.each do |regexp, attr| - str.gsub!(regexp) { - attrs.set_attrs($`.length + $1.length, $2.length, attr) - NULL * $1.length + $2 + NULL * $3.length - } - end - end - end - - ## - # Converts HTML tags to RDoc attributes - - def convert_html(str, attrs) - tags = @html_tags.keys.join '|' - - 1 while str.gsub!(/<(#{tags})>(.*?)<\/\1>/i) { - attr = @html_tags[$1.downcase] - html_length = $1.length + 2 - seq = NULL * html_length - attrs.set_attrs($`.length + html_length, $2.length, attr) - seq + $2 + seq + NULL - } - end - - ## - # Converts special sequences to RDoc attributes - - def convert_specials(str, attrs) - unless @special.empty? - @special.each do |regexp, attr| - str.scan(regexp) do - attrs.set_attrs($`.length, $&.length, - attr | RDoc::Markup::Attribute::SPECIAL) - end - end - end - end - - ## - # Escapes special sequences of text to prevent conversion to RDoc - - def mask_protected_sequences - @str.gsub!(/\\([#{Regexp.escape @protectable.join('')}])/, - "\\1#{PROTECT_ATTR}") - end - - ## - # Unescapes special sequences of text - - def unmask_protected_sequences - @str.gsub!(/(.)#{PROTECT_ATTR}/, "\\1\000") - end - - ## - # Adds a markup class with +name+ for words wrapped in the +start+ and - # +stop+ character. To make words wrapped with "*" bold: - # - # am.add_word_pair '*', '*', :BOLD - - def add_word_pair(start, stop, name) - raise ArgumentError, "Word flags may not start with '<'" if - start[0,1] == '<' - - bitmap = RDoc::Markup::Attribute.bitmap_for name - - if start == stop then - @matching_word_pairs[start] = bitmap - else - pattern = /(#{Regexp.escape start})(\S+)(#{Regexp.escape stop})/ - @word_pair_map[pattern] = bitmap - end - - @protectable << start[0,1] - @protectable.uniq! - end - - ## - # Adds a markup class with +name+ for words surrounded by HTML tag +tag+. - # To process emphasis tags: - # - # am.add_html 'em', :EM - - def add_html(tag, name) - @html_tags[tag.downcase] = RDoc::Markup::Attribute.bitmap_for name - end - - ## - # Adds a special handler for +pattern+ with +name+. A simple URL handler - # would be: - # - # @am.add_special(/((https?:)\S+\w)/, :HYPERLINK) - - def add_special(pattern, name) - @special[pattern] = RDoc::Markup::Attribute.bitmap_for name - end - - ## - # Processes +str+ converting attributes, HTML and specials - - def flow(str) - @str = str - - mask_protected_sequences - - @attrs = RDoc::Markup::AttrSpan.new @str.length - - convert_attrs @str, @attrs - convert_html @str, @attrs - convert_specials @str, @attrs - - unmask_protected_sequences - - split_into_flow - end - - ## - # Debug method that prints a string along with its attributes - - def display_attributes - puts - puts @str.tr(NULL, "!") - bit = 1 - 16.times do |bno| - line = "" - @str.length.times do |i| - if (@attrs[i] & bit) == 0 - line << " " - else - if bno.zero? - line << "S" - else - line << ("%d" % (bno+1)) - end - end - end - puts(line) unless line =~ /^ *$/ - bit <<= 1 - end - end - - def split_into_flow - res = [] - current_attr = 0 - str = "" - - str_len = @str.length - - # skip leading invisible text - i = 0 - i += 1 while i < str_len and @str[i].chr == "\0" - start_pos = i - - # then scan the string, chunking it on attribute changes - while i < str_len - new_attr = @attrs[i] - if new_attr != current_attr - if i > start_pos - res << copy_string(start_pos, i) - start_pos = i - end - - res << change_attribute(current_attr, new_attr) - current_attr = new_attr - - if (current_attr & RDoc::Markup::Attribute::SPECIAL) != 0 then - i += 1 while - i < str_len and (@attrs[i] & RDoc::Markup::Attribute::SPECIAL) != 0 - - res << RDoc::Markup::Special.new(current_attr, - copy_string(start_pos, i)) - start_pos = i - next - end - end - - # move on, skipping any invisible characters - begin - i += 1 - end while i < str_len and @str[i].chr == "\0" - end - - # tidy up trailing text - if start_pos < str_len - res << copy_string(start_pos, str_len) - end - - # and reset to all attributes off - res << change_attribute(current_attr, 0) if current_attr != 0 - - res - end - -end - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/markup/blank_line.rb b/Src/StdLib/ruby/1.9.1/rdoc/markup/blank_line.rb deleted file mode 100644 index 3cf97a0a0..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/markup/blank_line.rb +++ /dev/null @@ -1,19 +0,0 @@ -## -# An empty line - -class RDoc::Markup::BlankLine - - def == other # :nodoc: - self.class == other.class - end - - def accept visitor - visitor.accept_blank_line self - end - - def pretty_print q # :nodoc: - q.text 'blankline' - end - -end - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/markup/document.rb b/Src/StdLib/ruby/1.9.1/rdoc/markup/document.rb deleted file mode 100644 index a7c746a0e..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/markup/document.rb +++ /dev/null @@ -1,72 +0,0 @@ -## -# A Document containing lists, headings, paragraphs, etc. - -class RDoc::Markup::Document - - ## - # The parts of the Document - - attr_reader :parts - - ## - # Creates a new Document with +parts+ - - def initialize *parts - @parts = [] - @parts.push(*parts) - end - - ## - # Appends +part+ to the document - - def << part - case part - when RDoc::Markup::Document then - unless part.empty? then - parts.push(*part.parts) - parts << RDoc::Markup::BlankLine.new - end - when String then - raise ArgumentError, - "expected RDoc::Markup::Document and friends, got String" unless - part.empty? - else - parts << part - end - end - - def == other # :nodoc: - self.class == other.class and @parts == other.parts - end - - def accept visitor - visitor.start_accepting - - @parts.each do |item| - item.accept visitor - end - - visitor.end_accepting - end - - def empty? - @parts.empty? - end - - def pretty_print q # :nodoc: - q.group 2, '[doc: ', ']' do - q.seplist @parts do |part| - q.pp part - end - end - end - - ## - # Appends +parts+ to the document - - def push *parts - self.parts.push(*parts) - end - -end - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/markup/formatter.rb b/Src/StdLib/ruby/1.9.1/rdoc/markup/formatter.rb deleted file mode 100644 index 7a06ecbd6..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/markup/formatter.rb +++ /dev/null @@ -1,143 +0,0 @@ -require 'rdoc/markup' - -## -# Base class for RDoc markup formatters -# -# Formatters use a visitor pattern to convert content into output. - -class RDoc::Markup::Formatter - - InlineTag = Struct.new(:bit, :on, :off) - - ## - # Creates a new Formatter - - def initialize - @markup = RDoc::Markup.new - @am = @markup.attribute_manager - @attr_tags = [] - - @in_tt = 0 - @tt_bit = RDoc::Markup::Attribute.bitmap_for :TT - end - - ## - # Add a new set of tags for an attribute. We allow separate start and end - # tags for flexibility - - def add_tag(name, start, stop) - attr = RDoc::Markup::Attribute.bitmap_for name - @attr_tags << InlineTag.new(attr, start, stop) - end - - ## - # Allows +tag+ to be decorated with additional information. - - def annotate(tag) - tag - end - - ## - # Marks up +content+ - - def convert(content) - @markup.convert content, self - end - - ## - # Converts flow items +flow+ - - def convert_flow(flow) - res = [] - - flow.each do |item| - case item - when String then - res << convert_string(item) - when RDoc::Markup::AttrChanger then - off_tags res, item - on_tags res, item - when RDoc::Markup::Special then - res << convert_special(item) - else - raise "Unknown flow element: #{item.inspect}" - end - end - - res.join - end - - ## - # Converts added specials. See RDoc::Markup#add_special - - def convert_special(special) - handled = false - - RDoc::Markup::Attribute.each_name_of special.type do |name| - method_name = "handle_special_#{name}" - - if respond_to? method_name then - special.text = send method_name, special - handled = true - end - end - - raise "Unhandled special: #{special}" unless handled - - special.text - end - - ## - # Converts a string to be fancier if desired - - def convert_string string - string - end - - ## - # Are we currently inside tt tags? - - def in_tt? - @in_tt > 0 - end - - def on_tags res, item - attr_mask = item.turn_on - return if attr_mask.zero? - - @attr_tags.each do |tag| - if attr_mask & tag.bit != 0 then - res << annotate(tag.on) - @in_tt += 1 if tt? tag - end - end - end - - def off_tags res, item - attr_mask = item.turn_off - return if attr_mask.zero? - - @attr_tags.reverse_each do |tag| - if attr_mask & tag.bit != 0 then - @in_tt -= 1 if tt? tag - res << annotate(tag.off) - end - end - end - - ## - # Is +tag+ a tt tag? - - def tt? tag - tag.bit == @tt_bit - end - -end - -class RDoc::Markup - autoload :ToAnsi, 'rdoc/markup/to_ansi' - autoload :ToBs, 'rdoc/markup/to_bs' - autoload :ToHtml, 'rdoc/markup/to_html' - autoload :ToHtmlCrossref, 'rdoc/markup/to_html_crossref' - autoload :ToRdoc, 'rdoc/markup/to_rdoc' -end diff --git a/Src/StdLib/ruby/1.9.1/rdoc/markup/formatter_test_case.rb b/Src/StdLib/ruby/1.9.1/rdoc/markup/formatter_test_case.rb deleted file mode 100644 index e38f24e36..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/markup/formatter_test_case.rb +++ /dev/null @@ -1,353 +0,0 @@ -require 'minitest/unit' -require 'rdoc/markup/formatter' - -## -# Test case for creating new RDoc::Markup formatters. See -# test/test_rdoc_markup_to_*.rb for examples. - -class RDoc::Markup::FormatterTestCase < MiniTest::Unit::TestCase - - def setup - super - - @m = RDoc::Markup.new - @am = RDoc::Markup::AttributeManager.new - @RM = RDoc::Markup - - @bullet_list = @RM::List.new(:BULLET, - @RM::ListItem.new(nil, @RM::Paragraph.new('l1')), - @RM::ListItem.new(nil, @RM::Paragraph.new('l2'))) - - @label_list = @RM::List.new(:LABEL, - @RM::ListItem.new('cat', @RM::Paragraph.new('cats are cool')), - @RM::ListItem.new('dog', @RM::Paragraph.new('dogs are cool too'))) - - @lalpha_list = @RM::List.new(:LALPHA, - @RM::ListItem.new(nil, @RM::Paragraph.new('l1')), - @RM::ListItem.new(nil, @RM::Paragraph.new('l2'))) - - @note_list = @RM::List.new(:NOTE, - @RM::ListItem.new('cat', @RM::Paragraph.new('cats are cool')), - @RM::ListItem.new('dog', @RM::Paragraph.new('dogs are cool too'))) - - @number_list = @RM::List.new(:NUMBER, - @RM::ListItem.new(nil, @RM::Paragraph.new('l1')), - @RM::ListItem.new(nil, @RM::Paragraph.new('l2'))) - - @ualpha_list = @RM::List.new(:UALPHA, - @RM::ListItem.new(nil, @RM::Paragraph.new('l1')), - @RM::ListItem.new(nil, @RM::Paragraph.new('l2'))) - end - - def self.add_visitor_tests - self.class_eval do - def test_start_accepting - @to.start_accepting - - start_accepting - end - - def test_end_accepting - @to.start_accepting - @to.res << 'hi' - - end_accepting - end - - def test_accept_blank_line - @to.start_accepting - - @to.accept_blank_line @RM::BlankLine.new - - accept_blank_line - end - - def test_accept_heading - @to.start_accepting - - @to.accept_heading @RM::Heading.new(5, 'Hello') - - accept_heading - end - - def test_accept_paragraph - @to.start_accepting - - @to.accept_paragraph @RM::Paragraph.new('hi') - - accept_paragraph - end - - def test_accept_verbatim - @to.start_accepting - - @to.accept_verbatim @RM::Verbatim.new(' ', 'hi', "\n", - ' ', 'world', "\n") - - accept_verbatim - end - - def test_accept_raw - @to.start_accepting - - @to.accept_raw @RM::Raw.new("", - "
NameCount", - "
a1", - "
b2", - "
") - - accept_raw - end - - def test_accept_rule - @to.start_accepting - - @to.accept_rule @RM::Rule.new(4) - - accept_rule - end - - def test_accept_list_item_start_bullet - @to.start_accepting - - @to.accept_list_start @bullet_list - - @to.accept_list_item_start @bullet_list.items.first - - accept_list_item_start_bullet - end - - def test_accept_list_item_start_label - @to.start_accepting - - @to.accept_list_start @label_list - - @to.accept_list_item_start @label_list.items.first - - accept_list_item_start_label - end - - def test_accept_list_item_start_lalpha - @to.start_accepting - - @to.accept_list_start @lalpha_list - - @to.accept_list_item_start @lalpha_list.items.first - - accept_list_item_start_lalpha - end - - def test_accept_list_item_start_note - @to.start_accepting - - @to.accept_list_start @note_list - - @to.accept_list_item_start @note_list.items.first - - accept_list_item_start_note - end - - def test_accept_list_item_start_number - @to.start_accepting - - @to.accept_list_start @number_list - - @to.accept_list_item_start @number_list.items.first - - accept_list_item_start_number - end - - def test_accept_list_item_start_ualpha - @to.start_accepting - - @to.accept_list_start @ualpha_list - - @to.accept_list_item_start @ualpha_list.items.first - - accept_list_item_start_ualpha - end - - def test_accept_list_item_end_bullet - @to.start_accepting - - @to.accept_list_start @bullet_list - - @to.accept_list_item_start @bullet_list.items.first - - @to.accept_list_item_end @bullet_list.items.first - - accept_list_item_end_bullet - end - - def test_accept_list_item_end_label - @to.start_accepting - - @to.accept_list_start @label_list - - @to.accept_list_item_start @label_list.items.first - - @to.accept_list_item_end @label_list.items.first - - accept_list_item_end_label - end - - def test_accept_list_item_end_lalpha - @to.start_accepting - - @to.accept_list_start @lalpha_list - - @to.accept_list_item_start @lalpha_list.items.first - - @to.accept_list_item_end @lalpha_list.items.first - - accept_list_item_end_lalpha - end - - def test_accept_list_item_end_note - @to.start_accepting - - @to.accept_list_start @note_list - - @to.accept_list_item_start @note_list.items.first - - @to.accept_list_item_end @note_list.items.first - - accept_list_item_end_note - end - - def test_accept_list_item_end_number - @to.start_accepting - - @to.accept_list_start @number_list - - @to.accept_list_item_start @number_list.items.first - - @to.accept_list_item_end @number_list.items.first - - accept_list_item_end_number - end - - def test_accept_list_item_end_ualpha - @to.start_accepting - - @to.accept_list_start @ualpha_list - - @to.accept_list_item_start @ualpha_list.items.first - - @to.accept_list_item_end @ualpha_list.items.first - - accept_list_item_end_ualpha - end - - def test_accept_list_start_bullet - @to.start_accepting - - @to.accept_list_start @bullet_list - - accept_list_start_bullet - end - - def test_accept_list_start_label - @to.start_accepting - - @to.accept_list_start @label_list - - accept_list_start_label - end - - def test_accept_list_start_lalpha - @to.start_accepting - - @to.accept_list_start @lalpha_list - - accept_list_start_lalpha - end - - def test_accept_list_start_note - @to.start_accepting - - @to.accept_list_start @note_list - - accept_list_start_note - end - - def test_accept_list_start_number - @to.start_accepting - - @to.accept_list_start @number_list - - accept_list_start_number - end - - def test_accept_list_start_ualpha - @to.start_accepting - - @to.accept_list_start @ualpha_list - - accept_list_start_ualpha - end - - def test_accept_list_end_bullet - @to.start_accepting - - @to.accept_list_start @bullet_list - - @to.accept_list_end @bullet_list - - accept_list_end_bullet - end - - def test_accept_list_end_label - @to.start_accepting - - @to.accept_list_start @label_list - - @to.accept_list_end @label_list - - accept_list_end_label - end - - def test_accept_list_end_lalpha - @to.start_accepting - - @to.accept_list_start @lalpha_list - - @to.accept_list_end @lalpha_list - - accept_list_end_lalpha - end - - def test_accept_list_end_number - @to.start_accepting - - @to.accept_list_start @number_list - - @to.accept_list_end @number_list - - accept_list_end_number - end - - def test_accept_list_end_note - @to.start_accepting - - @to.accept_list_start @note_list - - @to.accept_list_end @note_list - - accept_list_end_note - end - - def test_accept_list_end_ualpha - @to.start_accepting - - @to.accept_list_start @ualpha_list - - @to.accept_list_end @ualpha_list - - accept_list_end_ualpha - end - end - end - -end - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/markup/heading.rb b/Src/StdLib/ruby/1.9.1/rdoc/markup/heading.rb deleted file mode 100644 index 9df39b228..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/markup/heading.rb +++ /dev/null @@ -1,17 +0,0 @@ -## -# A heading with a level (1-6) and text - -class RDoc::Markup::Heading < Struct.new :level, :text - - def accept visitor - visitor.accept_heading self - end - - def pretty_print q # :nodoc: - q.group 2, "[head: #{level} ", ']' do - q.pp text - end - end - -end - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/markup/inline.rb b/Src/StdLib/ruby/1.9.1/rdoc/markup/inline.rb deleted file mode 100644 index 5174ab0b5..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/markup/inline.rb +++ /dev/null @@ -1,127 +0,0 @@ -class RDoc::Markup - - ## - # We manage a set of attributes. Each attribute has a symbol name and a bit - # value. - - class Attribute - - ## - # Special attribute type. See RDoc::Markup#add_special - - SPECIAL = 1 - - @@name_to_bitmap = { :_SPECIAL_ => SPECIAL } - @@next_bitmap = 2 - - def self.bitmap_for(name) - bitmap = @@name_to_bitmap[name] - unless bitmap then - bitmap = @@next_bitmap - @@next_bitmap <<= 1 - @@name_to_bitmap[name] = bitmap - end - bitmap - end - - def self.as_string(bitmap) - return "none" if bitmap.zero? - res = [] - @@name_to_bitmap.each do |name, bit| - res << name if (bitmap & bit) != 0 - end - res.join(",") - end - - def self.each_name_of(bitmap) - @@name_to_bitmap.each do |name, bit| - next if bit == SPECIAL - yield name.to_s if (bitmap & bit) != 0 - end - end - - end - - AttrChanger = Struct.new :turn_on, :turn_off # :nodoc: - - ## - # An AttrChanger records a change in attributes. It contains a bitmap of the - # attributes to turn on, and a bitmap of those to turn off. - - class AttrChanger - def to_s # :nodoc: - "Attr: +#{Attribute.as_string turn_on}/-#{Attribute.as_string turn_on}" - end - end - - ## - # An array of attributes which parallels the characters in a string. - - class AttrSpan - - ## - # Creates a new AttrSpan for +length+ characters - - def initialize(length) - @attrs = Array.new(length, 0) - end - - ## - # Toggles +bits+ from +start+ to +length+ - def set_attrs(start, length, bits) - for i in start ... (start+length) - @attrs[i] |= bits - end - end - - ## - # Acccesses flags for character +n+ - - def [](n) - @attrs[n] - end - - end - - ## - # Hold details of a special sequence - - class Special - - ## - # Special type - - attr_reader :type - - ## - # Special text - - attr_accessor :text - - ## - # Creates a new special sequence of +type+ with +text+ - - def initialize(type, text) - @type, @text = type, text - end - - ## - # Specials are equal when the have the same text and type - - def ==(o) - self.text == o.text && self.type == o.type - end - - def inspect # :nodoc: - "#" % [ - object_id, @type, RDoc::Markup::Attribute.as_string(type), text.dump] - end - - def to_s # :nodoc: - "Special: type=#{type}, name=#{RDoc::Markup::Attribute.as_string type}, text=#{text.dump}" - end - - end - -end - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/markup/list.rb b/Src/StdLib/ruby/1.9.1/rdoc/markup/list.rb deleted file mode 100644 index 74cb2f552..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/markup/list.rb +++ /dev/null @@ -1,78 +0,0 @@ -## -# A List of ListItems - -class RDoc::Markup::List - - ## - # The list's type - - attr_accessor :type - - ## - # Items in the list - - attr_reader :items - - ## - # Creates a new list of +type+ with +items+ - - def initialize type = nil, *items - @type = type - @items = [] - @items.push(*items) - end - - ## - # Appends +item+ to the list - - def << item - @items << item - end - - def == other # :nodoc: - self.class == other.class and - @type == other.type and - @items == other.items - end - - def accept visitor - visitor.accept_list_start self - - @items.each do |item| - item.accept visitor - end - - visitor.accept_list_end self - end - - ## - # Is the list empty? - - def empty? - @items.empty? - end - - ## - # Returns the last item in the list - - def last - @items.last - end - - def pretty_print q # :nodoc: - q.group 2, "[list: #{@type} ", ']' do - q.seplist @items do |item| - q.pp item - end - end - end - - ## - # Appends +items+ to the list - - def push *items - @items.push(*items) - end - -end - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/markup/list_item.rb b/Src/StdLib/ruby/1.9.1/rdoc/markup/list_item.rb deleted file mode 100644 index cf58a39a4..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/markup/list_item.rb +++ /dev/null @@ -1,83 +0,0 @@ -## -# An item within a List that contains paragraphs, headings, etc. - -class RDoc::Markup::ListItem - - ## - # The label for the ListItem - - attr_accessor :label - - ## - # Parts of the ListItem - - attr_reader :parts - - ## - # Creates a new ListItem with an optional +label+ containing +parts+ - - def initialize label = nil, *parts - @label = label - @parts = [] - @parts.push(*parts) - end - - ## - # Appends +part+ to the ListItem - - def << part - @parts << part - end - - def == other # :nodoc: - self.class == other.class and - @label == other.label and - @parts == other.parts - end - - def accept visitor - visitor.accept_list_item_start self - - @parts.each do |part| - part.accept visitor - end - - visitor.accept_list_item_end self - end - - ## - # Is the ListItem empty? - - def empty? - @parts.empty? - end - - ## - # Length of parts in the ListItem - - def length - @parts.length - end - - def pretty_print q # :nodoc: - q.group 2, '[item: ', ']' do - if @label then - q.text @label - q.breakable - end - - q.seplist @parts do |part| - q.pp part - end - end - end - - ## - # Adds +parts+ to the ListItem - - def push *parts - @parts.push(*parts) - end - -end - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/markup/paragraph.rb b/Src/StdLib/ruby/1.9.1/rdoc/markup/paragraph.rb deleted file mode 100644 index 02f4bf076..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/markup/paragraph.rb +++ /dev/null @@ -1,11 +0,0 @@ -## -# A Paragraph of text - -class RDoc::Markup::Paragraph < RDoc::Markup::Raw - - def accept visitor - visitor.accept_paragraph self - end - -end - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/markup/parser.rb b/Src/StdLib/ruby/1.9.1/rdoc/markup/parser.rb deleted file mode 100644 index 921b2dad1..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/markup/parser.rb +++ /dev/null @@ -1,529 +0,0 @@ -require 'strscan' -require 'rdoc/text' - -## -# A recursive-descent parser for RDoc markup. -# -# The parser tokenizes an input string then parses the tokens into a Document. -# Documents can be converted into output formats by writing a visitor like -# RDoc::Markup::ToHTML. -# -# The parser only handles the block-level constructs Paragraph, List, -# ListItem, Heading, Verbatim, BlankLine and Rule. Inline markup such as -# \+blah\+ is handled separately by RDoc::Markup::AttributeManager. -# -# To see what markup the Parser implements read RDoc. To see how to use -# RDoc markup to format text in your program read RDoc::Markup. - -class RDoc::Markup::Parser - - include RDoc::Text - - ## - # List token types - - LIST_TOKENS = [ - :BULLET, - :LABEL, - :LALPHA, - :NOTE, - :NUMBER, - :UALPHA, - ] - - ## - # Parser error subclass - - class Error < RuntimeError; end - - ## - # Raised when the parser is unable to handle the given markup - - class ParseError < Error; end - - ## - # Enables display of debugging information - - attr_accessor :debug - - ## - # Token accessor - - attr_reader :tokens - - ## - # Parsers +str+ into a Document - - def self.parse str - parser = new - #parser.debug = true - parser.tokenize str - RDoc::Markup::Document.new(*parser.parse) - end - - ## - # Returns a token stream for +str+, for testing - - def self.tokenize str - parser = new - parser.tokenize str - parser.tokens - end - - ## - # Creates a new Parser. See also ::parse - - def initialize - @tokens = [] - @current_token = nil - @debug = false - - @line = 0 - @line_pos = 0 - end - - ## - # Builds a Heading of +level+ - - def build_heading level - heading = RDoc::Markup::Heading.new level, text - skip :NEWLINE - - heading - end - - ## - # Builds a List flush to +margin+ - - def build_list margin - p :list_start => margin if @debug - - list = RDoc::Markup::List.new - - until @tokens.empty? do - type, data, column, = get - - case type - when :BULLET, :LABEL, :LALPHA, :NOTE, :NUMBER, :UALPHA then - list_type = type - - if column < margin then - unget - break - end - - if list.type and list.type != list_type then - unget - break - end - - list.type = list_type - - case type - when :NOTE, :LABEL then - _, indent, = get # SPACE - if :NEWLINE == peek_token.first then - get - peek_type, new_indent, peek_column, = peek_token - indent = new_indent if - peek_type == :INDENT and peek_column >= column - unget - end - else - data = nil - _, indent, = get - end - - list_item = build_list_item(margin + indent, data) - - list << list_item if list_item - else - unget - break - end - end - - p :list_end => margin if @debug - - return nil if list.empty? - - list - end - - ## - # Builds a ListItem that is flush to +indent+ with type +item_type+ - - def build_list_item indent, item_type = nil - p :list_item_start => [indent, item_type] if @debug - - list_item = RDoc::Markup::ListItem.new item_type - - until @tokens.empty? do - type, data, column = get - - if column < indent and - not type == :NEWLINE and - (type != :INDENT or data < indent) then - unget - break - end - - case type - when :INDENT then - unget - list_item.push(*parse(indent)) - when :TEXT then - unget - list_item << build_paragraph(indent) - when :HEADER then - list_item << build_heading(data) - when :NEWLINE then - list_item << RDoc::Markup::BlankLine.new - when *LIST_TOKENS then - unget - list_item << build_list(column) - else - raise ParseError, "Unhandled token #{@current_token.inspect}" - end - end - - p :list_item_end => [indent, item_type] if @debug - - return nil if list_item.empty? - - list_item.parts.shift if - RDoc::Markup::BlankLine === list_item.parts.first and - list_item.length > 1 - - list_item - end - - ## - # Builds a Paragraph that is flush to +margin+ - - def build_paragraph margin - p :paragraph_start => margin if @debug - - paragraph = RDoc::Markup::Paragraph.new - - until @tokens.empty? do - type, data, column, = get - - case type - when :INDENT then - next if data == margin and peek_token[0] == :TEXT - - unget - break - when :TEXT then - if column != margin then - unget - break - end - - paragraph << data - skip :NEWLINE - else - unget - break - end - end - - p :paragraph_end => margin if @debug - - paragraph - end - - ## - # Builds a Verbatim that is flush to +margin+ - - def build_verbatim margin - p :verbatim_begin => margin if @debug - verbatim = RDoc::Markup::Verbatim.new - - until @tokens.empty? do - type, data, column, = get - - case type - when :INDENT then - if margin >= data then - unget - break - end - - indent = data - margin - - verbatim << ' ' * indent - when :HEADER then - verbatim << '=' * data - - _, _, peek_column, = peek_token - peek_column ||= column + data - verbatim << ' ' * (peek_column - column - data) - when :RULE then - width = 2 + data - verbatim << '-' * width - - _, _, peek_column, = peek_token - peek_column ||= column + data + 2 - verbatim << ' ' * (peek_column - column - width) - when :TEXT then - verbatim << data - when *LIST_TOKENS then - if column <= margin then - unget - break - end - - list_marker = case type - when :BULLET then '*' - when :LABEL then "[#{data}]" - when :LALPHA, :NUMBER, :UALPHA then "#{data}." - when :NOTE then "#{data}::" - end - - verbatim << list_marker - - _, data, = get - - verbatim << ' ' * (data - list_marker.length) - when :NEWLINE then - verbatim << data - break unless [:INDENT, :NEWLINE].include? peek_token[0] - else - unget - break - end - end - - verbatim.normalize - - p :verbatim_end => margin if @debug - - verbatim - end - - ## - # Pulls the next token from the stream. - - def get - @current_token = @tokens.shift - p :get => @current_token if @debug - @current_token - end - - ## - # Parses the tokens into a Document - - def parse indent = 0 - p :parse_start => indent if @debug - - document = [] - - until @tokens.empty? do - type, data, column, = get - - if type != :INDENT and column < indent then - unget - break - end - - case type - when :HEADER then - document << build_heading(data) - when :INDENT then - if indent > data then - unget - break - elsif indent == data then - next - end - - unget - document << build_verbatim(indent) - when :NEWLINE then - document << RDoc::Markup::BlankLine.new - skip :NEWLINE, false - when :RULE then - document << RDoc::Markup::Rule.new(data) - skip :NEWLINE - when :TEXT then - unget - document << build_paragraph(indent) - - # we're done with this paragraph (indent mismatch) - break if peek_token[0] == :TEXT - when *LIST_TOKENS then - unget - - list = build_list(indent) - - document << list if list - - # we're done with this list (indent mismatch) - break if LIST_TOKENS.include? peek_token.first and indent > 0 - else - type, data, column, line = @current_token - raise ParseError, - "Unhandled token #{type} (#{data.inspect}) at #{line}:#{column}" - end - end - - p :parse_end => indent if @debug - - document - end - - ## - # Returns the next token on the stream without modifying the stream - - def peek_token - token = @tokens.first || [] - p :peek => token if @debug - token - end - - ## - # Skips a token of +token_type+, optionally raising an error. - - def skip token_type, error = true - type, data, = get - - return unless type # end of stream - - return @current_token if token_type == type - - unget - - raise ParseError, "expected #{token_type} got #{@current_token.inspect}" if - error - end - - ## - # Consumes tokens until NEWLINE and turns them back into text - - def text - text = '' - - loop do - type, data, = get - - text << case type - when :BULLET then - _, space, = get # SPACE - "*#{' ' * (space - 1)}" - when :LABEL then - _, space, = get # SPACE - "[#{data}]#{' ' * (space - data.length - 2)}" - when :LALPHA, :NUMBER, :UALPHA then - _, space, = get # SPACE - "#{data}.#{' ' * (space - 2)}" - when :NOTE then - _, space = get # SPACE - "#{data}::#{' ' * (space - data.length - 2)}" - when :TEXT then - data - when :NEWLINE then - unget - break - when nil then - break - else - raise ParseError, "unhandled token #{@current_token.inspect}" - end - end - - text - end - - ## - # Calculates the column and line of the current token based on +offset+. - - def token_pos offset - [offset - @line_pos, @line] - end - - ## - # Turns text +input+ into a stream of tokens - - def tokenize input - s = StringScanner.new input - - @line = 0 - @line_pos = 0 - - until s.eos? do - pos = s.pos - - @tokens << case - when s.scan(/\r?\n/) then - token = [:NEWLINE, s.matched, *token_pos(pos)] - @line_pos = s.pos - @line += 1 - token - when s.scan(/ +/) then - [:INDENT, s.matched_size, *token_pos(pos)] - when s.scan(/(=+)\s*/) then - level = s[1].length - level = 6 if level > 6 - @tokens << [:HEADER, level, *token_pos(pos)] - - pos = s.pos - s.scan(/.*/) - [:TEXT, s.matched, *token_pos(pos)] - when s.scan(/^(-{3,}) *$/) then - [:RULE, s[1].length - 2, *token_pos(pos)] - when s.scan(/([*-])\s+/) then - @tokens << [:BULLET, :BULLET, *token_pos(pos)] - [:SPACE, s.matched_size, *token_pos(pos)] - when s.scan(/([a-z]|\d+)\.[ \t]+\S/i) then - list_label = s[1] - width = s.matched_size - 1 - - s.pos -= 1 # unget \S - - list_type = case list_label - when /[a-z]/ then :LALPHA - when /[A-Z]/ then :UALPHA - when /\d/ then :NUMBER - else - raise ParseError, "BUG token #{list_label}" - end - - @tokens << [list_type, list_label, *token_pos(pos)] - [:SPACE, width, *token_pos(pos)] - when s.scan(/\[(.*?)\]( +|$)/) then - @tokens << [:LABEL, s[1], *token_pos(pos)] - [:SPACE, s.matched_size, *token_pos(pos)] - when s.scan(/(.*?)::( +|$)/) then - @tokens << [:NOTE, s[1], *token_pos(pos)] - [:SPACE, s.matched_size, *token_pos(pos)] - else s.scan(/.*/) - [:TEXT, s.matched, *token_pos(pos)] - end - end - - self - end - - ## - # Returns the current token or +token+ to the token stream - - def unget token = @current_token - p :unget => token if @debug - raise Error, 'too many #ungets' if token == @tokens.first - @tokens.unshift token if token - end - -end - -require 'rdoc/markup/blank_line' -require 'rdoc/markup/document' -require 'rdoc/markup/heading' -require 'rdoc/markup/list' -require 'rdoc/markup/list_item' -require 'rdoc/markup/raw' -require 'rdoc/markup/paragraph' -require 'rdoc/markup/rule' -require 'rdoc/markup/verbatim' - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/markup/preprocess.rb b/Src/StdLib/ruby/1.9.1/rdoc/markup/preprocess.rb deleted file mode 100644 index d516513c8..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/markup/preprocess.rb +++ /dev/null @@ -1,130 +0,0 @@ -require 'rdoc/markup' - -## -# Handle common directives that can occur in a block of text: -# -# : include : filename -# -# RDoc plugin authors can register additional directives to be handled through -# RDoc::Markup::PreProcess::register - -class RDoc::Markup::PreProcess - - @registered = {} - - ## - # Registers +directive+ as one handled by RDoc. If a block is given the - # directive will be replaced by the result of the block, otherwise the - # directive will be removed from the processed text. - - def self.register directive, &block - @registered[directive] = block - end - - ## - # Registered directives - - def self.registered - @registered - end - - ## - # Creates a new pre-processor for +input_file_name+ that will look for - # included files in +include_path+ - - def initialize(input_file_name, include_path) - @input_file_name = input_file_name - @include_path = include_path - end - - ## - # Look for directives in a chunk of +text+. - # - # Options that we don't handle are yielded. If the block returns false the - # directive is restored to the text. If the block returns nil or no block - # was given the directive is handled according to the registered directives. - # If a String was returned the directive is replaced with the string. - # - # If no matching directive was registered the directive is restored to the - # text. - # - # If +code_object+ is given and the param is set as metadata on the - # +code_object+. See RDoc::CodeObject#metadata - - def handle text, code_object = nil - text.gsub!(/^([ \t]*#?[ \t]*):(\w+):([ \t]*)(.+)?\n/) do - next $& if $3.empty? and $4 and $4[0, 1] == ':' - - prefix = $1 - directive = $2.downcase - param = $4 - - case directive - when 'include' then - filename = param.split[0] - include_file filename, prefix - - else - result = yield directive, param if block_given? - - case result - when nil then - code_object.metadata[directive] = param if code_object - if RDoc::Markup::PreProcess.registered.include? directive then - handler = RDoc::Markup::PreProcess.registered[directive] - result = handler.call directive, param if handler - else - result = "#{prefix}:#{directive}: #{param}\n" - end - when false then - result = "#{prefix}:#{directive}: #{param}\n" - end - - result - end - end - - text - end - - ## - # Include a file, indenting it correctly. - - def include_file(name, indent) - if full_name = find_include_file(name) then - content = if defined?(Encoding) then - File.binread full_name - else - File.read full_name - end - # HACK determine content type and force encoding - content = content.sub(/\A# .*coding[=:].*$/, '').lstrip - - # strip leading '#'s, but only if all lines start with them - if content =~ /^[^#]/ then - content.gsub(/^/, indent) - else - content.gsub(/^#?/, indent) - end - else - warn "Couldn't find file to include '#{name}' from #{@input_file_name}" - '' - end - end - - ## - # Look for the given file in the directory containing the current file, - # and then in each of the directories specified in the RDOC_INCLUDE path - - def find_include_file(name) - to_search = [File.dirname(@input_file_name)].concat @include_path - to_search.each do |dir| - full_name = File.join(dir, name) - stat = File.stat(full_name) rescue next - return full_name if stat.readable? - end - nil - end - -end - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/markup/raw.rb b/Src/StdLib/ruby/1.9.1/rdoc/markup/raw.rb deleted file mode 100644 index cd6696974..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/markup/raw.rb +++ /dev/null @@ -1,65 +0,0 @@ -## -# A section of text that is added to the output document as-is - -class RDoc::Markup::Raw - - ## - # The component parts of the list - - attr_reader :parts - - ## - # Creates a new Raw containing +parts+ - - def initialize *parts - @parts = [] - @parts.push(*parts) - end - - ## - # Appends +text+ - - def << text - @parts << text - end - - def == other # :nodoc: - self.class == other.class and text == other.text - end - - def accept visitor - visitor.accept_raw self - end - - ## - # Appends +other+'s parts - - def merge other - @parts.push(*other.parts) - end - - def pretty_print q # :nodoc: - self.class.name =~ /.*::(\w{4})/i - - q.group 2, "[#{$1.downcase}: ", ']' do - q.seplist @parts do |part| - q.pp part - end - end - end - - ## - # Appends +texts+ onto this Paragraph - - def push *texts - self.parts.push(*texts) - end - - ## - # The raw text - - def text - @parts.join ' ' - end - -end diff --git a/Src/StdLib/ruby/1.9.1/rdoc/markup/rule.rb b/Src/StdLib/ruby/1.9.1/rdoc/markup/rule.rb deleted file mode 100644 index a337b7d3c..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/markup/rule.rb +++ /dev/null @@ -1,17 +0,0 @@ -## -# A horizontal rule with a weight - -class RDoc::Markup::Rule < Struct.new :weight - - def accept visitor - visitor.accept_rule self - end - - def pretty_print q # :nodoc: - q.group 2, '[rule:', ']' do - q.pp weight - end - end - -end - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/markup/to_ansi.rb b/Src/StdLib/ruby/1.9.1/rdoc/markup/to_ansi.rb deleted file mode 100644 index 11a21989b..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/markup/to_ansi.rb +++ /dev/null @@ -1,72 +0,0 @@ -require 'rdoc/markup/inline' - -## -# Outputs RDoc markup with vibrant ANSI color! - -class RDoc::Markup::ToAnsi < RDoc::Markup::ToRdoc - - def initialize - super - - @headings.clear - @headings[1] = ["\e[1;32m", "\e[m"] - @headings[2] = ["\e[4;32m", "\e[m"] - @headings[3] = ["\e[32m", "\e[m"] - end - - ## - # Maps attributes to ANSI sequences - - def init_tags - add_tag :BOLD, "\e[1m", "\e[m" - add_tag :TT, "\e[7m", "\e[m" - add_tag :EM, "\e[4m", "\e[m" - end - - def accept_list_item_end list_item - width = case @list_type.last - when :BULLET then - 2 - when :NOTE, :LABEL then - @res << "\n" - 2 - else - bullet = @list_index.last.to_s - @list_index[-1] = @list_index.last.succ - bullet.length + 2 - end - - @indent -= width - end - - def accept_list_item_start list_item - bullet = case @list_type.last - when :BULLET then - '*' - when :NOTE, :LABEL then - attributes(list_item.label) + ":\n" - else - @list_index.last.to_s + '.' - end - - case @list_type.last - when :NOTE, :LABEL then - @indent += 2 - @prefix = bullet + (' ' * @indent) - else - @prefix = (' ' * @indent) + bullet.ljust(bullet.length + 1) - - width = bullet.gsub(/\e\[[\d;]*m/, '').length + 1 - - @indent += width - end - end - - def start_accepting - super - - @res = ["\e[0m"] - end - -end - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/markup/to_bs.rb b/Src/StdLib/ruby/1.9.1/rdoc/markup/to_bs.rb deleted file mode 100644 index af448ae05..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/markup/to_bs.rb +++ /dev/null @@ -1,74 +0,0 @@ -require 'rdoc/markup/inline' - -## -# Outputs RDoc markup with hot backspace action! You will probably need a -# pager to use this output format. -# -# This formatter won't work on 1.8.6 because it lacks String#chars. - -class RDoc::Markup::ToBs < RDoc::Markup::ToRdoc - - def initialize - super - - @in_b = false - @in_em = false - end - - ## - # Sets a flag that is picked up by #annotate to do the right thing in - # #convert_string - - def init_tags - add_tag :BOLD, '+b', '-b' - add_tag :EM, '+_', '-_' - end - - def accept_heading heading - use_prefix or @res << ' ' * @indent - @res << @headings[heading.level][0] - @in_b = true - @res << attributes(heading.text) - @in_b = false - @res << @headings[heading.level][1] - @res << "\n" - end - - ## - # Turns on or off special handling for +convert_string+ - - def annotate tag - case tag - when '+b' then @in_b = true - when '-b' then @in_b = false - when '+_' then @in_em = true - when '-_' then @in_em = false - end - - '' - end - - ## - # Calls convert_string on the result of convert_special - - def convert_special special - convert_string super - end - - ## - # Adds bold or underline mixed with backspaces - - def convert_string string - return string unless string.respond_to? :chars # your ruby is lame - return string unless @in_b or @in_em - chars = if @in_b then - string.chars.map do |char| "#{char}\b#{char}" end - elsif @in_em then - string.chars.map do |char| "_\b#{char}" end - end - - chars.join - end - -end - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/markup/to_html.rb b/Src/StdLib/ruby/1.9.1/rdoc/markup/to_html.rb deleted file mode 100644 index 1337c5d27..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/markup/to_html.rb +++ /dev/null @@ -1,344 +0,0 @@ -require 'rdoc/markup/formatter' -require 'rdoc/markup/inline' - -require 'cgi' - -## -# Outputs RDoc markup as HTML - -class RDoc::Markup::ToHtml < RDoc::Markup::Formatter - - ## - # Maps RDoc::Markup::Parser::LIST_TOKENS types to HTML tags - - LIST_TYPE_TO_HTML = { - :BULLET => ['
    ', '
'], - :LABEL => ['
', '
'], - :LALPHA => ['
    ', '
'], - :NOTE => ['', '
'], - :NUMBER => ['
    ', '
'], - :UALPHA => ['
    ', '
'], - } - - attr_reader :res # :nodoc: - attr_reader :in_list_entry # :nodoc: - attr_reader :list # :nodoc: - - ## - # Converts a target url to one that is relative to a given path - - def self.gen_relative_url(path, target) - from = File.dirname path - to, to_file = File.split target - - from = from.split "/" - to = to.split "/" - - from.delete '.' - to.delete '.' - - while from.size > 0 and to.size > 0 and from[0] == to[0] do - from.shift - to.shift - end - - from.fill ".." - from.concat to - from << to_file - File.join(*from) - end - - def initialize - super - - @th = nil - @in_list_entry = nil - @list = nil - - # external hyperlinks - @markup.add_special(/((link:|https?:|mailto:|ftp:|www\.)\S+\w)/, :HYPERLINK) - - # and links of the form [] - @markup.add_special(/(((\{.*?\})|\b\S+?)\[\S+?\.\S+?\])/, :TIDYLINK) - - init_tags - end - - ## - # Maps attributes to HTML tags - - def init_tags - add_tag :BOLD, "", "" - add_tag :TT, "", "" - add_tag :EM, "", "" - end - - ## - # Generate a hyperlink for url, labeled with text. Handle the - # special cases for img: and link: described under handle_special_HYPERLINK - - def gen_url(url, text) - if url =~ /([A-Za-z]+):(.*)/ then - type = $1 - path = $2 - else - type = "http" - path = url - url = "http://#{url}" - end - - if type == "link" then - url = if path[0, 1] == '#' then # is this meaningful? - path - else - self.class.gen_relative_url @from_path, path - end - end - - if (type == "http" or type == "link") and - url =~ /\.(gif|png|jpg|jpeg|bmp)$/ then - "" - else - "#{text.sub(%r{^#{type}:/*}, '')}" - end - end - - ## - # And we're invoked with a potential external hyperlink mailto: - # just gets inserted. http: links are checked to see if they - # reference an image. If so, that image gets inserted using an - # tag. Otherwise a conventional is used. We also - # support a special type of hyperlink, link:, which is a reference - # to a local file whose path is relative to the --op directory. - - def handle_special_HYPERLINK(special) - url = special.text - gen_url url, url - end - - ## - # Here's a hypedlink where the label is different to the URL - # #{name}" - else - name - end - - @seen[name] = out - - out - end - -end - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/markup/to_rdoc.rb b/Src/StdLib/ruby/1.9.1/rdoc/markup/to_rdoc.rb deleted file mode 100644 index 2a65c7677..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/markup/to_rdoc.rb +++ /dev/null @@ -1,247 +0,0 @@ -require 'rdoc/markup/inline' - -## -# Outputs RDoc markup as RDoc markup! (mostly) - -class RDoc::Markup::ToRdoc < RDoc::Markup::Formatter - - attr_accessor :indent - attr_reader :list_index - attr_reader :list_type - attr_reader :list_width - attr_reader :prefix - attr_reader :res - - def initialize - super - - @markup.add_special(/\\[^\s]/, :SUPPRESSED_CROSSREF) - - @width = 78 - @prefix = '' - - init_tags - - @headings = {} - @headings.default = [] - - @headings[1] = ['= ', ''] - @headings[2] = ['== ', ''] - @headings[3] = ['=== ', ''] - @headings[4] = ['==== ', ''] - @headings[5] = ['===== ', ''] - @headings[6] = ['====== ', ''] - end - - ## - # Maps attributes to ANSI sequences - - def init_tags - add_tag :BOLD, "", "" - add_tag :TT, "", "" - add_tag :EM, "", "" - end - - def accept_blank_line blank_line - @res << "\n" - end - - def accept_heading heading - use_prefix or @res << ' ' * @indent - @res << @headings[heading.level][0] - @res << attributes(heading.text) - @res << @headings[heading.level][1] - @res << "\n" - end - - def accept_list_end list - @list_index.pop - @list_type.pop - @list_width.pop - end - - def accept_list_item_end list_item - width = case @list_type.last - when :BULLET then - 2 - when :NOTE, :LABEL then - @res << "\n" - 2 - else - bullet = @list_index.last.to_s - @list_index[-1] = @list_index.last.succ - bullet.length + 2 - end - - @indent -= width - end - - def accept_list_item_start list_item - bullet = case @list_type.last - when :BULLET then - '*' - when :NOTE, :LABEL then - attributes(list_item.label) + ":\n" - else - @list_index.last.to_s + '.' - end - - case @list_type.last - when :NOTE, :LABEL then - @indent += 2 - @prefix = bullet + (' ' * @indent) - else - @prefix = (' ' * @indent) + bullet.ljust(bullet.length + 1) - - width = bullet.length + 1 - - @indent += width - end - end - - def accept_list_start list - case list.type - when :BULLET then - @list_index << nil - @list_width << 1 - when :LABEL, :NOTE then - @list_index << nil - @list_width << 2 - when :LALPHA then - @list_index << 'a' - @list_width << list.items.length.to_s.length - when :NUMBER then - @list_index << 1 - @list_width << list.items.length.to_s.length - when :UALPHA then - @list_index << 'A' - @list_width << list.items.length.to_s.length - else - raise RDoc::Error, "invalid list type #{list.type}" - end - - @list_type << list.type - end - - def accept_paragraph paragraph - wrap attributes(paragraph.text) - end - - def accept_raw raw - @res << raw.parts.join("\n") - end - - def accept_rule rule - use_prefix or @res << ' ' * @indent - @res << '-' * (@width - @indent) - @res << "\n" - end - - ## - # Outputs +verbatim+ flush left and indented 2 columns - - def accept_verbatim verbatim - indent = ' ' * (@indent + 2) - - lines = [] - current_line = [] - - # split into lines - verbatim.parts.each do |part| - current_line << part - - if part == "\n" then - lines << current_line - current_line = [] - end - end - - lines << current_line unless current_line.empty? - - # calculate margin - indented = lines.select { |line| line != ["\n"] } - margin = indented.map { |line| line.first.length }.min - - # flush left - indented.each { |line| line[0][0...margin] = '' } - - # output - use_prefix or @res << indent # verbatim is unlikely to have prefix - @res << lines.shift.join - - lines.each do |line| - @res << indent unless line == ["\n"] - @res << line.join - end - - @res << "\n" - end - - def attributes text - flow = @am.flow text.dup - convert_flow flow - end - - def end_accepting - @res.join - end - - def handle_special_SUPPRESSED_CROSSREF special - special.text.sub(/\\/, '') - end - - def start_accepting - @res = [""] - @indent = 0 - @prefix = nil - - @list_index = [] - @list_type = [] - @list_width = [] - end - - def use_prefix - prefix = @prefix - @prefix = nil - @res << prefix if prefix - - prefix - end - - def wrap text - return unless text && !text.empty? - - text_len = @width - @indent - - text_len = 20 if text_len < 20 - - re = /^(.{0,#{text_len}})[ \n]/ - next_prefix = ' ' * @indent - - prefix = @prefix || next_prefix - @prefix = nil - - @res << prefix - - while text.length > text_len - if text =~ re then - @res << $1 - text.slice!(0, $&.length) - else - @res << text.slice!(0, text_len) - end - - @res << "\n" << next_prefix - end - - if text.empty? then - @res.pop - @res.pop - else - @res << text - @res << "\n" - end - end - -end - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/markup/to_test.rb b/Src/StdLib/ruby/1.9.1/rdoc/markup/to_test.rb deleted file mode 100644 index b406c5d20..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/markup/to_test.rb +++ /dev/null @@ -1,64 +0,0 @@ -require 'rdoc/markup' -require 'rdoc/markup/formatter' - -## -# This Markup outputter is used for testing purposes. - -class RDoc::Markup::ToTest < RDoc::Markup::Formatter - - ## - # :section: Visitor - - def start_accepting - @res = [] - @list = [] - end - - def end_accepting - @res - end - - def accept_paragraph(paragraph) - @res << paragraph.text - end - - def accept_verbatim(verbatim) - @res << verbatim.text - end - - def accept_list_start(list) - @list << case list.type - when :BULLET then - '*' - when :NUMBER then - '1' - else - list.type - end - end - - def accept_list_end(list) - @list.pop - end - - def accept_list_item_start(list_item) - @res << "#{' ' * (@list.size - 1)}#{@list.last}: " - end - - def accept_list_item_end(list_item) - end - - def accept_blank_line(blank_line) - @res << "\n" - end - - def accept_heading(heading) - @res << "#{'=' * heading.level} #{heading.text}" - end - - def accept_rule(rule) - @res << '-' * rule.weight - end - -end - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/markup/verbatim.rb b/Src/StdLib/ruby/1.9.1/rdoc/markup/verbatim.rb deleted file mode 100644 index 1daff1a9a..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/markup/verbatim.rb +++ /dev/null @@ -1,42 +0,0 @@ -## -# A section of verbatim text - -class RDoc::Markup::Verbatim < RDoc::Markup::Raw - - def accept visitor - visitor.accept_verbatim self - end - - ## - # Collapses 3+ newlines into two newlines - - def normalize - parts = [] - - newlines = 0 - - @parts.each do |part| - case part - when /\n/ then - newlines += 1 - parts << part if newlines <= 2 - else - newlines = 0 - parts << part - end - end - - parts.slice!(-1) if parts[-2..-1] == ["\n", "\n"] - - @parts = parts - end - - ## - # The text of the section - - def text - @parts.join - end - -end - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/meta_method.rb b/Src/StdLib/ruby/1.9.1/rdoc/meta_method.rb deleted file mode 100644 index 4cf61e5d1..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/meta_method.rb +++ /dev/null @@ -1,8 +0,0 @@ -require 'rdoc/any_method' - -## -# MetaMethod represents a meta-programmed method - -class RDoc::MetaMethod < RDoc::AnyMethod -end - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/normal_class.rb b/Src/StdLib/ruby/1.9.1/rdoc/normal_class.rb deleted file mode 100644 index 5bb27cfa9..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/normal_class.rb +++ /dev/null @@ -1,55 +0,0 @@ -require 'rdoc/class_module' - -## -# A normal class, neither singleton nor anonymous - -class RDoc::NormalClass < RDoc::ClassModule - - ## - # Ancestor ClassModules - - def ancestors - includes + [superclass] - end - - def inspect # :nodoc: - superclass = @superclass ? " < #{@superclass}" : nil - "<%s:0x%x class %s%s includes: %p attributes: %p methods: %p aliases: %p>" % [ - self.class, object_id, - full_name, superclass, @includes, @attributes, @method_list, @aliases - ] - end - - def pretty_print q # :nodoc: - superclass = @superclass ? " < #{@superclass}" : nil - - q.group 2, "[class #{full_name}#{superclass} ", "]" do - q.breakable - q.text "includes:" - q.breakable - q.seplist @includes do |inc| q.pp inc end - - q.breakable - q.text "attributes:" - q.breakable - q.seplist @attributes do |inc| q.pp inc end - - q.breakable - q.text "methods:" - q.breakable - q.seplist @method_list do |inc| q.pp inc end - - q.breakable - q.text "aliases:" - q.breakable - q.seplist @aliases do |inc| q.pp inc end - - q.breakable - q.text "comment:" - q.breakable - q.pp comment - end - end - -end - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/normal_module.rb b/Src/StdLib/ruby/1.9.1/rdoc/normal_module.rb deleted file mode 100644 index a67c7c500..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/normal_module.rb +++ /dev/null @@ -1,64 +0,0 @@ -require 'rdoc/class_module' - -## -# A normal module, like NormalClass - -class RDoc::NormalModule < RDoc::ClassModule - - ## - # Included NormalModules - - alias ancestors includes - - def inspect # :nodoc: - "#<%s:0x%x module %s includes: %p attributes: %p methods: %p aliases: %p>" % [ - self.class, object_id, - full_name, @includes, @attributes, @method_list, @aliases - ] - end - - ## - # This is a module, returns true - - def module? - true - end - - def pretty_print q # :nodoc: - q.group 2, "[module #{full_name}: ", "]" do - q.breakable - q.text "includes:" - q.breakable - q.seplist @includes do |inc| q.pp inc end - q.breakable - - q.text "attributes:" - q.breakable - q.seplist @attributes do |inc| q.pp inc end - q.breakable - - q.text "methods:" - q.breakable - q.seplist @method_list do |inc| q.pp inc end - q.breakable - - q.text "aliases:" - q.breakable - q.seplist @aliases do |inc| q.pp inc end - q.breakable - - q.text "comment:" - q.breakable - q.pp comment - end - end - - ## - # Modules don't have one, raises NoMethodError - - def superclass - raise NoMethodError, "#{full_name} is a module" - end - -end - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/options.rb b/Src/StdLib/ruby/1.9.1/rdoc/options.rb deleted file mode 100644 index cb2d7fe5b..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/options.rb +++ /dev/null @@ -1,441 +0,0 @@ -require 'optparse' - -require 'rdoc/ri/paths' - -## -# RDoc::Options handles the parsing and storage of options - -class RDoc::Options - - ## - # Character-set - - attr_reader :charset - - ## - # Files matching this pattern will be excluded - - attr_accessor :exclude - - ## - # The list of files to be processed - - attr_accessor :files - - ## - # Scan newer sources than the flag file if true. - - attr_reader :force_update - - ## - # Description of the output generator (set with the -fmt option) - - attr_accessor :generator - - ## - # Formatter to mark up text with - - attr_accessor :formatter - - ## - # Name of the file, class or module to display in the initial index page (if - # not specified the first file we encounter is used) - - attr_accessor :main_page - - ## - # The name of the output directory - - attr_accessor :op_dir - - ## - # Is RDoc in pipe mode? - - attr_accessor :pipe - - ## - # Array of directories to search for files to satisfy an :include: - - attr_reader :rdoc_include - - ## - # Include private and protected methods in the output? - - attr_accessor :show_all - - ## - # Include the '#' at the front of hyperlinked instance method names - - attr_reader :show_hash - - ## - # The number of columns in a tab - - attr_reader :tab_width - - ## - # Template to be used when generating output - - attr_reader :template - - ## - # Documentation title - - attr_reader :title - - ## - # Verbosity, zero means quiet - - attr_accessor :verbosity - - ## - # URL of web cvs frontend - - attr_reader :webcvs - - def initialize # :nodoc: - require 'rdoc/rdoc' - @op_dir = nil - @show_all = false - @main_page = nil - @exclude = [] - @generators = RDoc::RDoc::GENERATORS - @generator = RDoc::Generator::Darkfish - @generator_name = nil - @rdoc_include = [] - @title = nil - @template = nil - @show_hash = false - @tab_width = 8 - @force_update = true - @verbosity = 1 - @pipe = false - - @webcvs = nil - - @charset = 'utf-8' - end - - ## - # Parse command line options. - - def parse(argv) - ignore_invalid = true - - opts = OptionParser.new do |opt| - opt.program_name = File.basename $0 - opt.version = RDoc::VERSION - opt.release = nil - opt.summary_indent = ' ' * 4 - opt.banner = <<-EOF -Usage: #{opt.program_name} [options] [names...] - - Files are parsed, and the information they contain collected, before any - output is produced. This allows cross references between all files to be - resolved. If a name is a directory, it is traversed. If no names are - specified, all Ruby files in the current directory (and subdirectories) are - processed. - - How RDoc generates output depends on the output formatter being used, and on - the options you give. - - - Darkfish creates frameless HTML output by Michael Granger. - - ri creates ri data files - - RDoc understands the following file formats: - - EOF - - parsers = Hash.new { |h,parser| h[parser] = [] } - - RDoc::Parser.parsers.each do |regexp, parser| - parsers[parser.name.sub('RDoc::Parser::', '')] << regexp.source - end - - parsers.sort.each do |parser, regexp| - opt.banner << " - #{parser}: #{regexp.join ', '}\n" - end - - opt.separator nil - opt.separator "Parsing Options:" - opt.separator nil - - opt.on("--all", "-a", - "Include all methods (not just public) in", - "the output.") do |value| - @show_all = value - end - - opt.separator nil - - opt.on("--exclude=PATTERN", "-x", Regexp, - "Do not process files or directories", - "matching PATTERN.") do |value| - @exclude << value - end - - opt.separator nil - - opt.on("--extension=NEW=OLD", "-E", - "Treat files ending with .new as if they", - "ended with .old. Using '-E cgi=rb' will", - "cause xxx.cgi to be parsed as a Ruby file.") do |value| - new, old = value.split(/=/, 2) - - unless new and old then - raise OptionParser::InvalidArgument, "Invalid parameter to '-E'" - end - - unless RDoc::Parser.alias_extension old, new then - raise OptionParser::InvalidArgument, "Unknown extension .#{old} to -E" - end - end - - opt.separator nil - - opt.on("--[no-]force-update", "-U", - "Forces rdoc to scan all sources even if", - "newer than the flag file.") do |value| - @force_update = value - end - - opt.separator nil - - opt.on("--pipe", - "Convert RDoc on stdin to HTML") do - @pipe = true - end - - opt.separator nil - opt.separator "Generator Options:" - opt.separator nil - - opt.on("--charset=CHARSET", "-c", - "Specifies the output HTML character-set.") do |value| - @charset = value - end - - opt.separator nil - - generator_text = @generators.keys.map { |name| " #{name}" }.sort - - opt.on("--fmt=FORMAT", "--format=FORMAT", "-f", @generators.keys, - "Set the output formatter. One of:", *generator_text) do |value| - @generator_name = value.downcase - setup_generator - end - - opt.separator nil - - opt.on("--include=DIRECTORIES", "-i", Array, - "Set (or add to) the list of directories to", - "be searched when satisfying :include:", - "requests. Can be used more than once.") do |value| - @rdoc_include.concat value.map { |dir| dir.strip } - end - - opt.separator nil - - opt.on("--main=NAME", "-m", - "NAME will be the initial page displayed.") do |value| - @main_page = value - end - - opt.separator nil - - opt.on("--output=DIR", "--op", "-o", - "Set the output directory.") do |value| - @op_dir = value - end - - opt.separator nil - - opt.on("--show-hash", "-H", - "A name of the form #name in a comment is a", - "possible hyperlink to an instance method", - "name. When displayed, the '#' is removed", - "unless this option is specified.") do |value| - @show_hash = value - end - - opt.separator nil - - opt.on("--tab-width=WIDTH", "-w", OptionParser::DecimalInteger, - "Set the width of tab characters.") do |value| - @tab_width = value - end - - opt.separator nil - - opt.on("--template=NAME", "-T", - "Set the template used when generating", - "output.") do |value| - @template = value - end - - opt.separator nil - - opt.on("--title=TITLE", "-t", - "Set TITLE as the title for HTML output.") do |value| - @title = value - end - - opt.separator nil - - opt.on("--webcvs=URL", "-W", - "Specify a URL for linking to a web frontend", - "to CVS. If the URL contains a '\%s', the", - "name of the current file will be", - "substituted; if the URL doesn't contain a", - "'\%s', the filename will be appended to it.") do |value| - @webcvs = value - end - - opt.separator nil - - opt.on("-d", "--diagram", "Prevents -d from tripping --debug") - - opt.separator nil - opt.separator "ri Generator Options:" - opt.separator nil - - opt.on("--ri", "-r", - "Generate output for use by `ri`. The files", - "are stored in the '.rdoc' directory under", - "your home directory unless overridden by a", - "subsequent --op parameter, so no special", - "privileges are needed.") do |value| - @generator_name = "ri" - @op_dir ||= RDoc::RI::Paths::HOMEDIR - setup_generator - end - - opt.separator nil - - opt.on("--ri-site", "-R", - "Generate output for use by `ri`. The files", - "are stored in a site-wide directory,", - "making them accessible to others, so", - "special privileges are needed.") do |value| - @generator_name = "ri" - @op_dir = RDoc::RI::Paths::SITEDIR - setup_generator - end - - opt.separator nil - opt.separator "Generic Options:" - opt.separator nil - - opt.on("-D", "--[no-]debug", - "Displays lots on internal stuff.") do |value| - $DEBUG_RDOC = value - end - - opt.on("--[no-]ignore-invalid", - "Ignore invalid options and continue.") do |value| - ignore_invalid = value - end - - opt.on("--quiet", "-q", - "Don't show progress as we parse.") do |value| - @verbosity = 0 - end - - opt.on("--verbose", "-v", - "Display extra progress as we parse.") do |value| - @verbosity = 2 - end - - opt.separator nil - end - - argv.insert(0, *ENV['RDOCOPT'].split) if ENV['RDOCOPT'] - ignored = [] - - begin - opts.parse! argv - rescue OptionParser::InvalidArgument, OptionParser::InvalidOption => e - if ignore_invalid then - ignored << e.args.join(' ') - retry - else - $stderr.puts opts - $stderr.puts - $stderr.puts e - exit 1 - end - end - - if @pipe and not argv.empty? then - @pipe = false - ignored << '-p (with files)' - end - - unless ignored.empty? or quiet then - $stderr.puts "invalid options: #{ignored.join ', '}" - $stderr.puts '(invalid options are ignored)' - end - - @op_dir ||= 'doc' - @files = argv.dup - - @rdoc_include << "." if @rdoc_include.empty? - - if @exclude.empty? then - @exclude = nil - else - @exclude = Regexp.new(@exclude.join("|")) - end - - check_files - - # If no template was specified, use the default template for the output - # formatter - - @template ||= @generator_name - end - - ## - # Set the title, but only if not already set. This means that a title set - # from the command line trumps one set in a source file - - def title=(string) - @title ||= string - end - - ## - # Don't display progress as we process the files - - def quiet - @verbosity.zero? - end - - def quiet=(bool) - @verbosity = bool ? 0 : 1 - end - - private - - ## - # Set up an output generator for the format in @generator_name - - def setup_generator - @generator = @generators[@generator_name] - - unless @generator then - raise OptionParser::InvalidArgument, "Invalid output formatter" - end - end - - ## - # Check that the files on the command line exist - - def check_files - @files.each do |f| - stat = File.stat f rescue next - raise RDoc::Error, "file '#{f}' not readable" unless stat.readable? - end - end - -end - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/parser.rb b/Src/StdLib/ruby/1.9.1/rdoc/parser.rb deleted file mode 100644 index 80b97f8d5..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/parser.rb +++ /dev/null @@ -1,157 +0,0 @@ -require 'rdoc' -require 'rdoc/code_objects' -require 'rdoc/markup/preprocess' -require 'rdoc/stats' - -## -# A parser is simple a class that implements -# -# #initialize(file_name, body, options) -# -# and -# -# #scan -# -# The initialize method takes a file name to be used, the body of the file, -# and an RDoc::Options object. The scan method is then called to return an -# appropriately parsed TopLevel code object. -# -# The ParseFactory is used to redirect to the correct parser given a -# filename extension. This magic works because individual parsers have to -# register themselves with us as they are loaded in. The do this using the -# following incantation -# -# require "rdoc/parser" -# -# class RDoc::Parser::Xyz < RDoc::Parser -# parse_files_matching /\.xyz$/ # <<<< -# -# def initialize(file_name, body, options) -# ... -# end -# -# def scan -# ... -# end -# end -# -# Just to make life interesting, if we suspect a plain text file, we also -# look for a shebang line just in case it's a potential shell script - -class RDoc::Parser - - @parsers = [] - - class << self - attr_reader :parsers - end - - ## - # Alias an extension to another extension. After this call, files ending - # "new_ext" will be parsed using the same parser as "old_ext" - - def self.alias_extension(old_ext, new_ext) - old_ext = old_ext.sub(/^\.(.*)/, '\1') - new_ext = new_ext.sub(/^\.(.*)/, '\1') - - parser = can_parse "xxx.#{old_ext}" - return false unless parser - - RDoc::Parser.parsers.unshift [/\.#{new_ext}$/, parser] - - true - end - - ## - # Determines if the file is a "binary" file which basically means it has - # content that an RDoc parser shouldn't try to consume. - - def self.binary?(file) - s = File.read(file, 1024) or return false - - if s[0, 2] == Marshal.dump('')[0, 2] then - true - elsif file =~ /erb\.rb$/ then - false - elsif s.scan(/<%|%>/).length >= 4 || s.index("\x00") then - true - elsif 0.respond_to? :fdiv then - s.count("^ -~\t\r\n").fdiv(s.size) > 0.3 - else # HACK 1.8.6 - (s.count("^ -~\t\r\n").to_f / s.size) > 0.3 - end - end - - ## - # Checks if +file+ is a zip file in disguise. Signatures from - # http://www.garykessler.net/library/file_sigs.html - - def self.zip? file - zip_signature = File.read file, 4 - - zip_signature == "PK\x03\x04" or - zip_signature == "PK\x05\x06" or - zip_signature == "PK\x07\x08" - end - - ## - # Return a parser that can handle a particular extension - - def self.can_parse(file_name) - parser = RDoc::Parser.parsers.find { |regexp,| regexp =~ file_name }.last - - # HACK Selenium hides a jar file using a .txt extension - return if parser == RDoc::Parser::Simple and zip? file_name - - # The default parser must not parse binary files - ext_name = File.extname file_name - return parser if ext_name.empty? - return if parser == RDoc::Parser::Simple and ext_name !~ /txt|rdoc/ - - parser - end - - ## - # Find the correct parser for a particular file name. Return a SimpleParser - # for ones that we don't know - - def self.for(top_level, file_name, body, options, stats) - return if binary? file_name - - # If no extension, look for shebang - if file_name !~ /\.\w+$/ && body =~ %r{\A#!(.+)} then - shebang = $1 - case shebang - when %r{env\s+ruby}, %r{/ruby} - file_name = "dummy.rb" - end - end - - parser = can_parse file_name - - return unless parser - - parser.new top_level, file_name, body, options, stats - end - - ## - # Record which file types this parser can understand. - # - # It is ok to call this multiple times. - - def self.parse_files_matching(regexp) - RDoc::Parser.parsers.unshift [regexp, self] - end - - def initialize(top_level, file_name, content, options, stats) - @top_level = top_level - @file_name = file_name - @content = content - @options = options - @stats = stats - end - -end - -require 'rdoc/parser/simple' - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/parser/c.rb b/Src/StdLib/ruby/1.9.1/rdoc/parser/c.rb deleted file mode 100644 index c9b12ef99..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/parser/c.rb +++ /dev/null @@ -1,705 +0,0 @@ -require 'rdoc/parser' -require 'rdoc/parser/ruby' -require 'rdoc/known_classes' - -## -# We attempt to parse C extension files. Basically we look for -# the standard patterns that you find in extensions: rb_define_class, -# rb_define_method and so on. We also try to find the corresponding -# C source for the methods and extract comments, but if we fail -# we don't worry too much. -# -# The comments associated with a Ruby method are extracted from the C -# comment block associated with the routine that _implements_ that -# method, that is to say the method whose name is given in the -# rb_define_method call. For example, you might write: -# -# /* -# * Returns a new array that is a one-dimensional flattening of this -# * array (recursively). That is, for every element that is an array, -# * extract its elements into the new array. -# * -# * s = [ 1, 2, 3 ] #=> [1, 2, 3] -# * t = [ 4, 5, 6, [7, 8] ] #=> [4, 5, 6, [7, 8]] -# * a = [ s, t, 9, 10 ] #=> [[1, 2, 3], [4, 5, 6, [7, 8]], 9, 10] -# * a.flatten #=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] -# */ -# static VALUE -# rb_ary_flatten(ary) -# VALUE ary; -# { -# ary = rb_obj_dup(ary); -# rb_ary_flatten_bang(ary); -# return ary; -# } -# -# ... -# -# void -# Init_Array() -# { -# ... -# rb_define_method(rb_cArray, "flatten", rb_ary_flatten, 0); -# -# Here RDoc will determine from the rb_define_method line that there's a -# method called "flatten" in class Array, and will look for the implementation -# in the method rb_ary_flatten. It will then use the comment from that -# method in the HTML output. This method must be in the same source file -# as the rb_define_method. -# -# The comment blocks may include special directives: -# -# [Document-class: name] -# This comment block is documentation for the given class. Use this -# when the Init_xxx method is not named after the class. -# -# [Document-method: name] -# This comment documents the named method. Use when RDoc cannot -# automatically find the method from it's declaration -# -# [call-seq: text up to an empty line] -# Because C source doesn't give descripive names to Ruby-level parameters, -# you need to document the calling sequence explicitly -# -# In addition, RDoc assumes by default that the C method implementing a -# Ruby function is in the same source file as the rb_define_method call. -# If this isn't the case, add the comment: -# -# rb_define_method(....); // in filename -# -# As an example, we might have an extension that defines multiple classes -# in its Init_xxx method. We could document them using -# -# /* -# * Document-class: MyClass -# * -# * Encapsulate the writing and reading of the configuration -# * file. ... -# */ -# -# /* -# * Document-method: read_value -# * -# * call-seq: -# * cfg.read_value(key) -> value -# * cfg.read_value(key} { |key| } -> value -# * -# * Return the value corresponding to +key+ from the configuration. -# * In the second form, if the key isn't found, invoke the -# * block and return its value. -# */ - -class RDoc::Parser::C < RDoc::Parser - - parse_files_matching(/\.(?:([CcHh])\1?|c([+xp])\2|y)\z/) - - include RDoc::Text - - ## - # C file the parser is parsing - - attr_accessor :content - - ## - # Resets cross-file state. Call when parsing different projects that need - # separate documentation. - - def self.reset - @@enclosure_classes = {} - @@known_bodies = {} - end - - reset - - ## - # Prepare to parse a C file - - def initialize(top_level, file_name, content, options, stats) - super - - @known_classes = RDoc::KNOWN_CLASSES.dup - @content = handle_tab_width handle_ifdefs_in(@content) - @classes = Hash.new - @file_dir = File.dirname(@file_name) - end - - def do_aliases - @content.scan(%r{rb_define_alias\s*\(\s*(\w+),\s*"([^"]+)",\s*"([^"]+)"\s*\)}m) do - |var_name, new_name, old_name| - class_name = @known_classes[var_name] || var_name - class_obj = find_class(var_name, class_name) - - as = class_obj.add_alias RDoc::Alias.new("", old_name, new_name, "") - - @stats.add_alias as - end - end - - def do_classes - @content.scan(/(\w+)\s* = \s*rb_define_module\s*\(\s*"(\w+)"\s*\)/mx) do - |var_name, class_name| - handle_class_module(var_name, "module", class_name, nil, nil) - end - - # The '.' lets us handle SWIG-generated files - @content.scan(/([\w\.]+)\s* = \s*rb_define_class\s* - \( - \s*"(\w+)", - \s*(\w+)\s* - \)/mx) do |var_name, class_name, parent| - handle_class_module(var_name, "class", class_name, parent, nil) - end - - @content.scan(/(\w+)\s*=\s*boot_defclass\s*\(\s*"(\w+?)",\s*(\w+?)\s*\)/) do - |var_name, class_name, parent| - parent = nil if parent == "0" - handle_class_module(var_name, "class", class_name, parent, nil) - end - - @content.scan(/(\w+)\s* = \s*rb_define_module_under\s* - \( - \s*(\w+), - \s*"(\w+)" - \s*\)/mx) do |var_name, in_module, class_name| - handle_class_module(var_name, "module", class_name, nil, in_module) - end - - @content.scan(/([\w\.]+)\s* = \s*rb_define_class_under\s* - \( - \s*(\w+), - \s*"(\w+)", - \s*([\w\*\s\(\)\.\->]+)\s* # for SWIG - \s*\)/mx) do |var_name, in_module, class_name, parent| - handle_class_module(var_name, "class", class_name, parent, in_module) - end - end - - def do_constants - @content.scan(%r{\Wrb_define_ - ( variable | - readonly_variable | - const | - global_const | ) - \s*\( - (?:\s*(\w+),)? - \s*"(\w+)", - \s*(.*?)\s*\)\s*; - }xm) do |type, var_name, const_name, definition| - var_name = "rb_cObject" if !var_name or var_name == "rb_mKernel" - handle_constants type, var_name, const_name, definition - end - end - - ## - # Look for includes of the form: - # - # rb_include_module(rb_cArray, rb_mEnumerable); - - def do_includes - @content.scan(/rb_include_module\s*\(\s*(\w+?),\s*(\w+?)\s*\)/) do |c,m| - if cls = @classes[c] - m = @known_classes[m] || m - cls.add_include RDoc::Include.new(m, "") - end - end - end - - def do_methods - @content.scan(%r{rb_define_ - ( - singleton_method | - method | - module_function | - private_method - ) - \s*\(\s*([\w\.]+), - \s*"([^"]+)", - \s*(?:RUBY_METHOD_FUNC\(|VALUEFUNC\()?(\w+)\)?, - \s*(-?\w+)\s*\) - (?:;\s*/[*/]\s+in\s+(\w+?\.[cy]))? - }xm) do - |type, var_name, meth_name, meth_body, param_count, source_file| - - # Ignore top-object and weird struct.c dynamic stuff - next if var_name == "ruby_top_self" - next if var_name == "nstr" - next if var_name == "envtbl" - next if var_name == "argf" # it'd be nice to handle this one - - var_name = "rb_cObject" if var_name == "rb_mKernel" - handle_method(type, var_name, meth_name, meth_body, param_count, - source_file) - end - - @content.scan(%r{rb_define_attr\( - \s*([\w\.]+), - \s*"([^"]+)", - \s*(\d+), - \s*(\d+)\s*\); - }xm) do |var_name, attr_name, attr_reader, attr_writer| - #var_name = "rb_cObject" if var_name == "rb_mKernel" - handle_attr(var_name, attr_name, - attr_reader.to_i != 0, - attr_writer.to_i != 0) - end - - @content.scan(%r{rb_define_global_function\s*\( - \s*"([^"]+)", - \s*(?:RUBY_METHOD_FUNC\(|VALUEFUNC\()?(\w+)\)?, - \s*(-?\w+)\s*\) - (?:;\s*/[*/]\s+in\s+(\w+?\.[cy]))? - }xm) do |meth_name, meth_body, param_count, source_file| - handle_method("method", "rb_mKernel", meth_name, - meth_body, param_count, source_file) - end - - @content.scan(/define_filetest_function\s*\( - \s*"([^"]+)", - \s*(?:RUBY_METHOD_FUNC\(|VALUEFUNC\()?(\w+)\)?, - \s*(-?\w+)\s*\)/xm) do - |meth_name, meth_body, param_count| - - handle_method("method", "rb_mFileTest", meth_name, meth_body, param_count) - handle_method("singleton_method", "rb_cFile", meth_name, meth_body, param_count) - end - end - - def find_attr_comment(attr_name) - if @content =~ %r{((?>/\*.*?\*/\s+)) - rb_define_attr\((?:\s*(\w+),)?\s*"#{attr_name}"\s*,.*?\)\s*;}xmi - $1 - elsif @content =~ %r{Document-attr:\s#{attr_name}\s*?\n((?>.*?\*/))}m - $1 - else - '' - end - end - - ## - # Find the C code corresponding to a Ruby method - - def find_body(class_name, meth_name, meth_obj, body, quiet = false) - case body - when %r"((?>/\*.*?\*/\s*))((?:(?:static|SWIGINTERN)\s+)?(?:intern\s+)?VALUE\s+#{meth_name} - \s*(\([^)]*\))([^;]|$))"xm - comment = $1 - body_text = $2 - params = $3 - - remove_private_comments comment if comment - - # see if we can find the whole body - - re = Regexp.escape(body_text) + '[^(]*^\{.*?^\}' - body_text = $& if /#{re}/m =~ body - - # The comment block may have been overridden with a 'Document-method' - # block. This happens in the interpreter when multiple methods are - # vectored through to the same C method but those methods are logically - # distinct (for example Kernel.hash and Kernel.object_id share the same - # implementation - - override_comment = find_override_comment class_name, meth_obj.name - comment = override_comment if override_comment - - find_modifiers comment, meth_obj if comment - - #meth_obj.params = params - meth_obj.start_collecting_tokens - tk = RDoc::RubyToken::Token.new nil, 1, 1 - tk.set_text body_text - meth_obj.add_token tk - meth_obj.comment = strip_stars comment - when %r{((?>/\*.*?\*/\s*))^\s*(\#\s*define\s+#{meth_name}\s+(\w+))}m - comment = $1 - body_text = $2 - find_body class_name, $3, meth_obj, body, true - find_modifiers comment, meth_obj - - meth_obj.start_collecting_tokens - tk = RDoc::RubyToken::Token.new nil, 1, 1 - tk.set_text body_text - meth_obj.add_token tk - meth_obj.comment = strip_stars(comment) + meth_obj.comment.to_s - when %r{^\s*\#\s*define\s+#{meth_name}\s+(\w+)}m - unless find_body(class_name, $1, meth_obj, body, true) - warn "No definition for #{meth_name}" unless @options.quiet - return false - end - else - # No body, but might still have an override comment - comment = find_override_comment(class_name, meth_obj.name) - - if comment - find_modifiers(comment, meth_obj) - meth_obj.comment = strip_stars comment - else - warn "No definition for #{meth_name}" unless @options.quiet - return false - end - end - true - end - - def find_class(raw_name, name) - unless @classes[raw_name] - if raw_name =~ /^rb_m/ - container = @top_level.add_module RDoc::NormalModule, name - else - container = @top_level.add_class RDoc::NormalClass, name - end - - container.record_location @top_level - @classes[raw_name] = container - end - @classes[raw_name] - end - - ## - # Look for class or module documentation above Init_+class_name+(void), - # in a Document-class +class_name+ (or module) comment or above an - # rb_define_class (or module). If a comment is supplied above a matching - # Init_ and a rb_define_class the Init_ comment is used. - # - # /* - # * This is a comment for Foo - # */ - # Init_Foo(void) { - # VALUE cFoo = rb_define_class("Foo", rb_cObject); - # } - # - # /* - # * Document-class: Foo - # * This is a comment for Foo - # */ - # Init_foo(void) { - # VALUE cFoo = rb_define_class("Foo", rb_cObject); - # } - # - # /* - # * This is a comment for Foo - # */ - # VALUE cFoo = rb_define_class("Foo", rb_cObject); - - def find_class_comment(class_name, class_mod) - comment = nil - - if @content =~ %r{ - ((?>/\*.*?\*/\s+)) - (static\s+)? - void\s+ - Init_#{class_name}\s*(?:_\(\s*)?\(\s*(?:void\s*)?\)}xmi then # ) - comment = $1 - elsif @content =~ %r{Document-(?:class|module):\s+#{class_name}\s*?(?:<\s+[:,\w]+)?\n((?>.*?\*/))}m then - comment = $1 - elsif @content =~ %r{((?>/\*.*?\*/\s+)) - ([\w\.\s]+\s* = \s+)?rb_define_(class|module).*?"(#{class_name})"}xm then # " - comment = $1 - end - - return unless comment - - comment = strip_stars comment - - comment = look_for_directives_in class_mod, comment - - class_mod.comment = comment - end - - ## - # Finds a comment matching +type+ and +const_name+ either above the - # comment or in the matching Document- section. - - def find_const_comment(type, const_name) - if @content =~ %r{((?>^\s*/\*.*?\*/\s+)) - rb_define_#{type}\((?:\s*(\w+),)?\s*"#{const_name}"\s*,.*?\)\s*;}xmi - $1 - elsif @content =~ %r{Document-(?:const|global|variable):\s#{const_name}\s*?\n((?>.*?\*/))}m - $1 - else - '' - end - end - - ## - # If the comment block contains a section that looks like: - # - # call-seq: - # Array.new - # Array.new(10) - # - # use it for the parameters. - - def find_modifiers(comment, meth_obj) - if comment.sub!(/:nodoc:\s*^\s*\*?\s*$/m, '') or - comment.sub!(/\A\/\*\s*:nodoc:\s*\*\/\Z/, '') - meth_obj.document_self = false - end - if comment.sub!(/call-seq:(.*?)^\s*\*?\s*$/m, '') or - comment.sub!(/\A\/\*\s*call-seq:(.*?)\*\/\Z/, '') - seq = $1 - seq.gsub!(/^\s*\*\s*/, '') - meth_obj.call_seq = seq - end - end - - def find_override_comment(class_name, meth_name) - name = Regexp.escape(meth_name) - if @content =~ %r{Document-method:\s+#{class_name}(?:\.|::|#)#{name}\s*?\n((?>.*?\*/))}m then - $1 - elsif @content =~ %r{Document-method:\s#{name}\s*?\n((?>.*?\*/))}m then - $1 - end - end - - def handle_attr(var_name, attr_name, reader, writer) - rw = '' - rw << 'R' if reader - rw << 'W' if writer - - class_name = @known_classes[var_name] - - return unless class_name - - class_obj = find_class(var_name, class_name) - - if class_obj - comment = find_attr_comment(attr_name) - comment = strip_stars comment - att = RDoc::Attr.new '', attr_name, rw, comment - @stats.add_method att - class_obj.add_attribute(att) - end - end - - def handle_class_module(var_name, type, class_name, parent, in_module) - parent_name = @known_classes[parent] || parent - - if in_module then - enclosure = @classes[in_module] || @@enclosure_classes[in_module] - - if enclosure.nil? and enclosure = @known_classes[in_module] then - type = /^rb_m/ =~ in_module ? "module" : "class" - handle_class_module in_module, type, enclosure, nil, nil - enclosure = @classes[in_module] - end - - unless enclosure then - warn "Enclosing class/module '#{in_module}' for #{type} #{class_name} not known" - return - end - else - enclosure = @top_level - end - - if type == "class" then - full_name = if RDoc::ClassModule === enclosure then - enclosure.full_name + "::#{class_name}" - else - class_name - end - - if @content =~ %r{Document-class:\s+#{full_name}\s*<\s+([:,\w]+)} then - parent_name = $1 - end - - cm = enclosure.add_class RDoc::NormalClass, class_name, parent_name - - @stats.add_class cm - else - cm = enclosure.add_module RDoc::NormalModule, class_name - @stats.add_module cm - end - - cm.record_location enclosure.top_level - - find_class_comment cm.full_name, cm - - @classes[var_name] = cm - @@enclosure_classes[var_name] = cm - @known_classes[var_name] = cm.full_name - end - - ## - # Adds constant comments. By providing some_value: at the start ofthe - # comment you can override the C value of the comment to give a friendly - # definition. - # - # /* 300: The perfect score in bowling */ - # rb_define_const(cFoo, "PERFECT", INT2FIX(300); - # - # Will override +INT2FIX(300)+ with the value +300+ in the output RDoc. - # Values may include quotes and escaped colons (\:). - - def handle_constants(type, var_name, const_name, definition) - class_name = @known_classes[var_name] - - return unless class_name - - class_obj = find_class var_name, class_name - - unless class_obj then - warn "Enclosing class/module #{const_name.inspect} not known" - return - end - - comment = find_const_comment type, const_name - comment = strip_stars comment - comment = normalize_comment comment - - # In the case of rb_define_const, the definition and comment are in - # "/* definition: comment */" form. The literal ':' and '\' characters - # can be escaped with a backslash. - if type.downcase == 'const' then - elements = comment.split ':' - - if elements.nil? or elements.empty? then - con = RDoc::Constant.new const_name, definition, comment - else - new_definition = elements[0..-2].join(':') - - if new_definition.empty? then # Default to literal C definition - new_definition = definition - else - new_definition.gsub!("\:", ":") - new_definition.gsub!("\\", '\\') - end - - new_definition.sub!(/\A(\s+)/, '') - - new_comment = if $1.nil? then - elements.last.lstrip - else - "#{$1}#{elements.last.lstrip}" - end - - con = RDoc::Constant.new const_name, new_definition, new_comment - end - else - con = RDoc::Constant.new const_name, definition, comment - end - - @stats.add_constant con - class_obj.add_constant con - end - - ## - # Removes #ifdefs that would otherwise confuse us - - def handle_ifdefs_in(body) - body.gsub(/^#ifdef HAVE_PROTOTYPES.*?#else.*?\n(.*?)#endif.*?\n/m, '\1') - end - - def handle_method(type, var_name, meth_name, meth_body, param_count, - source_file = nil) - class_name = @known_classes[var_name] - - return unless class_name - - class_obj = find_class var_name, class_name - - if class_obj then - if meth_name == "initialize" then - meth_name = "new" - type = "singleton_method" - end - - meth_obj = RDoc::AnyMethod.new '', meth_name - meth_obj.singleton = %w[singleton_method module_function].include? type - - p_count = Integer(param_count) rescue -1 - - if p_count < 0 then - meth_obj.params = "(...)" - elsif p_count == 0 - meth_obj.params = "()" - else - meth_obj.params = "(" + (1..p_count).map{|i| "p#{i}"}.join(", ") + ")" - end - - if source_file then - file_name = File.join @file_dir, source_file - - if File.exist? file_name then - body = (@@known_bodies[file_name] ||= File.read(file_name)) - else - warn "unknown source #{source_file} for #{meth_name} in #{@file_name}" - end - else - body = @content - end - - if find_body(class_name, meth_body, meth_obj, body) and meth_obj.document_self then - class_obj.add_method meth_obj - @stats.add_method meth_obj - meth_obj.visibility = :private if 'private_method' == type - end - end - end - - def handle_tab_width(body) - if /\t/ =~ body - tab_width = @options.tab_width - body.split(/\n/).map do |line| - 1 while line.gsub!(/\t+/) { ' ' * (tab_width*$&.length - $`.length % tab_width)} && $~ #` - line - end .join("\n") - else - body - end - end - - ## - # Look for directives in a normal comment block: - # - # /* - # * :title: My Awesome Project - # */ - # - # This routine modifies it's parameter - - def look_for_directives_in(context, comment) - preprocess = RDoc::Markup::PreProcess.new @file_name, @options.rdoc_include - - preprocess.handle comment, context do |directive, param| - case directive - when 'main' then - @options.main_page = param - '' - when 'title' then - @options.title = param - '' - end - end - - comment - end - ## - # Removes lines that are commented out that might otherwise get picked up - # when scanning for classes and methods - - def remove_commented_out_lines - @content.gsub!(%r{//.*rb_define_}, '//') - end - - def remove_private_comments(comment) - comment.gsub!(/\/?\*--\n(.*?)\/?\*\+\+/m, '') - comment.sub!(/\/?\*--\n.*/m, '') - end - - ## - # Extract the classes/modules and methods from a C file and return the - # corresponding top-level object - - def scan - remove_commented_out_lines - do_classes - do_constants - do_methods - do_includes - do_aliases - @top_level - end - -end - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/parser/perl.rb b/Src/StdLib/ruby/1.9.1/rdoc/parser/perl.rb deleted file mode 100644 index 032a35cec..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/parser/perl.rb +++ /dev/null @@ -1,165 +0,0 @@ -require 'rdoc/parser' - -## -# -# This is an attamept to write a basic parser for Perl's -# POD (Plain old Documentation) format. Ruby code must -# co-exist with Perl, and some tasks are easier in Perl -# than Ruby because of existing libraries. -# -# One difficult is that Perl POD has no means of identifying -# the classes (packages) and methods (subs) with which it -# is associated, it is more like literate programming in so -# far as it just happens to be in the same place as the code, -# but need not be. -# -# We would like to support all the markup the POD provides -# so that it will convert happily to HTML. At the moment -# I don't think I can do that: time constraints. -# - -class RDoc::Parser::PerlPOD < RDoc::Parser - - parse_files_matching(/.p[lm]$/) - - ## - # Prepare to parse a perl file - - def initialize(top_level, file_name, content, options, stats) - super - - preprocess = RDoc::Markup::PreProcess.new @file_name, @options.rdoc_include - - preprocess.handle @content do |directive, param| - warn "Unrecognized directive '#{directive}' in #{@file_name}" - end - end - - ## - # Extract the Pod(-like) comments from the code. - # At its most basic there will ne no need to distinguish - # between the different types of header, etc. - # - # This uses a simple finite state machine, in a very - # procedural pattern. I could "replace case with polymorphism" - # but I think it would obscure the intent, scatter the - # code all over tha place. This machine is necessary - # because POD requires that directives be preceded by - # blank lines, so reading line by line is necessary, - # and preserving state about what is seen is necesary. - - def scan - - @top_level.comment ||= "" - state=:code_blank - line_number = 0 - line = nil - - # This started out as a really long nested case statement, - # which also led to repetitive code. I'd like to avoid that - # so I'm using a "table" instead. - - # Firstly we need some procs to do the transition and processing - # work. Because these are procs they are closures, and they can - # use variables in the local scope. - # - # First, the "nothing to see here" stuff. - code_noop = lambda do - if line =~ /^\s+$/ - state = :code_blank - end - end - - pod_noop = lambda do - if line =~ /^\s+$/ - state = :pod_blank - end - @top_level.comment += filter(line) - end - - begin_noop = lambda do - if line =~ /^\s+$/ - state = :begin_blank - end - @top_level.comment += filter(line) - end - - # Now for the blocks that process code and comments... - - transit_to_pod = lambda do - case line - when /^=(?:pod|head\d+)/ - state = :pod_no_blank - @top_level.comment += filter(line) - when /^=over/ - state = :over_no_blank - @top_level.comment += filter(line) - when /^=(?:begin|for)/ - state = :begin_no_blank - end - end - - process_pod = lambda do - case line - when /^\s*$/ - state = :pod_blank - @top_level.comment += filter(line) - when /^=cut/ - state = :code_no_blank - when /^=end/ - $stderr.puts "'=end' unexpected at #{line_number} in #{@file_name}" - else - @top_level.comment += filter(line) - end - end - - - process_begin = lambda do - case line - when /^\s*$/ - state = :begin_blank - @top_level.comment += filter(line) - when /^=end/ - state = :code_no_blank - when /^=cut/ - $stderr.puts "'=cut' unexpected at #{line_number} in #{@file_name}" - else - @top_level.comment += filter(line) - end - - end - - - transitions = { :code_no_blank => code_noop, - :code_blank => transit_to_pod, - :pod_no_blank => pod_noop, - :pod_blank => process_pod, - :begin_no_blank => begin_noop, - :begin_blank => process_begin} - @content.each_line do |l| - line = l - line_number += 1 - transitions[state].call - end # each line - - @top_level - end - - # Filter the perl markup that does the same as the rdoc - # filtering. Only basic for now. Will probably need a - # proper parser to cope with C<<...>> etc - def filter(comment) - return '' if comment =~ /^=pod\s*$/ - comment.gsub!(/^=pod/, '==') - comment.gsub!(/^=head(\d+)/) do - "=" * $1.to_i - end - comment.gsub!(/=item/, ''); - comment.gsub!(/C<(.*?)>/, '\1'); - comment.gsub!(/I<(.*?)>/, '\1'); - comment.gsub!(/B<(.*?)>/, '\1'); - comment - end - -end - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/parser/ruby.rb b/Src/StdLib/ruby/1.9.1/rdoc/parser/ruby.rb deleted file mode 100644 index 4698fd82a..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/parser/ruby.rb +++ /dev/null @@ -1,1599 +0,0 @@ -## -# This file contains stuff stolen outright from: -# -# rtags.rb - -# ruby-lex.rb - ruby lexcal analyzer -# ruby-token.rb - ruby tokens -# by Keiju ISHITSUKA (Nippon Rational Inc.) -# - -require 'rdoc/ruby_token' -require 'rdoc/ruby_lex' - -require 'rdoc/code_objects' -require 'rdoc/tokenstream' -require 'rdoc/markup/preprocess' -require 'rdoc/parser' -require 'rdoc/parser/ruby_tools' - -$TOKEN_DEBUG ||= nil - -## -# Extracts code elements from a source file returning a TopLevel object -# containing the constituent file elements. -# -# This file is based on rtags -# -# RubyParser understands how to document: -# * classes -# * modules -# * methods -# * constants -# * aliases -# * private, public, protected -# * private_class_function, public_class_function -# * module_function -# * attr, attr_reader, attr_writer, attr_accessor -# * extra accessors given on the command line -# * metaprogrammed methods -# * require -# * include -# -# == Method Arguments -# -#-- -# NOTE: I don't think this works, needs tests, remove the paragraph following -# this block when known to work -# -# The parser extracts the arguments from the method definition. You can -# override this with a custom argument definition using the :args: directive: -# -# ## -# # This method tries over and over until it is tired -# -# def go_go_go(thing_to_try, tries = 10) # :args: thing_to_try -# puts thing_to_try -# go_go_go thing_to_try, tries - 1 -# end -# -# If you have a more-complex set of overrides you can use the :call-seq: -# directive: -#++ -# -# The parser extracts the arguments from the method definition. You can -# override this with a custom argument definition using the :call-seq: -# directive: -# -# ## -# # This method can be called with a range or an offset and length -# # -# # :call-seq: -# # my_method(Range) -# # my_method(offset, length) -# -# def my_method(*args) -# end -# -# The parser extracts +yield+ expressions from method bodies to gather the -# yielded argument names. If your method manually calls a block instead of -# yielding or you want to override the discovered argument names use -# the :yields: directive: -# -# ## -# # My method is awesome -# -# def my_method(&block) # :yields: happy, times -# block.call 1, 2 -# end -# -# == Metaprogrammed Methods -# -# To pick up a metaprogrammed method, the parser looks for a comment starting -# with '##' before an identifier: -# -# ## -# # This is a meta-programmed method! -# -# add_my_method :meta_method, :arg1, :arg2 -# -# The parser looks at the token after the identifier to determine the name, in -# this example, :meta_method. If a name cannot be found, a warning is printed -# and 'unknown is used. -# -# You can force the name of a method using the :method: directive: -# -# ## -# # :method: woo_hoo! -# -# By default, meta-methods are instance methods. To indicate that a method is -# a singleton method instead use the :singleton-method: directive: -# -# ## -# # :singleton-method: -# -# You can also use the :singleton-method: directive with a name: -# -# ## -# # :singleton-method: woo_hoo! -# -# Additionally you can mark a method as an attribute by -# using :attr:, :attr_reader:, :attr_writer: or :attr_accessor:. Just like -# for :method:, the name is optional. -# -# ## -# # :attr_reader: my_attr_name -# -# == Hidden methods and attributes -# -# You can provide documentation for methods that don't appear using -# the :method:, :singleton-method: and :attr: directives: -# -# ## -# # :attr_writer: ghost_writer -# # There is an attribute here, but you can't see it! -# -# ## -# # :method: ghost_method -# # There is a method here, but you can't see it! -# -# ## -# # this is a comment for a regular method -# -# def regular_method() end -# -# Note that by default, the :method: directive will be ignored if there is a -# standard rdocable item following it. - -class RDoc::Parser::Ruby < RDoc::Parser - - parse_files_matching(/\.rbw?$/) - - include RDoc::RubyToken - include RDoc::TokenStream - include RDoc::Parser::RubyTools - - ## - # RDoc::NormalClass type - - NORMAL = "::" - - ## - # RDoc::SingleClass type - - SINGLE = "<<" - - def initialize(top_level, file_name, content, options, stats) - super - - @size = 0 - @token_listeners = nil - @scanner = RDoc::RubyLex.new content, @options - @scanner.exception_on_syntax_error = false - @prev_seek = nil - - reset - end - - ## - # Look for the first comment in a file that isn't a shebang line. - - def collect_first_comment - skip_tkspace - comment = '' - first_line = true - - tk = get_tk - - while TkCOMMENT === tk - if first_line and tk.text =~ /\A#!/ then - skip_tkspace - tk = get_tk - elsif first_line and tk.text =~ /\A#\s*-\*-/ then - first_line = false - skip_tkspace - tk = get_tk - else - first_line = false - comment << tk.text << "\n" - tk = get_tk - - if TkNL === tk then - skip_tkspace false - tk = get_tk - end - end - end - - unget_tk tk - - comment - end - - def error(msg) - msg = make_message msg - $stderr.puts msg - exit false - end - - ## - # Look for a 'call-seq' in the comment, and override the normal parameter - # stuff - - def extract_call_seq(comment, meth) - if comment.sub!(/:?call-seq:(.*?)^\s*\#?\s*$/m, '') then - seq = $1 - seq.gsub!(/^\s*\#\s*/, '') - meth.call_seq = seq - end - - meth - end - - def get_bool - skip_tkspace - tk = get_tk - case tk - when TkTRUE - true - when TkFALSE, TkNIL - false - else - unget_tk tk - true - end - end - - ## - # Look for the name of a class of module (optionally with a leading :: or - # with :: separated named) and return the ultimate name and container - - def get_class_or_module(container) - skip_tkspace - name_t = get_tk - - # class ::A -> A is in the top level - case name_t - when TkCOLON2, TkCOLON3 then # bug - name_t = get_tk - container = @top_level - end - - skip_tkspace false - - while TkCOLON2 === peek_tk do - prev_container = container - container = container.find_module_named name_t.name - unless container then - container = prev_container.add_module RDoc::NormalModule, name_t.name - end - get_tk - name_t = get_tk - end - skip_tkspace false - return [container, name_t] - end - - ## - # Return a superclass, which can be either a constant of an expression - - def get_class_specification - tk = get_tk - return "self" if TkSELF === tk - - res = "" - while TkCOLON2 === tk or TkCOLON3 === tk or TkCONSTANT === tk do - res += tk.name - tk = get_tk - end - - unget_tk(tk) - skip_tkspace false - - get_tkread # empty out read buffer - - tk = get_tk - - case tk - when TkNL, TkCOMMENT, TkSEMICOLON then - unget_tk(tk) - return res - end - - res += parse_call_parameters(tk) - res - end - - ## - # Parse a constant, which might be qualified by one or more class or module - # names - - def get_constant - res = "" - skip_tkspace false - tk = get_tk - - while TkCOLON2 === tk or TkCOLON3 === tk or TkCONSTANT === tk do - res += tk.name - tk = get_tk - end - -# if res.empty? -# warn("Unexpected token #{tk} in constant") -# end - unget_tk(tk) - res - end - - ## - # Get a constant that may be surrounded by parens - - def get_constant_with_optional_parens - skip_tkspace false - nest = 0 - while TkLPAREN === (tk = peek_tk) or TkfLPAREN === tk do - get_tk - skip_tkspace - nest += 1 - end - - name = get_constant - - while nest > 0 - skip_tkspace - tk = get_tk - nest -= 1 if TkRPAREN === tk - end - - name - end - - def get_symbol_or_name - tk = get_tk - case tk - when TkSYMBOL then - text = tk.text.sub(/^:/, '') - - if TkASSIGN === peek_tk then - get_tk - text << '=' - end - - text - when TkId, TkOp then - tk.name - when TkSTRING, TkDSTRING then - tk.text - else - raise RDoc::Error, "Name or symbol expected (got #{tk})" - end - end - - ## - # Look for directives in a normal comment block: - # - # # :stopdoc: - # # Don't display comment from this point forward - # - # This routine modifies it's parameter - - def look_for_directives_in(context, comment) - preprocess = RDoc::Markup::PreProcess.new @file_name, @options.rdoc_include - - preprocess.handle comment, context do |directive, param| - case directive - when 'enddoc' then - throw :enddoc - when 'main' then - @options.main_page = param - '' - when 'method', 'singleton-method', - 'attr', 'attr_accessor', 'attr_reader', 'attr_writer' then - false # handled elsewhere - when 'section' then - context.set_current_section param, comment - comment.replace '' - break - when 'startdoc' then - context.start_doc - context.force_documentation = true - '' - when 'stopdoc' then - context.stop_doc - '' - when 'title' then - @options.title = param - '' - end - end - - remove_private_comments comment - end - - ## - # Adds useful info about the parser to +message+ - - def make_message message - prefix = "#{@file_name}:" - - prefix << "#{@scanner.line_no}:#{@scanner.char_no}:" if @scanner - - "#{prefix} #{message}" - end - - ## - # Creates an RDoc::Attr for the name following +tk+, setting the comment to - # +comment+. - - def parse_attr(context, single, tk, comment) - args = parse_symbol_arg 1 - if args.size > 0 - name = args[0] - rw = "R" - skip_tkspace false - tk = get_tk - if TkCOMMA === tk then - rw = "RW" if get_bool - else - unget_tk tk - end - att = RDoc::Attr.new get_tkread, name, rw, comment - read_documentation_modifiers att, RDoc::ATTR_MODIFIERS - if att.document_self - context.add_attribute(att) - end - else - warn("'attr' ignored - looks like a variable") - end - end - - ## - # Creates an RDoc::Attr for each attribute listed after +tk+, setting the - # comment for each to +comment+. - - def parse_attr_accessor(context, single, tk, comment) - args = parse_symbol_arg - read = get_tkread - rw = "?" - - # TODO If nodoc is given, don't document any of them - - tmp = RDoc::CodeObject.new - read_documentation_modifiers tmp, RDoc::ATTR_MODIFIERS - return unless tmp.document_self - - case tk.name - when "attr_reader" then rw = "R" - when "attr_writer" then rw = "W" - when "attr_accessor" then rw = "RW" - else - rw = '?' - end - - for name in args - att = RDoc::Attr.new get_tkread, name, rw, comment - context.add_attribute att - end - end - - def parse_alias(context, single, tk, comment) - skip_tkspace - if TkLPAREN === peek_tk then - get_tk - skip_tkspace - end - new_name = get_symbol_or_name - - @scanner.instance_eval { @lex_state = EXPR_FNAME } - - skip_tkspace - if TkCOMMA === peek_tk then - get_tk - skip_tkspace - end - - begin - old_name = get_symbol_or_name - rescue RDoc::Error - return - end - - al = RDoc::Alias.new get_tkread, old_name, new_name, comment - read_documentation_modifiers al, RDoc::ATTR_MODIFIERS - context.add_alias al if al.document_self - end - - def parse_call_parameters(tk) - end_token = case tk - when TkLPAREN, TkfLPAREN - TkRPAREN - when TkRPAREN - return "" - else - TkNL - end - nest = 0 - - loop do - case tk - when TkSEMICOLON - break - when TkLPAREN, TkfLPAREN - nest += 1 - when end_token - if end_token == TkRPAREN - nest -= 1 - break if @scanner.lex_state == EXPR_END and nest <= 0 - else - break unless @scanner.continue - end - when TkCOMMENT - unget_tk(tk) - break - when nil then - break - end - tk = get_tk - end - res = get_tkread.tr("\n", " ").strip - res = "" if res == ";" - res - end - - def parse_class(container, single, tk, comment) - container, name_t = get_class_or_module container - - case name_t - when TkCONSTANT - name = name_t.name - superclass = "Object" - - if TkLT === peek_tk then - get_tk - skip_tkspace - superclass = get_class_specification - superclass = "" if superclass.empty? - end - - cls_type = single == SINGLE ? RDoc::SingleClass : RDoc::NormalClass - cls = container.add_class cls_type, name, superclass - - read_documentation_modifiers cls, RDoc::CLASS_MODIFIERS - cls.record_location @top_level - cls.comment = comment - - @stats.add_class cls - - parse_statements cls - when TkLSHFT - case name = get_class_specification - when "self", container.name - parse_statements container, SINGLE - else - other = RDoc::TopLevel.find_class_named name - - unless other then - other = container.add_module RDoc::NormalModule, name - other.record_location @top_level - other.comment = comment - end - - @stats.add_class other - - read_documentation_modifiers other, RDoc::CLASS_MODIFIERS - parse_statements(other, SINGLE) - end - - else - warn("Expected class name or '<<'. Got #{name_t.class}: #{name_t.text.inspect}") - end - end - - def parse_constant(container, tk, comment) - name = tk.name - skip_tkspace false - eq_tk = get_tk - - unless TkASSIGN === eq_tk then - unget_tk eq_tk - return - end - - nest = 0 - get_tkread - - tk = get_tk - - if TkGT === tk then - unget_tk tk - unget_tk eq_tk - return - end - - rhs_name = '' - - loop do - case tk - when TkSEMICOLON then - break - when TkLPAREN, TkfLPAREN, TkLBRACE, TkLBRACK, TkDO, TkIF, TkUNLESS, - TkCASE then - nest += 1 - when TkRPAREN, TkRBRACE, TkRBRACK, TkEND then - nest -= 1 - when TkCOMMENT then - if nest <= 0 && @scanner.lex_state == EXPR_END - unget_tk tk - break - end - when TkCONSTANT then - rhs_name << tk.name - - if nest <= 0 and TkNL === peek_tk then - mod = if rhs_name =~ /^::/ then - RDoc::TopLevel.find_class_or_module rhs_name - else - container.find_module_named rhs_name - end - - container.add_module_alias mod, name if mod - get_tk # TkNL - break - end - when TkNL then - if nest <= 0 && - (@scanner.lex_state == EXPR_END || !@scanner.continue) then - unget_tk tk - break - end - when TkCOLON2, TkCOLON3 then - rhs_name << '::' - when nil then - break - end - tk = get_tk - end - - res = get_tkread.tr("\n", " ").strip - res = "" if res == ";" - - con = RDoc::Constant.new name, res, comment - read_documentation_modifiers con, RDoc::CONSTANT_MODIFIERS - - @stats.add_constant con - container.add_constant con if con.document_self - end - - ## - # Generates an RDoc::Method or RDoc::Attr from +comment+ by looking for - # :method: or :attr: directives in +comment+. - - def parse_comment(container, tk, comment) - line_no = tk.line_no - column = tk.char_no - - singleton = !!comment.sub!(/(^# +:?)(singleton-)(method:)/, '\1\3') - - # REFACTOR - if comment.sub!(/^# +:?method: *(\S*).*?\n/i, '') then - name = $1 unless $1.empty? - - meth = RDoc::GhostMethod.new get_tkread, name - meth.singleton = singleton - - meth.start_collecting_tokens - indent = TkSPACE.new nil, 1, 1 - indent.set_text " " * column - - position_comment = TkCOMMENT.new nil, line_no, 1 - position_comment.set_text "# File #{@top_level.absolute_name}, line #{line_no}" - meth.add_tokens [position_comment, NEWLINE_TOKEN, indent] - - meth.params = '' - - extract_call_seq comment, meth - - return unless meth.name - - container.add_method meth if meth.document_self - - meth.comment = comment - - @stats.add_method meth - elsif comment.sub!(/# +:?(attr(_reader|_writer|_accessor)?:) *(\S*).*?\n/i, '') then - rw = case $1 - when 'attr_reader' then 'R' - when 'attr_writer' then 'W' - else 'RW' - end - - name = $3 unless $3.empty? - - att = RDoc::Attr.new get_tkread, name, rw, comment - container.add_attribute att - - @stats.add_method att - end - end - - def parse_include(context, comment) - loop do - skip_tkspace_comment - - name = get_constant_with_optional_parens - context.add_include RDoc::Include.new(name, comment) unless name.empty? - - return unless TkCOMMA === peek_tk - get_tk - end - end - - ## - # Parses a meta-programmed attribute and creates an RDoc::Attr. - # - # To create foo and bar attributes on class C with comment "My attributes": - # - # class C - # - # ## - # # :attr: - # # - # # My attributes - # - # my_attr :foo, :bar - # - # end - # - # To create a foo attribute on class C with comment "My attribute": - # - # class C - # - # ## - # # :attr: foo - # # - # # My attribute - # - # my_attr :foo, :bar - # - # end - - def parse_meta_attr(context, single, tk, comment) - args = parse_symbol_arg - read = get_tkread - rw = "?" - - # If nodoc is given, don't document any of them - - tmp = RDoc::CodeObject.new - read_documentation_modifiers tmp, RDoc::ATTR_MODIFIERS - return unless tmp.document_self - - if comment.sub!(/^# +:?(attr(_reader|_writer|_accessor)?): *(\S*).*?\n/i, '') then - rw = case $1 - when 'attr_reader' then 'R' - when 'attr_writer' then 'W' - else 'RW' - end - name = $3 unless $3.empty? - end - - if name then - att = RDoc::Attr.new get_tkread, name, rw, comment - context.add_attribute att - else - args.each do |attr_name| - att = RDoc::Attr.new get_tkread, attr_name, rw, comment - context.add_attribute att - end - end - end - - ## - # Parses a meta-programmed method - - def parse_meta_method(container, single, tk, comment) - line_no = tk.line_no - column = tk.char_no - - start_collecting_tokens - add_token tk - add_token_listener self - - skip_tkspace false - - singleton = !!comment.sub!(/(^# +:?)(singleton-)(method:)/, '\1\3') - - if comment.sub!(/^# +:?method: *(\S*).*?\n/i, '') then - name = $1 unless $1.empty? - end - - if name.nil? then - name_t = get_tk - case name_t - when TkSYMBOL then - name = name_t.text[1..-1] - when TkSTRING then - name = name_t.value[1..-2] - when TkASSIGN then # ignore - remove_token_listener self - return - else - warn "unknown name token #{name_t.inspect} for meta-method '#{tk.name}'" - name = 'unknown' - end - end - - meth = RDoc::MetaMethod.new get_tkread, name - meth.singleton = singleton - - remove_token_listener self - - meth.start_collecting_tokens - indent = TkSPACE.new nil, 1, 1 - indent.set_text " " * column - - position_comment = TkCOMMENT.new nil, line_no, 1 - position_comment.value = "# File #{@top_level.absolute_name}, line #{line_no}" - meth.add_tokens [position_comment, NEWLINE_TOKEN, indent] - meth.add_tokens @token_stream - - token_listener meth do - meth.params = '' - - extract_call_seq comment, meth - - container.add_method meth if meth.document_self - - last_tk = tk - - while tk = get_tk do - case tk - when TkSEMICOLON then - break - when TkNL then - break unless last_tk and TkCOMMA === last_tk - when TkSPACE then - # expression continues - else - last_tk = tk - end - end - end - - meth.comment = comment - - @stats.add_method meth - end - - ## - # Parses a normal method defined by +def+ - - def parse_method(container, single, tk, comment) - added_container = nil - meth = nil - name = nil - line_no = tk.line_no - column = tk.char_no - - start_collecting_tokens - add_token tk - - token_listener self do - @scanner.instance_eval do @lex_state = EXPR_FNAME end - - skip_tkspace false - name_t = get_tk - back_tk = skip_tkspace - meth = nil - added_container = false - - dot = get_tk - if TkDOT === dot or TkCOLON2 === dot then - @scanner.instance_eval do @lex_state = EXPR_FNAME end - skip_tkspace - name_t2 = get_tk - - case name_t - when TkSELF, TkMOD then - name = name_t2.name - when TkCONSTANT then - name = name_t2.name - prev_container = container - container = container.find_module_named(name_t.name) - unless container then - added_container = true - obj = name_t.name.split("::").inject(Object) do |state, item| - state.const_get(item) - end rescue nil - - type = obj.class == Class ? RDoc::NormalClass : RDoc::NormalModule - - unless [Class, Module].include?(obj.class) then - warn("Couldn't find #{name_t.name}. Assuming it's a module") - end - - if type == RDoc::NormalClass then - sclass = obj.superclass ? obj.superclass.name : nil - container = prev_container.add_class type, name_t.name, sclass - else - container = prev_container.add_module type, name_t.name - end - - container.record_location @top_level - end - when TkIDENTIFIER, TkIVAR then - dummy = RDoc::Context.new - dummy.parent = container - skip_method dummy - return - else - warn "unexpected method name token #{name_t.inspect}" - # break - skip_method container - return - end - - meth = RDoc::AnyMethod.new(get_tkread, name) - meth.singleton = true - else - unget_tk dot - back_tk.reverse_each do |token| - unget_tk token - end - - name = case name_t - when TkSTAR, TkAMPER then - name_t.text - else - unless name_t.respond_to? :name then - warn "expected method name token, . or ::, got #{name_t.inspect}" - skip_method container - return - end - name_t.name - end - - meth = RDoc::AnyMethod.new get_tkread, name - meth.singleton = (single == SINGLE) - end - end - - meth.start_collecting_tokens - indent = TkSPACE.new nil, 1, 1 - indent.set_text " " * column - - token = TkCOMMENT.new nil, line_no, 1 - token.set_text "# File #{@top_level.absolute_name}, line #{line_no}" - meth.add_tokens [token, NEWLINE_TOKEN, indent] - meth.add_tokens @token_stream - - token_listener meth do - @scanner.instance_eval do @continue = false end - parse_method_parameters meth - - if meth.document_self then - container.add_method meth - elsif added_container then - container.document_self = false - end - - # Having now read the method parameters and documentation modifiers, we - # now know whether we have to rename #initialize to ::new - - if name == "initialize" && !meth.singleton then - if meth.dont_rename_initialize then - meth.visibility = :protected - else - meth.singleton = true - meth.name = "new" - meth.visibility = :public - end - end - - parse_statements container, single, meth - end - - extract_call_seq comment, meth - - meth.comment = comment - - @stats.add_method meth - end - - def parse_method_or_yield_parameters(method = nil, - modifiers = RDoc::METHOD_MODIFIERS) - skip_tkspace false - tk = get_tk - - # Little hack going on here. In the statement - # f = 2*(1+yield) - # We see the RPAREN as the next token, so we need - # to exit early. This still won't catch all cases - # (such as "a = yield + 1" - end_token = case tk - when TkLPAREN, TkfLPAREN - TkRPAREN - when TkRPAREN - return "" - else - TkNL - end - nest = 0 - - loop do - case tk - when TkSEMICOLON then - break - when TkLBRACE then - nest += 1 - when TkRBRACE then - # we might have a.each {|i| yield i } - unget_tk(tk) if nest.zero? - nest -= 1 - break if nest <= 0 - when TkLPAREN, TkfLPAREN then - nest += 1 - when end_token then - if end_token == TkRPAREN - nest -= 1 - break if @scanner.lex_state == EXPR_END and nest <= 0 - else - break unless @scanner.continue - end - when method && method.block_params.nil? && TkCOMMENT then - unget_tk tk - read_documentation_modifiers method, modifiers - @read.pop - when TkCOMMENT then - @read.pop - when nil then - break - end - tk = get_tk - end - - res = get_tkread.gsub(/\s+/, ' ').strip - res = '' if res == ';' - res - end - - ## - # Capture the method's parameters. Along the way, look for a comment - # containing: - # - # # yields: .... - # - # and add this as the block_params for the method - - def parse_method_parameters(method) - res = parse_method_or_yield_parameters method - - res = "(#{res})" unless res =~ /\A\(/ - method.params = res unless method.params - - if method.block_params.nil? then - skip_tkspace false - read_documentation_modifiers method, RDoc::METHOD_MODIFIERS - end - end - - def parse_module(container, single, tk, comment) - container, name_t = get_class_or_module container - - name = name_t.name - - mod = container.add_module RDoc::NormalModule, name - mod.record_location @top_level - - read_documentation_modifiers mod, RDoc::CLASS_MODIFIERS - parse_statements(mod) - mod.comment = comment - - @stats.add_module mod - end - - def parse_require(context, comment) - skip_tkspace_comment - tk = get_tk - - if TkLPAREN === tk then - skip_tkspace_comment - tk = get_tk - end - - name = tk.text if TkSTRING === tk - - if name then - context.add_require RDoc::Require.new(name, comment) - else - unget_tk tk - end - end - - ## - # The core of the ruby parser. - - def parse_statements(container, single = NORMAL, current_method = nil, - comment = '') - nest = 1 - save_visibility = container.visibility - - non_comment_seen = true - - while tk = get_tk do - keep_comment = false - - non_comment_seen = true unless TkCOMMENT === tk - - case tk - when TkNL then - skip_tkspace - tk = get_tk - - if TkCOMMENT === tk then - if non_comment_seen then - # Look for RDoc in a comment about to be thrown away - parse_comment container, tk, comment unless comment.empty? - - comment = '' - non_comment_seen = false - end - - while TkCOMMENT === tk do - comment << tk.text << "\n" - - tk = get_tk # this is the newline - skip_tkspace false # leading spaces - tk = get_tk - end - - unless comment.empty? then - look_for_directives_in container, comment - - if container.done_documenting then - container.ongoing_visibility = save_visibility - end - end - - keep_comment = true - else - non_comment_seen = true - end - - unget_tk tk - keep_comment = true - - when TkCLASS then - if container.document_children then - parse_class container, single, tk, comment - else - nest += 1 - end - - when TkMODULE then - if container.document_children then - parse_module container, single, tk, comment - else - nest += 1 - end - - when TkDEF then - if container.document_self then - parse_method container, single, tk, comment - else - nest += 1 - end - - when TkCONSTANT then - if container.document_self then - parse_constant container, tk, comment - end - - when TkALIAS then - if container.document_self and not current_method then - parse_alias container, single, tk, comment - end - - when TkYIELD then - if current_method.nil? then - warn "Warning: yield outside of method" if container.document_self - else - parse_yield container, single, tk, current_method - end - - # Until and While can have a 'do', which shouldn't increase the nesting. - # We can't solve the general case, but we can handle most occurrences by - # ignoring a do at the end of a line. - - when TkUNTIL, TkWHILE then - nest += 1 - skip_optional_do_after_expression - - # 'for' is trickier - when TkFOR then - nest += 1 - skip_for_variable - skip_optional_do_after_expression - - when TkCASE, TkDO, TkIF, TkUNLESS, TkBEGIN then - nest += 1 - - when TkIDENTIFIER then - if nest == 1 and current_method.nil? then - case tk.name - when 'private', 'protected', 'public', 'private_class_method', - 'public_class_method', 'module_function' then - parse_visibility container, single, tk - keep_comment = true - when 'attr' then - parse_attr container, single, tk, comment - when /^attr_(reader|writer|accessor)$/ then - parse_attr_accessor container, single, tk, comment - when 'alias_method' then - parse_alias container, single, tk, comment if - container.document_self - when 'require', 'include' then - # ignore - else - if container.document_self and comment =~ /\A#\#$/ then - case comment - when /^# +:?attr(_reader|_writer|_accessor)?:/ then - parse_meta_attr container, single, tk, comment - else - parse_meta_method container, single, tk, comment - end - end - end - end - - case tk.name - when "require" then - parse_require container, comment - when "include" then - parse_include container, comment - end - - when TkEND then - nest -= 1 - if nest == 0 then - read_documentation_modifiers container, RDoc::CLASS_MODIFIERS - container.ongoing_visibility = save_visibility - - parse_comment container, tk, comment unless comment.empty? - - return - end - end - - comment = '' unless keep_comment - - begin - get_tkread - skip_tkspace false - end while peek_tk == TkNL - end - end - - def parse_symbol_arg(no = nil) - args = [] - skip_tkspace_comment - case tk = get_tk - when TkLPAREN - loop do - skip_tkspace_comment - if tk1 = parse_symbol_in_arg - args.push tk1 - break if no and args.size >= no - end - - skip_tkspace_comment - case tk2 = get_tk - when TkRPAREN - break - when TkCOMMA - else - warn("unexpected token: '#{tk2.inspect}'") if $DEBUG_RDOC - break - end - end - else - unget_tk tk - if tk = parse_symbol_in_arg - args.push tk - return args if no and args.size >= no - end - - loop do - skip_tkspace false - - tk1 = get_tk - unless TkCOMMA === tk1 then - unget_tk tk1 - break - end - - skip_tkspace_comment - if tk = parse_symbol_in_arg - args.push tk - break if no and args.size >= no - end - end - end - args - end - - def parse_symbol_in_arg - case tk = get_tk - when TkSYMBOL - tk.text.sub(/^:/, '') - when TkSTRING - eval @read[-1] - else - warn("Expected symbol or string, got #{tk.inspect}") if $DEBUG_RDOC - nil - end - end - - def parse_top_level_statements(container) - comment = collect_first_comment - look_for_directives_in(container, comment) - container.comment = comment unless comment.empty? - parse_statements container, NORMAL, nil, comment - end - - def parse_visibility(container, single, tk) - singleton = (single == SINGLE) - - vis_type = tk.name - - vis = case vis_type - when 'private' then :private - when 'protected' then :protected - when 'public' then :public - when 'private_class_method' then - singleton = true - :private - when 'public_class_method' then - singleton = true - :public - when 'module_function' then - singleton = true - :public - else - raise RDoc::Error, "Invalid visibility: #{tk.name}" - end - - skip_tkspace_comment false - - case peek_tk - # Ryan Davis suggested the extension to ignore modifiers, because he - # often writes - # - # protected unless $TESTING - # - when TkNL, TkUNLESS_MOD, TkIF_MOD, TkSEMICOLON then - container.ongoing_visibility = vis - else - if vis_type == 'module_function' then - args = parse_symbol_arg - container.set_visibility_for args, :private, false - - module_functions = [] - - container.methods_matching args do |m| - s_m = m.dup - s_m.singleton = true if RDoc::AnyMethod === s_m - s_m.visibility = :public - module_functions << s_m - end - - module_functions.each do |s_m| - case s_m - when RDoc::AnyMethod then - container.add_method s_m - when RDoc::Attr then - container.add_attribute s_m - end - end - else - args = parse_symbol_arg - container.set_visibility_for args, vis, singleton - end - end - end - - def parse_yield(context, single, tk, method) - return if method.block_params - - get_tkread - @scanner.instance_eval { @continue = false } - method.block_params = parse_method_or_yield_parameters - end - - ## - # Directives are modifier comments that can appear after class, module, or - # method names. For example: - # - # def fred # :yields: a, b - # - # or: - # - # class MyClass # :nodoc: - # - # We return the directive name and any parameters as a two element array - - def read_directive(allowed) - tk = get_tk - result = nil - - if TkCOMMENT === tk then - if tk.text =~ /\s*:?(\w+):\s*(.*)/ then - directive = $1.downcase - if allowed.include? directive then - result = [directive, $2] - end - end - else - unget_tk tk - end - - result - end - - def read_documentation_modifiers(context, allow) - dir = read_directive(allow) - - case dir[0] - when "notnew", "not_new", "not-new" then - context.dont_rename_initialize = true - - when "nodoc" then - context.document_self = false - if dir[1].downcase == "all" - context.document_children = false - end - - when "doc" then - context.document_self = true - context.force_documentation = true - - when "yield", "yields" then - unless context.params.nil? - context.params.sub!(/(,|)\s*&\w+/,'') # remove parameter &proc - end - - context.block_params = dir[1] - - when "arg", "args" then - context.params = dir[1] - end if dir - end - - def remove_private_comments(comment) - comment.gsub!(/^#--\n.*?^#\+\+/m, '') - comment.sub!(/^#--\n.*/m, '') - end - - def scan - reset - - catch :eof do - catch :enddoc do - begin - parse_top_level_statements @top_level - rescue StandardError => e - bytes = '' - - 20.times do @scanner.ungetc end - count = 0 - 60.times do |i| - count = i - byte = @scanner.getc - break unless byte - bytes << byte - end - count -= 20 - count.times do @scanner.ungetc end - - $stderr.puts <<-EOF - -#{self.class} failure around line #{@scanner.line_no} of -#{@file_name} - - EOF - - unless bytes.empty? then - $stderr.puts - $stderr.puts bytes.inspect - end - - raise e - end - end - end - - @top_level - end - - ## - # while, until, and for have an optional do - - def skip_optional_do_after_expression - skip_tkspace false - tk = get_tk - case tk - when TkLPAREN, TkfLPAREN then - end_token = TkRPAREN - else - end_token = TkNL - end - - b_nest = 0 - nest = 0 - @scanner.instance_eval { @continue = false } - - loop do - case tk - when TkSEMICOLON then - break if b_nest.zero? - when TkLPAREN, TkfLPAREN then - nest += 1 - when TkBEGIN then - b_nest += 1 - when TkEND then - b_nest -= 1 - when TkDO - break if nest.zero? - when end_token then - if end_token == TkRPAREN - nest -= 1 - break if @scanner.lex_state == EXPR_END and nest.zero? - else - break unless @scanner.continue - end - when nil then - break - end - tk = get_tk - end - - skip_tkspace false - - get_tk if TkDO === peek_tk - end - - ## - # skip the var [in] part of a 'for' statement - - def skip_for_variable - skip_tkspace false - tk = get_tk - skip_tkspace false - tk = get_tk - unget_tk(tk) unless TkIN === tk - end - - def skip_method container - meth = RDoc::AnyMethod.new "", "anon" - parse_method_parameters meth - parse_statements container, false, meth - end - - ## - # Skip spaces until a comment is found - - def skip_tkspace_comment(skip_nl = true) - loop do - skip_tkspace skip_nl - return unless TkCOMMENT === peek_tk - get_tk - end - end - - def warn(msg) - return if @options.quiet - msg = make_message msg - $stderr.puts msg - end - -end - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/parser/ruby_tools.rb b/Src/StdLib/ruby/1.9.1/rdoc/parser/ruby_tools.rb deleted file mode 100644 index 1866435c9..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/parser/ruby_tools.rb +++ /dev/null @@ -1,157 +0,0 @@ -## -# Collection of methods for writing parsers against RDoc::RubyLex and -# RDoc::RubyToken - -module RDoc::Parser::RubyTools - - include RDoc::RubyToken - - ## - # Adds a token listener +obj+, but you should probably use token_listener - - def add_token_listener(obj) - @token_listeners ||= [] - @token_listeners << obj - end - - ## - # Fetches the next token from the scanner - - def get_tk - tk = nil - - if @tokens.empty? then - tk = @scanner.token - @read.push @scanner.get_readed - puts "get_tk1 => #{tk.inspect}" if $TOKEN_DEBUG - else - @read.push @unget_read.shift - tk = @tokens.shift - puts "get_tk2 => #{tk.inspect}" if $TOKEN_DEBUG - end - - tk = nil if TkEND_OF_SCRIPT === tk - - if TkSYMBEG === tk then - set_token_position tk.line_no, tk.char_no - - case tk1 = get_tk - when TkId, TkOp, TkSTRING, TkDSTRING, TkSTAR, TkAMPER then - if tk1.respond_to?(:name) then - tk = Token(TkSYMBOL).set_text(":" + tk1.name) - else - tk = Token(TkSYMBOL).set_text(":" + tk1.text) - end - - # remove the identifier we just read (we're about to replace it with a - # symbol) - @token_listeners.each do |obj| - obj.pop_token - end if @token_listeners - else - warn("':' not followed by identifier or operator") - tk = tk1 - end - end - - # inform any listeners of our shiny new token - @token_listeners.each do |obj| - obj.add_token(tk) - end if @token_listeners - - tk - end - - def get_tk_until(*tokens) - read = [] - - loop do - tk = get_tk - case tk when *tokens then unget_tk tk; break end - read << tk - end - - read - end - - ## - # Retrieves a String representation of the read tokens - - def get_tkread - read = @read.join("") - @read = [] - read - end - - ## - # Peek equivalent for get_tkread - - def peek_read - @read.join('') - end - - ## - # Peek at the next token, but don't remove it from the stream - - def peek_tk - unget_tk(tk = get_tk) - tk - end - - ## - # Removes the token listener +obj+ - - def remove_token_listener(obj) - @token_listeners.delete(obj) - end - - ## - # Resets the tools - - def reset - @read = [] - @tokens = [] - @unget_read = [] - @nest = 0 - end - - ## - # Skips whitespace tokens including newlines if +skip_nl+ is true - - def skip_tkspace(skip_nl = true) # HACK dup - tokens = [] - - while TkSPACE === (tk = get_tk) or (skip_nl and TkNL === tk) do - tokens.push tk - end - - unget_tk tk - tokens - end - - ## - # Has +obj+ listen to tokens - - def token_listener(obj) - add_token_listener obj - yield - ensure - remove_token_listener obj - end - - ## - # Returns +tk+ to the scanner - - def unget_tk(tk) - @tokens.unshift tk - @unget_read.unshift @read.pop - - # Remove this token from any listeners - @token_listeners.each do |obj| - obj.pop_token - end if @token_listeners - end - -end - - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/parser/simple.rb b/Src/StdLib/ruby/1.9.1/rdoc/parser/simple.rb deleted file mode 100644 index 1c15f9e77..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/parser/simple.rb +++ /dev/null @@ -1,44 +0,0 @@ -## -# Parse a non-source file. We basically take the whole thing as one big -# comment. If the first character in the file is '#', we strip leading pound -# signs. - -class RDoc::Parser::Simple < RDoc::Parser - - parse_files_matching(//) - - attr_reader :content # :nodoc: - - ## - # Prepare to parse a plain file - - def initialize(top_level, file_name, content, options, stats) - super - - preprocess = RDoc::Markup::PreProcess.new @file_name, @options.rdoc_include - - preprocess.handle @content, @top_level - end - - ## - # Extract the file contents and attach them to the TopLevel as a comment - - def scan - comment = remove_coding_comment @content - comment = remove_private_comments comment - - @top_level.comment = comment - @top_level.parser = self.class - @top_level - end - - def remove_private_comments(comment) - comment.gsub(/^--\n.*?^\+\+/m, '').sub(/^--\n.*/m, '') - end - - def remove_coding_comment text - text.sub(/\A# .*coding[=:].*$/, '') - end - -end - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/rdoc.rb b/Src/StdLib/ruby/1.9.1/rdoc/rdoc.rb deleted file mode 100644 index d5d1a0857..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/rdoc.rb +++ /dev/null @@ -1,457 +0,0 @@ -require 'rdoc' - -require 'rdoc/parser' - -# Simple must come first -require 'rdoc/parser/simple' -require 'rdoc/parser/ruby' -require 'rdoc/parser/c' -require 'rdoc/parser/perl' - -require 'rdoc/stats' -require 'rdoc/options' - -require 'find' -require 'fileutils' -require 'time' - -## -# Encapsulate the production of rdoc documentation. Basically you can use this -# as you would invoke rdoc from the command line: -# -# rdoc = RDoc::RDoc.new -# rdoc.document(args) -# -# Where +args+ is an array of strings, each corresponding to an argument you'd -# give rdoc on the command line. See rdoc/rdoc.rb for details. - -class RDoc::RDoc - - ## - # File pattern to exclude - - attr_accessor :exclude - - ## - # Generator instance used for creating output - - attr_accessor :generator - - ## - # Hash of files and their last modified times. - - attr_reader :last_modified - - ## - # RDoc options - - attr_accessor :options - - ## - # Accessor for statistics. Available after each call to parse_files - - attr_reader :stats - - ## - # This is the list of supported output generators - - GENERATORS = {} - - ## - # Add +klass+ that can generate output after parsing - - def self.add_generator(klass) - name = klass.name.sub(/^RDoc::Generator::/, '').downcase - GENERATORS[name] = klass - end - - ## - # Active RDoc::RDoc instance - - def self.current - @current - end - - ## - # Sets the active RDoc::RDoc instance - - def self.current=(rdoc) - @current = rdoc - end - - def initialize - @current = nil - @exclude = nil - @generator = nil - @last_modified = {} - @old_siginfo = nil - @options = nil - @stats = nil - end - - ## - # Report an error message and exit - - def error(msg) - raise RDoc::Error, msg - end - - ## - # Gathers a set of parseable files from the files and directories listed in - # +files+. - - def gather_files files - files = ["."] if files.empty? - - file_list = normalized_file_list files, true, @exclude - - file_list = file_list.uniq - - file_list = remove_unparseable file_list - end - - ## - # Turns RDoc from stdin into HTML - - def handle_pipe - @html = RDoc::Markup::ToHtml.new - - out = @html.convert $stdin.read - - $stdout.write out - end - - ## - # Installs a siginfo handler that prints the current filename. - - def install_siginfo_handler - return unless Signal.list.include? 'INFO' - - @old_siginfo = trap 'INFO' do - puts @current if @current - end - end - - ## - # Create an output dir if it doesn't exist. If it does exist, but doesn't - # contain the flag file created.rid then we refuse to use it, as - # we may clobber some manually generated documentation - - def setup_output_dir(dir, force) - flag_file = output_flag_file dir - - last = {} - - if File.exist? dir then - error "#{dir} exists and is not a directory" unless File.directory? dir - - begin - open flag_file do |io| - unless force then - Time.parse io.gets - - io.each do |line| - file, time = line.split "\t", 2 - time = Time.parse(time) rescue next - last[file] = time - end - end - end - rescue SystemCallError, TypeError - error <<-ERROR - -Directory #{dir} already exists, but it looks like it isn't an RDoc directory. - -Because RDoc doesn't want to risk destroying any of your existing files, -you'll need to specify a different output directory name (using the --op -option) - - ERROR - end - else - FileUtils.mkdir_p dir - end - - last - end - - ## - # Update the flag file in an output directory. - - def update_output_dir(op_dir, time, last = {}) - open output_flag_file(op_dir), "w" do |f| - f.puts time.rfc2822 - last.each do |n, t| - f.puts "#{n}\t#{t.rfc2822}" - end - end - end - - ## - # Return the path name of the flag file in an output directory. - - def output_flag_file(op_dir) - File.join op_dir, "created.rid" - end - - ## - # The .document file contains a list of file and directory name patterns, - # representing candidates for documentation. It may also contain comments - # (starting with '#') - - def parse_dot_doc_file in_dir, filename - # read and strip comments - patterns = File.read(filename).gsub(/#.*/, '') - - result = [] - - patterns.split.each do |patt| - candidates = Dir.glob(File.join(in_dir, patt)) - result.concat normalized_file_list(candidates) - end - - result - end - - ## - # Given a list of files and directories, create a list of all the Ruby - # files they contain. - # - # If +force_doc+ is true we always add the given files, if false, only - # add files that we guarantee we can parse. It is true when looking at - # files given on the command line, false when recursing through - # subdirectories. - # - # The effect of this is that if you want a file with a non-standard - # extension parsed, you must name it explicitly. - - def normalized_file_list(relative_files, force_doc = false, - exclude_pattern = nil) - file_list = [] - - relative_files.each do |rel_file_name| - next if exclude_pattern && exclude_pattern =~ rel_file_name - stat = File.stat rel_file_name rescue next - - case type = stat.ftype - when "file" then - next if last_modified = @last_modified[rel_file_name] and - stat.mtime.to_i <= last_modified.to_i - - if force_doc or RDoc::Parser.can_parse(rel_file_name) then - file_list << rel_file_name.sub(/^\.\//, '') - @last_modified[rel_file_name] = stat.mtime - end - when "directory" then - next if rel_file_name == "CVS" || rel_file_name == ".svn" - - dot_doc = File.join rel_file_name, RDoc::DOT_DOC_FILENAME - - if File.file? dot_doc then - file_list << parse_dot_doc_file(rel_file_name, dot_doc) - else - file_list << list_files_in_directory(rel_file_name) - end - else - raise RDoc::Error, "I can't deal with a #{type} #{rel_file_name}" - end - end - - file_list.flatten - end - - ## - # Return a list of the files to be processed in a directory. We know that - # this directory doesn't have a .document file, so we're looking for real - # files. However we may well contain subdirectories which must be tested - # for .document files. - - def list_files_in_directory dir - files = Dir.glob File.join(dir, "*") - - normalized_file_list files, false, @options.exclude - end - - ## - # Parses +filename+ and returns an RDoc::TopLevel - - def parse_file filename - @stats.add_file filename - content = read_file_contents filename - - return unless content - - top_level = RDoc::TopLevel.new filename - - parser = RDoc::Parser.for top_level, filename, content, @options, @stats - - return unless parser - - parser.scan - rescue => e - $stderr.puts <<-EOF -Before reporting this, could you check that the file you're documenting -compiles cleanly--RDoc is not a full Ruby parser, and gets confused easily if -fed invalid programs. - -The internal error was: - -\t(#{e.class}) #{e.message} - - EOF - - $stderr.puts e.backtrace.join("\n\t") if $RDOC_DEBUG - - raise e - nil - end - - ## - # Parse each file on the command line, recursively entering directories. - - def parse_files files - file_list = gather_files files - - return [] if file_list.empty? - - file_info = [] - - @stats = RDoc::Stats.new file_list.size, @options.verbosity - @stats.begin_adding - - file_info = file_list.map do |filename| - @current = filename - parse_file filename - end.compact - - @stats.done_adding - - file_info - end - - ## - # Removes file extensions known to be unparseable from +files+ - - def remove_unparseable files - files.reject do |file| - file =~ /\.(?:class|eps|erb|scpt\.txt|ttf|yml)$/i - end - end - - ## - # Format up one or more files according to the given arguments. - # - # For simplicity, +argv+ is an array of strings, equivalent to the strings - # that would be passed on the command line. (This isn't a coincidence, as - # we _do_ pass in ARGV when running interactively). For a list of options, - # see rdoc/rdoc.rb. By default, output will be stored in a directory - # called +doc+ below the current directory, so make sure you're somewhere - # writable before invoking. - # - # Throws: RDoc::Error on error - - def document(argv) - RDoc::TopLevel.reset - RDoc::Parser::C.reset - - @options = RDoc::Options.new - @options.parse argv - - if @options.pipe then - handle_pipe - exit - end - - @exclude = @options.exclude - - @last_modified = setup_output_dir @options.op_dir, @options.force_update - - start_time = Time.now - - file_info = parse_files @options.files - - @options.title = "RDoc Documentation" - - if file_info.empty? - $stderr.puts "\nNo newer files." unless @options.quiet - else - gen_klass = @options.generator - - unless @options.quiet then - $stderr.puts "\nGenerating #{gen_klass.name.sub(/^.*::/, '')}..." - end - - @generator = gen_klass.for @options - - pwd = Dir.pwd - - Dir.chdir @options.op_dir do - begin - self.class.current = self - - @generator.generate file_info - update_output_dir ".", start_time, @last_modified - ensure - self.class.current = nil - end - end - end - - unless @options.quiet or not @stats then - puts - @stats.print - end - end - - def read_file_contents(filename) - content = open filename, "rb" do |f| f.read end - - utf8 = content.sub!(/\A\xef\xbb\xbf/, '') - if defined? Encoding then - if /coding[=:]\s*([^\s;]+)/i =~ content[%r"\A(?:#!.*\n)?.*\n"] - enc = ::Encoding.find($1) - end - if enc ||= (Encoding::UTF_8 if utf8) - content.force_encoding(enc) - end - end - - content - rescue Errno::EISDIR, Errno::ENOENT - nil - end - - ## - # Removes a siginfo handler and replaces the previous - - def remove_siginfo_handler - return unless Signal.list.key? 'INFO' - - handler = @old_siginfo || 'DEFAULT' - - trap 'INFO', handler - end - -end - -begin - require 'rubygems' - - if Gem.respond_to? :find_files then - rdoc_extensions = Gem.find_files 'rdoc/discover' - - rdoc_extensions.each do |extension| - begin - load extension - rescue => e - warn "error loading #{extension.inspect}: #{e.message} (#{e.class})" - end - end - end -rescue LoadError -end - -# require built-in generators after discovery in case they've been replaced -require 'rdoc/generator/darkfish' -require 'rdoc/generator/ri' - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/require.rb b/Src/StdLib/ruby/1.9.1/rdoc/require.rb deleted file mode 100644 index 257127393..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/require.rb +++ /dev/null @@ -1,32 +0,0 @@ -require 'rdoc/code_object' - -## -# A file loaded by \#require - -class RDoc::Require < RDoc::CodeObject - - ## - # Name of the required file - - attr_accessor :name - - ## - # Creates a new Require that loads +name+ with +comment+ - - def initialize(name, comment) - super() - @name = name.gsub(/'|"/, "") #' - self.comment = comment - end - - def inspect # :nodoc: - "#<%s:0x%x require '%s' in %s>" % [ - self.class, - object_id, - @name, - parent_file_name, - ] - end - -end - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/ri.rb b/Src/StdLib/ruby/1.9.1/rdoc/ri.rb deleted file mode 100644 index 747616fef..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/ri.rb +++ /dev/null @@ -1,18 +0,0 @@ -require 'rdoc' - -## -# Namespace for the ri command line tool's implementation. -# -# See ri --help for details. - -module RDoc::RI - - ## - # Base RI error class - - class Error < RDoc::Error; end - -end - -require 'rdoc/ri/store' - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/ri/driver.rb b/Src/StdLib/ruby/1.9.1/rdoc/ri/driver.rb deleted file mode 100644 index 889ed3cc4..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/ri/driver.rb +++ /dev/null @@ -1,1054 +0,0 @@ -require 'abbrev' -require 'optparse' - -begin - require 'readline' -rescue LoadError -end - -require 'rdoc/ri' -require 'rdoc/ri/paths' -require 'rdoc/markup' -require 'rdoc/markup/formatter' -require 'rdoc/text' - -## -# For RubyGems backwards compatibility - -require 'rdoc/ri/formatter' - -## -# The RI driver implements the command-line ri tool. -# -# The driver supports: -# * loading RI data from: -# * Ruby's standard library -# * RubyGems -# * ~/.rdoc -# * A user-supplied directory -# * Paging output (uses RI_PAGER environment variable, PAGER environment -# variable or the less, more and pager programs) -# * Interactive mode with tab-completion -# * Abbreviated names (ri Zl shows Zlib documentation) -# * Colorized output -# * Merging output from multiple RI data sources - -class RDoc::RI::Driver - - ## - # Base Driver error class - - class Error < RDoc::RI::Error; end - - ## - # Raised when a name isn't found in the ri data stores - - class NotFoundError < Error - - ## - # Name that wasn't found - - alias name message - - def message # :nodoc: - "Nothing known about #{super}" - end - end - - attr_accessor :stores - - ## - # Controls the user of the pager vs $stdout - - attr_accessor :use_stdout - - ## - # Default options for ri - - def self.default_options - options = {} - options[:use_stdout] = !$stdout.tty? - options[:width] = 72 - options[:interactive] = false - options[:use_cache] = true - options[:profile] = false - - # By default all standard paths are used. - options[:use_system] = true - options[:use_site] = true - options[:use_home] = true - options[:use_gems] = true - options[:extra_doc_dirs] = [] - - return options - end - - ## - # Dump +data_path+ using pp - - def self.dump data_path - require 'pp' - - open data_path, 'rb' do |io| - pp Marshal.load(io.read) - end - end - - ## - # Parses +argv+ and returns a Hash of options - - def self.process_args argv - options = default_options - - opts = OptionParser.new do |opt| - opt.accept File do |file,| - File.readable?(file) and not File.directory?(file) and file - end - - opt.program_name = File.basename $0 - opt.version = RDoc::VERSION - opt.release = nil - opt.summary_indent = ' ' * 4 - - opt.banner = <<-EOT -Usage: #{opt.program_name} [options] [names...] - -Where name can be: - - Class | Class::method | Class#method | Class.method | method - -All class names may be abbreviated to their minimum unambiguous form. If a name -is ambiguous, all valid options will be listed. - -The form '.' method matches either class or instance methods, while #method -matches only instance and ::method matches only class methods. - -For example: - - #{opt.program_name} Fil - #{opt.program_name} File - #{opt.program_name} File.new - #{opt.program_name} zip - -Note that shell quoting may be required for method names containing -punctuation: - - #{opt.program_name} 'Array.[]' - #{opt.program_name} compact\\! - -To see the default directories ri will search, run: - - #{opt.program_name} --list-doc-dirs - -Specifying the --system, --site, --home, --gems or --doc-dir options will -limit ri to searching only the specified directories. - -Options may also be set in the 'RI' environment variable. - EOT - - opt.separator nil - opt.separator "Options:" - - opt.separator nil - - formatters = RDoc::Markup.constants.grep(/^To[A-Z][a-z]+$/).sort - formatters = formatters.sort.map do |formatter| - formatter.to_s.sub('To', '').downcase - end - - opt.on("--format=NAME", "-f", - "Uses the selected formatter. The default", - "formatter is bs for paged output and ansi", - "otherwise. Valid formatters are:", - formatters.join(' '), formatters) do |value| - options[:formatter] = RDoc::Markup.const_get "To#{value.capitalize}" - end - - opt.separator nil - - opt.on("--no-pager", "-T", - "Send output directly to stdout,", - "rather than to a pager.") do - options[:use_stdout] = true - end - - opt.separator nil - - opt.on("--width=WIDTH", "-w", OptionParser::DecimalInteger, - "Set the width of the output.") do |value| - options[:width] = value - end - - opt.separator nil - - opt.on("--interactive", "-i", - "In interactive mode you can repeatedly", - "look up methods with autocomplete.") do - options[:interactive] = true - end - - opt.separator nil - - opt.on("--[no-]profile", - "Run with the ruby profiler") do |value| - options[:profile] = value - end - - opt.separator nil - opt.separator "Data source options:" - opt.separator nil - - opt.on("--list-doc-dirs", - "List the directories from which ri will", - "source documentation on stdout and exit.") do - options[:list_doc_dirs] = true - end - - opt.separator nil - - opt.on("--doc-dir=DIRNAME", "-d", Array, - "List of directories from which to source", - "documentation in addition to the standard", - "directories. May be repeated.") do |value| - value.each do |dir| - unless File.directory? dir then - raise OptionParser::InvalidArgument, "#{dir} is not a directory" - end - - options[:extra_doc_dirs] << File.expand_path(dir) - end - end - - opt.separator nil - - opt.on("--no-standard-docs", - "Do not include documentation from", - "the Ruby standard library, site_lib,", - "installed gems, or ~/.rdoc.", - "Use with --doc-dir") do - options[:use_system] = false - options[:use_site] = false - options[:use_gems] = false - options[:use_home] = false - end - - opt.separator nil - - opt.on("--[no-]system", - "Include documentation from Ruby's standard", - "library. Defaults to true.") do |value| - options[:use_system] = value - end - - opt.separator nil - - opt.on("--[no-]site", - "Include documentation from libraries", - "installed in site_lib.", - "Defaults to true.") do |value| - options[:use_site] = value - end - - opt.separator nil - - opt.on("--[no-]gems", - "Include documentation from RubyGems.", - "Defaults to true.") do |value| - options[:use_gems] = value - end - - opt.separator nil - - opt.on("--[no-]home", - "Include documentation stored in ~/.rdoc.", - "Defaults to true.") do |value| - options[:use_home] = value - end - - opt.separator nil - opt.separator "Debug options:" - opt.separator nil - - opt.on("--dump=CACHE", File, - "Dumps data from an ri cache or data file") do |value| - options[:dump_path] = value - end - end - - argv = ENV['RI'].to_s.split.concat argv - - opts.parse! argv - - options[:names] = argv - - options[:use_stdout] ||= !$stdout.tty? - options[:use_stdout] ||= options[:interactive] - options[:width] ||= 72 - - options - - rescue OptionParser::InvalidArgument, OptionParser::InvalidOption => e - puts opts - puts - puts e - exit 1 - end - - ## - # Runs the ri command line executable using +argv+ - - def self.run argv = ARGV - options = process_args argv - - if options[:dump_path] then - dump options[:dump_path] - return - end - - ri = new options - ri.run - end - - ## - # Creates a new driver using +initial_options+ from ::process_args - - def initialize initial_options = {} - @paging = false - @classes = nil - - options = self.class.default_options.update(initial_options) - - @formatter_klass = options[:formatter] - - require 'profile' if options[:profile] - - @names = options[:names] - - @doc_dirs = [] - @stores = [] - - RDoc::RI::Paths.each(options[:use_system], options[:use_site], - options[:use_home], options[:use_gems], - *options[:extra_doc_dirs]) do |path, type| - @doc_dirs << path - - store = RDoc::RI::Store.new path, type - store.load_cache - @stores << store - end - - @list_doc_dirs = options[:list_doc_dirs] - - @interactive = options[:interactive] - @use_stdout = options[:use_stdout] - end - - ## - # Adds paths for undocumented classes +also_in+ to +out+ - - def add_also_in out, also_in - return if also_in.empty? - - out << RDoc::Markup::Rule.new(1) - out << RDoc::Markup::Paragraph.new("Also found in:") - - paths = RDoc::Markup::Verbatim.new - also_in.each do |store| - paths.parts.push ' ', store.friendly_path, "\n" - end - out << paths - end - - ## - # Adds a class header to +out+ for class +name+ which is described in - # +classes+. - - def add_class out, name, classes - heading = if classes.all? { |klass| klass.module? } then - name - else - superclass = classes.map do |klass| - klass.superclass unless klass.module? - end.compact.shift || 'Object' - - "#{name} < #{superclass}" - end - - out << RDoc::Markup::Heading.new(1, heading) - out << RDoc::Markup::BlankLine.new - end - - ## - # Adds "(from ...)" to +out+ for +store+ - - def add_from out, store - out << RDoc::Markup::Paragraph.new("(from #{store.friendly_path})") - end - - ## - # Adds +includes+ to +out+ - - def add_includes out, includes - return if includes.empty? - - out << RDoc::Markup::Rule.new(1) - out << RDoc::Markup::Heading.new(1, "Includes:") - - includes.each do |modules, store| - if modules.length == 1 then - include = modules.first - name = include.name - path = store.friendly_path - out << RDoc::Markup::Paragraph.new("#{name} (from #{path})") - - if include.comment then - out << RDoc::Markup::BlankLine.new - out << include.comment - end - else - out << RDoc::Markup::Paragraph.new("(from #{store.friendly_path})") - - wout, with = modules.partition { |incl| incl.comment.empty? } - - out << RDoc::Markup::BlankLine.new unless with.empty? - - with.each do |incl| - out << RDoc::Markup::Paragraph.new(incl.name) - out << RDoc::Markup::BlankLine.new - out << incl.comment - end - - unless wout.empty? then - verb = RDoc::Markup::Verbatim.new - - wout.each do |incl| - verb.push ' ', incl.name, "\n" - end - - out << verb - end - end - end - end - - ## - # Adds a list of +methods+ to +out+ with a heading of +name+ - - def add_method_list out, methods, name - return unless methods - - out << RDoc::Markup::Heading.new(1, "#{name}:") - out << RDoc::Markup::BlankLine.new - - out.push(*methods.map do |method| - RDoc::Markup::Verbatim.new ' ', method - end) - - out << RDoc::Markup::BlankLine.new - end - - ## - # Returns ancestor classes of +klass+ - - def ancestors_of klass - ancestors = [] - - unexamined = [klass] - seen = [] - - loop do - break if unexamined.empty? - current = unexamined.shift - seen << current - - stores = classes[current] - - break unless stores and not stores.empty? - - klasses = stores.map do |store| - store.ancestors[current] - end.flatten.uniq - - klasses = klasses - seen - - ancestors.push(*klasses) - unexamined.push(*klasses) - end - - ancestors.reverse - end - - ## - # For RubyGems backwards compatibility - - def class_cache # :nodoc: - end - - ## - # Hash mapping a known class or module to the stores it can be loaded from - - def classes - return @classes if @classes - - @classes = {} - - @stores.each do |store| - store.cache[:modules].each do |mod| - # using default block causes searched-for modules to be added - @classes[mod] ||= [] - @classes[mod] << store - end - end - - @classes - end - - ## - # Completes +name+ based on the caches. For Readline - - def complete name - klasses = classes.keys - completions = [] - - klass, selector, method = parse_name name - - # may need to include Foo when given Foo:: - klass_name = method ? name : klass - - if name !~ /#|\./ then - completions.push(*klasses.grep(/^#{klass_name}/)) - elsif selector then - completions << klass if classes.key? klass - elsif classes.key? klass_name then - completions << klass_name - end - - if completions.include? klass and name =~ /#|\.|::/ then - methods = list_methods_matching name - - if not methods.empty? then - # remove Foo if given Foo:: and a method was found - completions.delete klass - elsif selector then - # replace Foo with Foo:: as given - completions.delete klass - completions << "#{klass}#{selector}" - end - - completions.push(*methods) - end - - completions.sort - end - - ## - # Converts +document+ to text and writes it to the pager - - def display document - page do |io| - text = document.accept formatter(io) - - io.write text - end - end - - ## - # Outputs formatted RI data for class +name+. Groups undocumented classes - - def display_class name - return if name =~ /#|\./ - - klasses = [] - includes = [] - - found = @stores.map do |store| - begin - klass = store.load_class name - klasses << klass - includes << [klass.includes, store] if klass.includes - [store, klass] - rescue Errno::ENOENT - end - end.compact - - return if found.empty? - - also_in = [] - - includes.reject! do |modules,| modules.empty? end - - out = RDoc::Markup::Document.new - - add_class out, name, klasses - - add_includes out, includes - - found.each do |store, klass| - comment = klass.comment - class_methods = store.class_methods[klass.full_name] - instance_methods = store.instance_methods[klass.full_name] - attributes = store.attributes[klass.full_name] - - if comment.empty? and !(instance_methods or class_methods) then - also_in << store - next - end - - add_from out, store - - unless comment.empty? then - out << RDoc::Markup::Rule.new(1) - out << comment - end - - if class_methods or instance_methods or not klass.constants.empty? then - out << RDoc::Markup::Rule.new - end - - unless klass.constants.empty? then - out << RDoc::Markup::Heading.new(1, "Constants:") - out << RDoc::Markup::BlankLine.new - list = RDoc::Markup::List.new :NOTE - - constants = klass.constants.sort_by { |constant| constant.name } - - list.push(*constants.map do |constant| - parts = constant.comment.parts if constant.comment - parts << RDoc::Markup::Paragraph.new('[not documented]') if - parts.empty? - - RDoc::Markup::ListItem.new(constant.name, *parts) - end) - - out << list - end - - add_method_list out, class_methods, 'Class methods' - add_method_list out, instance_methods, 'Instance methods' - add_method_list out, attributes, 'Attributes' - - out << RDoc::Markup::BlankLine.new - end - - add_also_in out, also_in - - display out - end - - ## - # Outputs formatted RI data for method +name+ - - def display_method name - found = load_methods_matching name - - raise NotFoundError, name if found.empty? - - out = RDoc::Markup::Document.new - - out << RDoc::Markup::Heading.new(1, name) - out << RDoc::Markup::BlankLine.new - - found.each do |store, methods| - methods.each do |method| - out << RDoc::Markup::Paragraph.new("(from #{store.friendly_path})") - - unless name =~ /^#{Regexp.escape method.parent_name}/ then - out << RDoc::Markup::Heading.new(3, "Implementation from #{method.parent_name}") - end - out << RDoc::Markup::Rule.new(1) - - if method.arglists then - arglists = method.arglists.chomp.split "\n" - arglists = arglists.map { |line| [' ', line, "\n"] } - out << RDoc::Markup::Verbatim.new(*arglists.flatten) - out << RDoc::Markup::Rule.new(1) - end - - out << RDoc::Markup::BlankLine.new - out << method.comment - out << RDoc::Markup::BlankLine.new - end - end - - display out - end - - ## - # Outputs formatted RI data for the class or method +name+. - # - # Returns true if +name+ was found, false if it was not an alternative could - # be guessed, raises an error if +name+ couldn't be guessed. - - def display_name name - return true if display_class name - - display_method name if name =~ /::|#|\./ - - true - rescue NotFoundError - matches = list_methods_matching name if name =~ /::|#|\./ - matches = classes.keys.grep(/^#{name}/) if matches.empty? - - raise if matches.empty? - - page do |io| - io.puts "#{name} not found, maybe you meant:" - io.puts - io.puts matches.join("\n") - end - - false - end - - ## - # Displays each name in +name+ - - def display_names names - names.each do |name| - name = expand_name name - - display_name name - end - end - ## - # Expands abbreviated klass +klass+ into a fully-qualified class. "Zl::Da" - # will be expanded to Zlib::DataError. - - def expand_class klass - klass.split('::').inject '' do |expanded, klass_part| - expanded << '::' unless expanded.empty? - short = expanded << klass_part - - subset = classes.keys.select do |klass_name| - klass_name =~ /^#{expanded}[^:]*$/ - end - - abbrevs = Abbrev.abbrev subset - - expanded = abbrevs[short] - - raise NotFoundError, short unless expanded - - expanded.dup - end - end - - ## - # Expands the class portion of +name+ into a fully-qualified class. See - # #expand_class. - - def expand_name name - klass, selector, method = parse_name name - - return [selector, method].join if klass.empty? - - "#{expand_class klass}#{selector}#{method}" - end - - ## - # Yields items matching +name+ including the store they were found in, the - # class being searched for, the class they were found in (an ancestor) the - # types of methods to look up (from #method_type), and the method name being - # searched for - - def find_methods name - klass, selector, method = parse_name name - - types = method_type selector - - klasses = nil - ambiguous = klass.empty? - - if ambiguous then - klasses = classes.keys - else - klasses = ancestors_of klass - klasses.unshift klass - end - - methods = [] - - klasses.each do |ancestor| - ancestors = classes[ancestor] - - next unless ancestors - - klass = ancestor if ambiguous - - ancestors.each do |store| - methods << [store, klass, ancestor, types, method] - end - end - - methods = methods.sort_by do |_, k, a, _, m| - [k, a, m].compact - end - - methods.each do |item| - yield(*item) # :yields: store, klass, ancestor, types, method - end - - self - end - - ## - # Creates a new RDoc::Markup::Formatter. If a formatter is given with -f, - # use it. If we're outputting to a pager, use bs, otherwise ansi. - - def formatter(io) - if @formatter_klass then - @formatter_klass.new - elsif paging? or !io.tty? then - RDoc::Markup::ToBs.new - else - RDoc::Markup::ToAnsi.new - end - end - - ## - # Runs ri interactively using Readline if it is available. - - def interactive - puts "\nEnter the method name you want to look up." - - if defined? Readline then - Readline.completion_proc = method :complete - puts "You can use tab to autocomplete." - end - - puts "Enter a blank line to exit.\n\n" - - loop do - name = if defined? Readline then - Readline.readline ">> " - else - print ">> " - $stdin.gets - end - - return if name.nil? or name.empty? - - name = expand_name name.strip - - begin - display_name name - rescue NotFoundError => e - puts e.message - end - end - - rescue Interrupt - exit - end - - ## - # Lists classes known to ri - - def list_known_classes - classes = [] - - stores.each do |store| - classes << store.modules - end - - classes = classes.flatten.uniq.sort - - page do |io| - if paging? or io.tty? then - io.puts "Classes and Modules known to ri:" - io.puts - end - - io.puts classes.join("\n") - end - end - - ## - # Returns an Array of methods matching +name+ - - def list_methods_matching name - found = [] - - find_methods name do |store, klass, ancestor, types, method| - if types == :instance or types == :both then - methods = store.instance_methods[ancestor] - - if methods then - matches = methods.grep(/^#{method}/) - - matches = matches.map do |match| - "#{klass}##{match}" - end - - found.push(*matches) - end - end - - if types == :class or types == :both then - methods = store.class_methods[ancestor] - - next unless methods - matches = methods.grep(/^#{method}/) - - matches = matches.map do |match| - "#{klass}::#{match}" - end - - found.push(*matches) - end - end - - found.uniq - end - - ## - # Loads RI data for method +name+ on +klass+ from +store+. +type+ and - # +cache+ indicate if it is a class or instance method. - - def load_method store, cache, klass, type, name - methods = store.send(cache)[klass] - - return unless methods - - method = methods.find do |method_name| - method_name == name - end - - return unless method - - store.load_method klass, "#{type}#{method}" - end - - ## - # Returns an Array of RI data for methods matching +name+ - - def load_methods_matching name - found = [] - - find_methods name do |store, klass, ancestor, types, method| - methods = [] - - methods << load_method(store, :class_methods, ancestor, '::', method) if - types == :class or types == :both - - methods << load_method(store, :instance_methods, ancestor, '#', method) if - types == :instance or types == :both - - found << [store, methods.compact] - end - - found.reject do |path, methods| methods.empty? end - end - - ## - # Returns the type of method (:both, :instance, :class) for +selector+ - - def method_type selector - case selector - when '.', nil then :both - when '#' then :instance - else :class - end - end - - ## - # Paginates output through a pager program. - - def page - if pager = setup_pager then - begin - yield pager - ensure - pager.close - end - else - yield $stdout - end - rescue Errno::EPIPE - ensure - @paging = false - end - - ## - # Are we using a pager? - - def paging? - @paging - end - - ## - # Extract the class, selector and method name parts from +name+ like - # Foo::Bar#baz. - # - # NOTE: Given Foo::Bar, Bar is considered a class even though it may be a - # method - - def parse_name(name) - parts = name.split(/(::|#|\.)/) - - if parts.length == 1 then - if parts.first =~ /^[a-z]/ then - type = '.' - meth = parts.pop - else - type = nil - meth = nil - end - elsif parts.length == 2 or parts.last =~ /::|#|\./ then - type = parts.pop - meth = nil - elsif parts[-2] != '::' or parts.last !~ /^[A-Z]/ then - meth = parts.pop - type = parts.pop - end - - klass = parts.join - - [klass, type, meth] - end - - ## - # Looks up and displays ri data according to the options given. - - def run - if @list_doc_dirs then - puts @doc_dirs - elsif @interactive then - interactive - elsif @names.empty? then - list_known_classes - else - display_names @names - end - rescue NotFoundError => e - abort e.message - end - - ## - # Sets up a pager program to pass output through. Tries the RI_PAGER and - # PAGER environment variables followed by pager, less then more. - - def setup_pager - return if @use_stdout - - pagers = [ENV['RI_PAGER'], ENV['PAGER'], 'pager', 'less', 'more'] - - pagers.compact.uniq.each do |pager| - next unless File.exist? pager - - io = IO.popen pager, "w" rescue next - - next if $? and $?.exited? # pager didn't work - - @paging = true - - return io - end - - @use_stdout = true - - nil - end - -end - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/ri/formatter.rb b/Src/StdLib/ruby/1.9.1/rdoc/ri/formatter.rb deleted file mode 100644 index 3ff4db95b..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/ri/formatter.rb +++ /dev/null @@ -1,5 +0,0 @@ -## -# For RubyGems backwards compatibility - -module RDoc::RI::Formatter # :nodoc: -end diff --git a/Src/StdLib/ruby/1.9.1/rdoc/ri/paths.rb b/Src/StdLib/ruby/1.9.1/rdoc/ri/paths.rb deleted file mode 100644 index ba9125b24..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/ri/paths.rb +++ /dev/null @@ -1,112 +0,0 @@ -require 'rdoc/ri' - -## -# The directories where ri data lives. - -module RDoc::RI::Paths - - #:stopdoc: - require 'rbconfig' - - version = RbConfig::CONFIG['ruby_version'] - - base = File.join RbConfig::CONFIG['ridir'], version - SYSDIR = File.join base, "system" - SITEDIR = File.join base, "site" - HOMEDIR = (File.expand_path('~/.rdoc') rescue nil) - #:startdoc: - - @gemdirs = nil - - ## - # Iterates over each selected path yielding the directory and type. - # - # Yielded types: - # :system:: Where Ruby's ri data is stored. Yielded when +system+ is - # true - # :site:: Where ri for installed libraries are stored. Yielded when - # +site+ is true. Normally no ri data is stored here. - # :home:: ~/.ri. Yielded when +home+ is true. - # :gem:: ri data for an installed gem. Yielded when +gems+ is true. - # :extra:: ri data directory from the command line. Yielded for each - # entry in +extra_dirs+ - - def self.each system, site, home, gems, *extra_dirs # :yields: directory, type - extra_dirs.each do |dir| - yield dir, :extra - end - - yield SYSDIR, :system if system - yield SITEDIR, :site if site - yield HOMEDIR, :home if home - - gemdirs.each do |dir| - yield dir, :gem - end if gems - - nil - end - - ## - # The latest installed gems' ri directories - - def self.gemdirs - return @gemdirs if @gemdirs - - require 'rubygems' unless defined?(Gem) - - # HACK dup'd from Gem.latest_partials and friends - all_paths = [] - - all_paths = Gem.path.map do |dir| - Dir[File.join(dir, 'doc', '*', 'ri')] - end.flatten - - ri_paths = {} - - all_paths.each do |dir| - base = File.basename File.dirname(dir) - if base =~ /(.*)-((\d+\.)*\d+)/ then - name, version = $1, $2 - ver = Gem::Version.new version - if ri_paths[name].nil? or ver > ri_paths[name][0] then - ri_paths[name] = [ver, dir] - end - end - end - - @gemdirs = ri_paths.map { |k,v| v.last }.sort - rescue LoadError - @gemdirs = [] - end - - ## - # Returns existing directories from the selected documentation directories - # as an Array. - # - # See also ::each - - def self.path(system, site, home, gems, *extra_dirs) - path = raw_path system, site, home, gems, *extra_dirs - - path.select { |directory| File.directory? directory } - end - - ## - # Returns selected documentation directories including nonexistent - # directories. - # - # See also ::each - - def self.raw_path(system, site, home, gems, *extra_dirs) - path = [] - - each(system, site, home, gems, *extra_dirs) do |dir, type| - path << dir - end - - path.compact - end - -end - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/ri/store.rb b/Src/StdLib/ruby/1.9.1/rdoc/ri/store.rb deleted file mode 100644 index f3899bf97..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/ri/store.rb +++ /dev/null @@ -1,248 +0,0 @@ -require 'rdoc/code_objects' -require 'fileutils' - -## -# A set of ri data. -# -# The store manages reading and writing ri data for a project (gem, path, -# etc.) and maintains a cache of methods, classes and ancestors in the -# store. - -class RDoc::RI::Store - - ## - # Path this store reads or writes - - attr_accessor :path - - ## - # Type of ri datastore this was loaded from. See RDoc::RI::Driver, - # RDoc::RI::Paths. - - attr_accessor :type - - attr_reader :cache - - ## - # Creates a new Store of +type+ that will load or save to +path+ - - def initialize path, type = nil - @type = type - @path = path - - @cache = { - :class_methods => {}, - :instance_methods => {}, - :attributes => {}, - :modules => [], - :ancestors => {}, - } - end - - ## - # Ancestors cache accessor. Maps a klass name to an Array of its ancestors - # in this store. If Foo in this store inherits from Object, Kernel won't be - # listed (it will be included from ruby's ri store). - - def ancestors - @cache[:ancestors] - end - - ## - # Attributes cache accessor. Maps a class to an Array of its attributes. - - def attributes - @cache[:attributes] - end - - ## - # Path to the cache file - - def cache_path - File.join @path, 'cache.ri' - end - - ## - # Path to the ri data for +klass_name+ - - def class_file klass_name - name = klass_name.split('::').last - File.join class_path(klass_name), "cdesc-#{name}.ri" - end - - ## - # Class methods cache accessor. Maps a class to an Array of its class - # methods (not full name). - - def class_methods - @cache[:class_methods] - end - - ## - # Path where data for +klass_name+ will be stored (methods or class data) - - def class_path klass_name - File.join @path, *klass_name.split('::') - end - - ## - # Friendly rendition of #path - - def friendly_path - case type - when :gem then - sep = Regexp.union(*['/', File::ALT_SEPARATOR].compact) - @path =~ /#{sep}doc#{sep}(.*?)#{sep}ri$/ - "gem #{$1}" - when :home then '~/.ri' - when :site then 'ruby site' - when :system then 'ruby core' - else @path - end - end - - def inspect # :nodoc: - "#<%s:0x%x %s %p>" % [self.class, object_id, @path, modules.sort] - end - - ## - # Instance methods cache accessor. Maps a class to an Array of its - # instance methods (not full name). - - def instance_methods - @cache[:instance_methods] - end - - ## - # Loads cache file for this store - - def load_cache - open cache_path, 'rb' do |io| - @cache = Marshal.load io.read - end - rescue Errno::ENOENT - end - - ## - # Loads ri data for +klass_name+ - - def load_class klass_name - open class_file(klass_name), 'rb' do |io| - Marshal.load io.read - end - end - - ## - # Loads ri data for +method_name+ in +klass_name+ - - def load_method klass_name, method_name - open method_file(klass_name, method_name), 'rb' do |io| - Marshal.load io.read - end - end - - ## - # Path to the ri data for +method_name+ in +klass_name+ - - def method_file klass_name, method_name - method_name = method_name.split('::').last - method_name =~ /#(.*)/ - method_type = $1 ? 'i' : 'c' - method_name = $1 if $1 - - method_name = if ''.respond_to? :ord then - method_name.gsub(/\W/) { "%%%02x" % $&[0].ord } - else - method_name.gsub(/\W/) { "%%%02x" % $&[0] } - end - - File.join class_path(klass_name), "#{method_name}-#{method_type}.ri" - end - - ## - # Modules cache accessor. An Array of all the modules (and classes) in the - # store. - - def modules - @cache[:modules] - end - - ## - # Writes the cache file for this store - - def save_cache - # HACK mongrel-1.1.5 documents its files twice - @cache[:attributes]. each do |_, m| m.uniq!; m.sort! end - @cache[:class_methods]. each do |_, m| m.uniq!; m.sort! end - @cache[:instance_methods].each do |_, m| m.uniq!; m.sort! end - - open cache_path, 'wb' do |io| - Marshal.dump @cache, io - end - end - - ## - # Writes the ri data for +klass+ - - def save_class klass - FileUtils.mkdir_p class_path(klass.full_name) - - @cache[:modules] << klass.full_name - - path = class_file klass.full_name - - begin - disk_klass = nil - - open path, 'rb' do |io| - disk_klass = Marshal.load io.read - end - - klass.merge disk_klass - rescue Errno::ENOENT - end - - # BasicObject has no ancestors - ancestors = klass.ancestors.compact.map do |ancestor| - # HACK for classes we don't know about (class X < RuntimeError) - String === ancestor ? ancestor : ancestor.full_name - end - - @cache[:ancestors][klass.full_name] ||= [] - @cache[:ancestors][klass.full_name].push(*ancestors) - - attributes = klass.attributes.map do |attribute| - "#{attribute.type} #{attribute.name}" - end - - unless attributes.empty? then - @cache[:attributes][klass.full_name] ||= [] - @cache[:attributes][klass.full_name].push(*attributes) - end - - open path, 'wb' do |io| - Marshal.dump klass, io - end - end - - ## - # Writes the ri data for +method+ on +klass+ - - def save_method klass, method - FileUtils.mkdir_p class_path(klass.full_name) - - cache = if method.singleton then - @cache[:class_methods] - else - @cache[:instance_methods] - end - cache[klass.full_name] ||= [] - cache[klass.full_name] << method.name - - open method_file(klass.full_name, method.full_name), 'wb' do |io| - Marshal.dump method, io - end - end - -end - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/ruby_lex.rb b/Src/StdLib/ruby/1.9.1/rdoc/ruby_lex.rb deleted file mode 100644 index 1a30cb67c..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/ruby_lex.rb +++ /dev/null @@ -1,1292 +0,0 @@ -#-- -# irb/ruby-lex.rb - ruby lexcal analyzer -# $Release Version: 0.9.5$ -# $Revision: 17979 $ -# $Date: 2008-07-09 10:17:05 -0700 (Wed, 09 Jul 2008) $ -# by Keiju ISHITSUKA(keiju@ruby-lang.org) -# -#++ - -require "e2mmap" -require "irb/slex" -require "rdoc/ruby_token" -require "stringio" - -## -# Ruby lexer adapted from irb. -# -# The internals are not documented because they are scary. - -class RDoc::RubyLex - - # :stopdoc: - - extend Exception2MessageMapper - - def_exception(:AlreadyDefinedToken, "Already defined token(%s)") - def_exception(:TkReading2TokenNoKey, "key nothing(key='%s')") - def_exception(:TkSymbol2TokenNoKey, "key nothing(key='%s')") - def_exception(:TkReading2TokenDuplicateError, - "key duplicate(token_n='%s', key='%s')") - def_exception(:SyntaxError, "%s") - - def_exception(:TerminateLineInput, "Terminate Line Input") - - include RDoc::RubyToken - include IRB - - attr_reader :continue - attr_reader :lex_state - attr_reader :reader - - class << self - attr_accessor :debug_level - end - - def self.debug? - @debug_level > 0 - end - - self.debug_level = 0 - - def initialize(content, options) - lex_init - - if /\t/ =~ content then - tab_width = options.tab_width - content = content.split(/\n/).map do |line| - 1 while line.gsub!(/\t+/) { - ' ' * (tab_width*$&.length - $`.length % tab_width) - } && $~ - line - end.join("\n") - end - - content << "\n" unless content[-1, 1] == "\n" - - set_input StringIO.new content - - @base_char_no = 0 - @char_no = 0 - @exp_line_no = @line_no = 1 - @here_readed = [] - @readed = [] - @rests = [] - @seek = 0 - - @here_header = false - @indent = 0 - @indent_stack = [] - @lex_state = EXPR_BEG - @space_seen = false - - @continue = false - @line = "" - - @skip_space = false - @readed_auto_clean_up = false - @exception_on_syntax_error = true - - @prompt = nil - @prev_seek = nil - end - - def inspect # :nodoc: - "#<%s:0x%x lex_state %p space_seen %p>" % [ - self.class, object_id, - @lex_state, @space_seen, - ] - end - - attr_accessor :skip_space - attr_accessor :readed_auto_clean_up - attr_accessor :exception_on_syntax_error - - attr_reader :seek - attr_reader :char_no - attr_reader :line_no - attr_reader :indent - - # io functions - def set_input(io, p = nil, &block) - @io = io - if p.respond_to?(:call) - @input = p - elsif block_given? - @input = block - else - @input = Proc.new{@io.gets} - end - end - - def get_readed - if idx = @readed.reverse.index("\n") - @base_char_no = idx - else - @base_char_no += @readed.size - end - - readed = @readed.join("") - @readed = [] - readed - end - - def getc - while @rests.empty? - # return nil unless buf_input - @rests.push nil unless buf_input - end - c = @rests.shift - if @here_header - @here_readed.push c - else - @readed.push c - end - @seek += 1 - if c == "\n" - @line_no += 1 - @char_no = 0 - else - @char_no += 1 - end - c - end - - def gets - l = "" - while c = getc - l.concat(c) - break if c == "\n" - end - return nil if l == "" and c.nil? - l - end - - def eof? - @io.eof? - end - - def getc_of_rests - if @rests.empty? - nil - else - getc - end - end - - def ungetc(c = nil) - if @here_readed.empty? - c2 = @readed.pop - else - c2 = @here_readed.pop - end - c = c2 unless c - @rests.unshift c #c = - @seek -= 1 - if c == "\n" - @line_no -= 1 - if idx = @readed.reverse.index("\n") - @char_no = @readed.size - idx - else - @char_no = @base_char_no + @readed.size - end - else - @char_no -= 1 - end - end - - def peek_equal?(str) - chrs = str.split(//) - until @rests.size >= chrs.size - return false unless buf_input - end - @rests[0, chrs.size] == chrs - end - - def peek_match?(regexp) - while @rests.empty? - return false unless buf_input - end - regexp =~ @rests.join("") - end - - def peek(i = 0) - while @rests.size <= i - return nil unless buf_input - end - @rests[i] - end - - def buf_input - prompt - line = @input.call - return nil unless line - @rests.concat line.split(//) - true - end - private :buf_input - - def set_prompt(p = nil, &block) - p = block if block_given? - if p.respond_to?(:call) - @prompt = p - else - @prompt = Proc.new{print p} - end - end - - def prompt - if @prompt - @prompt.call(@ltype, @indent, @continue, @line_no) - end - end - - def initialize_input - @ltype = nil - @quoted = nil - @indent = 0 - @indent_stack = [] - @lex_state = EXPR_BEG - @space_seen = false - @here_header = false - - @continue = false - prompt - - @line = "" - @exp_line_no = @line_no - end - - def each_top_level_statement - initialize_input - catch(:TERM_INPUT) do - loop do - begin - @continue = false - prompt - unless l = lex - throw :TERM_INPUT if @line == '' - else - #p l - @line.concat l - if @ltype or @continue or @indent > 0 - next - end - end - if @line != "\n" - yield @line, @exp_line_no - end - break unless l - @line = '' - @exp_line_no = @line_no - - @indent = 0 - @indent_stack = [] - prompt - rescue TerminateLineInput - initialize_input - prompt - get_readed - end - end - end - end - - def lex - until (((tk = token).kind_of?(TkNL) || tk.kind_of?(TkEND_OF_SCRIPT)) && - !@continue or - tk.nil?) - #p tk - #p @lex_state - #p self - end - line = get_readed - # print self.inspect - if line == "" and tk.kind_of?(TkEND_OF_SCRIPT) || tk.nil? - nil - else - line - end - end - - def token - # require "tracer" - # Tracer.on - @prev_seek = @seek - @prev_line_no = @line_no - @prev_char_no = @char_no - begin - begin - tk = @OP.match(self) - @space_seen = tk.kind_of?(TkSPACE) - rescue SyntaxError => e - raise RDoc::Error, "syntax error: #{e.message}" if - @exception_on_syntax_error - - tk = TkError.new(@seek, @line_no, @char_no) - end - end while @skip_space and tk.kind_of?(TkSPACE) - - if @readed_auto_clean_up - get_readed - end - # Tracer.off - tk - end - - ENINDENT_CLAUSE = [ - "case", "class", "def", "do", "for", "if", - "module", "unless", "until", "while", "begin" #, "when" - ] - - DEINDENT_CLAUSE = ["end" #, "when" - ] - - PERCENT_LTYPE = { - "q" => "\'", - "Q" => "\"", - "x" => "\`", - "r" => "/", - "w" => "]", - "W" => "]", - "s" => ":" - } - - PERCENT_PAREN = { - "{" => "}", - "[" => "]", - "<" => ">", - "(" => ")" - } - - PERCENT_PAREN_REV = PERCENT_PAREN.invert - - Ltype2Token = { - "\'" => TkSTRING, - "\"" => TkSTRING, - "\`" => TkXSTRING, - "/" => TkREGEXP, - "]" => TkDSTRING, - ":" => TkSYMBOL - } - DLtype2Token = { - "\"" => TkDSTRING, - "\`" => TkDXSTRING, - "/" => TkDREGEXP, - } - - def lex_init() - @OP = IRB::SLex.new - @OP.def_rules("\0", "\004", "\032") do |op, io| - Token(TkEND_OF_SCRIPT) - end - - @OP.def_rules(" ", "\t", "\f", "\r", "\13") do |op, io| - @space_seen = true - str = op - while (ch = getc) =~ /[ \t\f\r\13]/ do - str << ch - end - ungetc - Token TkSPACE, str - end - - @OP.def_rule("#") do |op, io| - identify_comment - end - - @OP.def_rule("=begin", - proc{|op, io| @prev_char_no == 0 && peek(0) =~ /\s/}) do - |op, io| - @ltype = "=" - res = '' - until (ch = getc) == "\n" do res << ch end - until peek_equal?("=end") && peek(4) =~ /\s/ do - until (ch = getc) == "\n" do res << ch end - end - res << gets - @ltype = nil - Token(TkRD_COMMENT, res) - end - - @OP.def_rule("\n") do |op, io| - print "\\n\n" if RDoc::RubyLex.debug? - case @lex_state - when EXPR_BEG, EXPR_FNAME, EXPR_DOT - @continue = true - else - @continue = false - @lex_state = EXPR_BEG - until (@indent_stack.empty? || - [TkLPAREN, TkLBRACK, TkLBRACE, - TkfLPAREN, TkfLBRACK, TkfLBRACE].include?(@indent_stack.last)) - @indent_stack.pop - end - end - @here_header = false - @here_readed = [] - Token(TkNL) - end - - @OP.def_rules("*", "**", - "=", "==", "===", - "=~", "<=>", - "<", "<=", - ">", ">=", ">>") do - |op, io| - case @lex_state - when EXPR_FNAME, EXPR_DOT - @lex_state = EXPR_ARG - else - @lex_state = EXPR_BEG - end - Token(op) - end - - @OP.def_rules("!", "!=", "!~") do - |op, io| - @lex_state = EXPR_BEG - Token(op) - end - - @OP.def_rules("<<") do - |op, io| - tk = nil - if @lex_state != EXPR_END && @lex_state != EXPR_CLASS && - (@lex_state != EXPR_ARG || @space_seen) - c = peek(0) - if /\S/ =~ c && (/["'`]/ =~ c || /\w/ =~ c || c == "-") - tk = identify_here_document - end - end - unless tk - tk = Token(op) - case @lex_state - when EXPR_FNAME, EXPR_DOT - @lex_state = EXPR_ARG - else - @lex_state = EXPR_BEG - end - end - tk - end - - @OP.def_rules("'", '"') do - |op, io| - identify_string(op) - end - - @OP.def_rules("`") do - |op, io| - if @lex_state == EXPR_FNAME - @lex_state = EXPR_END - Token(op) - else - identify_string(op) - end - end - - @OP.def_rules('?') do - |op, io| - if @lex_state == EXPR_END - @lex_state = EXPR_BEG - Token(TkQUESTION) - else - ch = getc - if @lex_state == EXPR_ARG && ch =~ /\s/ - ungetc - @lex_state = EXPR_BEG; - Token(TkQUESTION) - else - str = ch - if ch == '\\' - str << read_escape - end - @lex_state = EXPR_END - str << (ch.respond_to?(:ord) ? ch.ord : ch[0]) - Token(TkINTEGER, str) - end - end - end - - @OP.def_rules("&", "&&", "|", "||") do - |op, io| - @lex_state = EXPR_BEG - Token(op) - end - - @OP.def_rules("+=", "-=", "*=", "**=", - "&=", "|=", "^=", "<<=", ">>=", "||=", "&&=") do - |op, io| - @lex_state = EXPR_BEG - op =~ /^(.*)=$/ - Token(TkOPASGN, $1) - end - - @OP.def_rule("+@", proc{|op, io| @lex_state == EXPR_FNAME}) do - |op, io| - @lex_state = EXPR_ARG - Token(op) - end - - @OP.def_rule("-@", proc{|op, io| @lex_state == EXPR_FNAME}) do - |op, io| - @lex_state = EXPR_ARG - Token(op) - end - - @OP.def_rules("+", "-") do - |op, io| - catch(:RET) do - if @lex_state == EXPR_ARG - if @space_seen and peek(0) =~ /[0-9]/ - throw :RET, identify_number - else - @lex_state = EXPR_BEG - end - elsif @lex_state != EXPR_END and peek(0) =~ /[0-9]/ - throw :RET, identify_number - else - @lex_state = EXPR_BEG - end - Token(op) - end - end - - @OP.def_rule(".") do - |op, io| - @lex_state = EXPR_BEG - if peek(0) =~ /[0-9]/ - ungetc - identify_number - else - # for "obj.if" etc. - @lex_state = EXPR_DOT - Token(TkDOT) - end - end - - @OP.def_rules("..", "...") do - |op, io| - @lex_state = EXPR_BEG - Token(op) - end - - lex_int2 - end - - def lex_int2 - @OP.def_rules("]", "}", ")") do - |op, io| - @lex_state = EXPR_END - @indent -= 1 - @indent_stack.pop - Token(op) - end - - @OP.def_rule(":") do - |op, io| - if @lex_state == EXPR_END || peek(0) =~ /\s/ - @lex_state = EXPR_BEG - Token(TkCOLON) - else - @lex_state = EXPR_FNAME; - Token(TkSYMBEG) - end - end - - @OP.def_rule("::") do - |op, io| - # p @lex_state.id2name, @space_seen - if @lex_state == EXPR_BEG or @lex_state == EXPR_ARG && @space_seen - @lex_state = EXPR_BEG - Token(TkCOLON3) - else - @lex_state = EXPR_DOT - Token(TkCOLON2) - end - end - - @OP.def_rule("/") do - |op, io| - if @lex_state == EXPR_BEG || @lex_state == EXPR_MID - identify_string(op) - elsif peek(0) == '=' - getc - @lex_state = EXPR_BEG - Token(TkOPASGN, "/") #/) - elsif @lex_state == EXPR_ARG and @space_seen and peek(0) !~ /\s/ - identify_string(op) - else - @lex_state = EXPR_BEG - Token("/") #/) - end - end - - @OP.def_rules("^") do - |op, io| - @lex_state = EXPR_BEG - Token("^") - end - - # @OP.def_rules("^=") do - # @lex_state = EXPR_BEG - # Token(OP_ASGN, :^) - # end - - @OP.def_rules(",") do - |op, io| - @lex_state = EXPR_BEG - Token(op) - end - - @OP.def_rules(";") do - |op, io| - @lex_state = EXPR_BEG - until (@indent_stack.empty? || - [TkLPAREN, TkLBRACK, TkLBRACE, - TkfLPAREN, TkfLBRACK, TkfLBRACE].include?(@indent_stack.last)) - @indent_stack.pop - end - Token(op) - end - - @OP.def_rule("~") do - |op, io| - @lex_state = EXPR_BEG - Token("~") - end - - @OP.def_rule("~@", proc{|op, io| @lex_state == EXPR_FNAME}) do - |op, io| - @lex_state = EXPR_BEG - Token("~") - end - - @OP.def_rule("(") do - |op, io| - @indent += 1 - if @lex_state == EXPR_BEG || @lex_state == EXPR_MID - @lex_state = EXPR_BEG - tk_c = TkfLPAREN - else - @lex_state = EXPR_BEG - tk_c = TkLPAREN - end - @indent_stack.push tk_c - tk = Token(tk_c) - end - - @OP.def_rule("[]", proc{|op, io| @lex_state == EXPR_FNAME}) do - |op, io| - @lex_state = EXPR_ARG - Token("[]") - end - - @OP.def_rule("[]=", proc{|op, io| @lex_state == EXPR_FNAME}) do - |op, io| - @lex_state = EXPR_ARG - Token("[]=") - end - - @OP.def_rule("[") do - |op, io| - @indent += 1 - if @lex_state == EXPR_FNAME - tk_c = TkfLBRACK - else - if @lex_state == EXPR_BEG || @lex_state == EXPR_MID - tk_c = TkLBRACK - elsif @lex_state == EXPR_ARG && @space_seen - tk_c = TkLBRACK - else - tk_c = TkfLBRACK - end - @lex_state = EXPR_BEG - end - @indent_stack.push tk_c - Token(tk_c) - end - - @OP.def_rule("{") do - |op, io| - @indent += 1 - if @lex_state != EXPR_END && @lex_state != EXPR_ARG - tk_c = TkLBRACE - else - tk_c = TkfLBRACE - end - @lex_state = EXPR_BEG - @indent_stack.push tk_c - Token(tk_c) - end - - @OP.def_rule('\\') do - |op, io| - if getc == "\n" - @space_seen = true - @continue = true - Token(TkSPACE) - else - ungetc - Token("\\") - end - end - - @OP.def_rule('%') do - |op, io| - if @lex_state == EXPR_BEG || @lex_state == EXPR_MID - identify_quotation - elsif peek(0) == '=' - getc - Token(TkOPASGN, :%) - elsif @lex_state == EXPR_ARG and @space_seen and peek(0) !~ /\s/ - identify_quotation - else - @lex_state = EXPR_BEG - Token("%") #)) - end - end - - @OP.def_rule('$') do - |op, io| - identify_gvar - end - - @OP.def_rule('@') do - |op, io| - if peek(0) =~ /[\w@]/ - ungetc - identify_identifier - else - Token("@") - end - end - - # @OP.def_rule("def", proc{|op, io| /\s/ =~ io.peek(0)}) do - # |op, io| - # @indent += 1 - # @lex_state = EXPR_FNAME - # # @lex_state = EXPR_END - # # until @rests[0] == "\n" or @rests[0] == ";" - # # rests.shift - # # end - # end - - @OP.def_rule("_") do - if peek_match?(/_END__/) and @lex_state == EXPR_BEG then - Token(TkEND_OF_SCRIPT) - else - ungetc - identify_identifier - end - end - - @OP.def_rule("") do - |op, io| - printf "MATCH: start %s: %s\n", op, io.inspect if RDoc::RubyLex.debug? - if peek(0) =~ /[0-9]/ - t = identify_number - else - t = identify_identifier - end - printf "MATCH: end %s: %s\n", op, io.inspect if RDoc::RubyLex.debug? - t - end - - p @OP if RDoc::RubyLex.debug? - end - - def identify_gvar - @lex_state = EXPR_END - - case ch = getc - when /[~_*$?!@\/\\;,=:<>".]/ #" - Token(TkGVAR, "$" + ch) - when "-" - Token(TkGVAR, "$-" + getc) - when "&", "`", "'", "+" - Token(TkBACK_REF, "$"+ch) - when /[1-9]/ - ref = ch - while (ch = getc) =~ /[0-9]/ do ref << ch end - ungetc - Token(TkNTH_REF, "$#{ref}") - when /\w/ - ungetc - ungetc - identify_identifier - else - ungetc - Token("$") - end - end - - def identify_identifier - token = "" - if peek(0) =~ /[$@]/ - token.concat(c = getc) - if c == "@" and peek(0) == "@" - token.concat getc - end - end - - # HACK to avoid a warning the regexp is hidden behind an eval - # HACK need a better way to detect oniguruma - @identifier_re ||= if defined? Encoding then - eval '/[\p{Alnum}_]/u' - else - eval '/[\w\x80-\xff]/' - end - - while (ch = getc) =~ @identifier_re - print " :#{ch}: " if RDoc::RubyLex.debug? - token.concat ch - end - - ungetc - - if (ch == "!" || ch == "?") && token[0,1] =~ /\w/ && peek(0) != "=" - token.concat getc - end - - # almost fix token - - case token - when /^\$/ - return Token(TkGVAR, token) - when /^\@\@/ - @lex_state = EXPR_END - # p Token(TkCVAR, token) - return Token(TkCVAR, token) - when /^\@/ - @lex_state = EXPR_END - return Token(TkIVAR, token) - end - - if @lex_state != EXPR_DOT - print token, "\n" if RDoc::RubyLex.debug? - - token_c, *trans = TkReading2Token[token] - if token_c - # reserved word? - - if (@lex_state != EXPR_BEG && - @lex_state != EXPR_FNAME && - trans[1]) - # modifiers - token_c = TkSymbol2Token[trans[1]] - @lex_state = trans[0] - else - if @lex_state != EXPR_FNAME - if ENINDENT_CLAUSE.include?(token) - # check for ``class = val'' etc. - valid = true - case token - when "class" - valid = false unless peek_match?(/^\s*(<<|\w|::)/) - when "def" - valid = false if peek_match?(/^\s*(([+-\/*&\|^]|<<|>>|\|\||\&\&)=|\&\&|\|\|)/) - when "do" - valid = false if peek_match?(/^\s*([+-\/*]?=|\*|<|>|\&)/) - when *ENINDENT_CLAUSE - valid = false if peek_match?(/^\s*([+-\/*]?=|\*|<|>|\&|\|)/) - else - # no nothing - end - if valid - if token == "do" - if ![TkFOR, TkWHILE, TkUNTIL].include?(@indent_stack.last) - @indent += 1 - @indent_stack.push token_c - end - else - @indent += 1 - @indent_stack.push token_c - end - end - - elsif DEINDENT_CLAUSE.include?(token) - @indent -= 1 - @indent_stack.pop - end - @lex_state = trans[0] - else - @lex_state = EXPR_END - end - end - return Token(token_c, token) - end - end - - if @lex_state == EXPR_FNAME - @lex_state = EXPR_END - if peek(0) == '=' - token.concat getc - end - elsif @lex_state == EXPR_BEG || @lex_state == EXPR_DOT - @lex_state = EXPR_ARG - else - @lex_state = EXPR_END - end - - if token[0, 1] =~ /[A-Z]/ - return Token(TkCONSTANT, token) - elsif token[token.size - 1, 1] =~ /[!?]/ - return Token(TkFID, token) - else - return Token(TkIDENTIFIER, token) - end - end - - def identify_here_document - ch = getc - # if lt = PERCENT_LTYPE[ch] - if ch == "-" - ch = getc - indent = true - end - if /['"`]/ =~ ch - lt = ch - quoted = "" - while (c = getc) && c != lt - quoted.concat c - end - else - lt = '"' - quoted = ch.dup - while (c = getc) && c =~ /\w/ - quoted.concat c - end - ungetc - end - - ltback, @ltype = @ltype, lt - reserve = [] - while ch = getc - reserve.push ch - if ch == "\\" - reserve.push ch = getc - elsif ch == "\n" - break - end - end - - @here_header = false - doc = '' - while l = gets - l = l.sub(/(:?\r)?\n\z/, '') - if (indent ? l.strip : l) == quoted - break - end - doc << l - end - - @here_header = true - @here_readed.concat reserve - while ch = reserve.pop - ungetc ch - end - - @ltype = ltback - @lex_state = EXPR_END - Token(Ltype2Token[lt], doc) - end - - def identify_quotation - ch = getc - if lt = PERCENT_LTYPE[ch] - ch = getc - elsif ch =~ /\W/ - lt = "\"" - else - raise RDoc::Error, "unknown type of %string #{ch.inspect}" - end - # if ch !~ /\W/ - # ungetc - # next - # end - #@ltype = lt - @quoted = ch unless @quoted = PERCENT_PAREN[ch] - identify_string(lt, @quoted) - end - - def identify_number - @lex_state = EXPR_END - - num = '' - - if peek(0) == "0" && peek(1) !~ /[.eE]/ - num << getc - - case peek(0) - when /[xX]/ - ch = getc - match = /[0-9a-fA-F_]/ - when /[bB]/ - ch = getc - match = /[01_]/ - when /[oO]/ - ch = getc - match = /[0-7_]/ - when /[dD]/ - ch = getc - match = /[0-9_]/ - when /[0-7]/ - match = /[0-7_]/ - when /[89]/ - raise RDoc::Error, "Illegal octal digit" - else - return Token(TkINTEGER, num) - end - - num << ch if ch - - len0 = true - non_digit = false - while ch = getc - num << ch - if match =~ ch - if ch == "_" - if non_digit - raise RDoc::Error, "trailing `#{ch}' in number" - else - non_digit = ch - end - else - non_digit = false - len0 = false - end - else - ungetc - num[-1, 1] = '' - if len0 - raise RDoc::Error, "numeric literal without digits" - end - if non_digit - raise RDoc::Error, "trailing `#{non_digit}' in number" - end - break - end - end - return Token(TkINTEGER, num) - end - - type = TkINTEGER - allow_point = true - allow_e = true - non_digit = false - while ch = getc - num << ch - case ch - when /[0-9]/ - non_digit = false - when "_" - non_digit = ch - when allow_point && "." - if non_digit - raise RDoc::Error, "trailing `#{non_digit}' in number" - end - type = TkFLOAT - if peek(0) !~ /[0-9]/ - type = TkINTEGER - ungetc - num[-1, 1] = '' - break - end - allow_point = false - when allow_e && "e", allow_e && "E" - if non_digit - raise RDoc::Error, "trailing `#{non_digit}' in number" - end - type = TkFLOAT - if peek(0) =~ /[+-]/ - num << getc - end - allow_e = false - allow_point = false - non_digit = ch - else - if non_digit - raise RDoc::Error, "trailing `#{non_digit}' in number" - end - ungetc - num[-1, 1] = '' - break - end - end - - Token(type, num) - end - - def identify_string(ltype, quoted = ltype) - @ltype = ltype - @quoted = quoted - - str = if ltype == quoted then - ltype.dup - else - "%#{PERCENT_PAREN_REV[quoted]}" - end - - subtype = nil - begin - nest = 0 - - while ch = getc - str << ch - - if @quoted == ch and nest == 0 - break - elsif @ltype != "'" && @ltype != "]" && @ltype != ":" and ch == "#" - ch = getc - subtype = true - if ch == "{" then - str << ch << skip_inner_expression - next - else - ungetc - end - elsif ch == '\\' and @ltype == "'" #' - case ch = getc - when "\\", "\n", "'" - else - ungetc - end - elsif ch == '\\' #' - str << read_escape - end - - if PERCENT_PAREN.values.include?(@quoted) - if PERCENT_PAREN[ch] == @quoted - nest += 1 - elsif ch == @quoted - nest -= 1 - end - end - end - - if @ltype == "/" - if peek(0) =~ /i|m|x|o|e|s|u|n/ - getc - end - end - - if subtype - Token(DLtype2Token[ltype], str) - else - Token(Ltype2Token[ltype], str) - end - ensure - @ltype = nil - @quoted = nil - @lex_state = EXPR_END - end - end - - def skip_inner_expression - res = "" - nest = 0 - while ch = getc - res << ch - if ch == '}' - break if nest.zero? - nest -= 1 - elsif ch == '{' - nest += 1 - end - end - res - end - - def identify_comment - @ltype = "#" - - comment = '#' - - while ch = getc - # if ch == "\\" #" - # read_escape - # end - if ch == "\n" - @ltype = nil - ungetc - break - end - - comment << ch - end - - return Token(TkCOMMENT, comment) - end - - def read_escape - escape = '' - ch = getc - escape << ch - - case ch - when "\n", "\r", "\f" - when "\\", "n", "t", "r", "f", "v", "a", "e", "b", "s" #" - when /[0-7]/ - ungetc ch - 3.times do - ch = getc - escape << ch - case ch - when /[0-7]/ - when nil - break - else - ungetc - break - end - end - - when "x" - 2.times do - ch = getc - escape << ch - case ch - when /[0-9a-fA-F]/ - when nil - break - else - ungetc - break - end - end - - when "M" - ch = getc - escape << ch - if ch != '-' - ungetc - else - ch = getc - escape << ch - if ch == "\\" #" - escape << read_escape - end - end - - when "C", "c" #, "^" - if ch == "C" and (ch = getc) != "-" - escape << ch - ungetc - elsif (ch = getc) == "\\" #" - escape << ch << read_escape - end - else - # other characters - end - - escape - end - - # :startdoc: - -end - -#RDoc::RubyLex.debug_level = 1 - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/ruby_token.rb b/Src/StdLib/ruby/1.9.1/rdoc/ruby_token.rb deleted file mode 100644 index e792ddb6b..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/ruby_token.rb +++ /dev/null @@ -1,416 +0,0 @@ -#-- -# irb/ruby-token.rb - ruby tokens -# $Release Version: 0.9.5$ -# $Revision: 11708 $ -# $Date: 2007-02-12 15:01:19 -0800 (Mon, 12 Feb 2007) $ -# by Keiju ISHITSUKA(keiju@ruby-lang.org) -#++ -# Definitions of all tokens involved in the lexical analysis. -# -# This class is not documented because it is so deep in the internals. - -module RDoc::RubyToken - # :stopdoc: - - EXPR_BEG = :EXPR_BEG - EXPR_MID = :EXPR_MID - EXPR_END = :EXPR_END - EXPR_ARG = :EXPR_ARG - EXPR_FNAME = :EXPR_FNAME - EXPR_DOT = :EXPR_DOT - EXPR_CLASS = :EXPR_CLASS - - # for ruby 1.4X - if !defined?(Symbol) - Symbol = Integer - end - - def set_token_position(line, char) - @prev_line_no = line - @prev_char_no = char - end - - class Token - def initialize(seek, line_no, char_no, text = nil) - @seek = seek - @line_no = line_no - @char_no = char_no - @text = text - end - - attr :seek - attr :line_no - attr :char_no - - attr_accessor :text - - def ==(other) - self.class == other.class and - other.line_no == @line_no and - other.char_no == @char_no and - other.text == @text - end - - ## - # Because we're used in contexts that expect to return a token, we set the - # text string and then return ourselves - - def set_text(text) - @text = text - self - end - - end - - class TkNode < Token - def initialize(seek, line_no, char_no, node = nil) - super seek, line_no, char_no - @node = node - end - - attr :node - - def ==(other) - self.class == other.class and - other.line_no == @line_no and - other.char_no == @char_no and - other.node == @node - end - - def set_text text - @node = text - self - end - - alias text node - end - - class TkId < Token - def initialize(seek, line_no, char_no, name) - super(seek, line_no, char_no) - @name = name - end - attr :name - - def ==(other) - self.class == other.class and - other.line_no == @line_no and - other.char_no == @char_no and - other.name == @name - end - - def set_text text - @name = text - self - end - - alias text name - end - - class TkKW < TkId - end - - class TkVal < Token - def initialize(seek, line_no, char_no, value = nil) - super(seek, line_no, char_no) - @value = value - end - attr_accessor :value - - def ==(other) - self.class == other.class and - other.line_no == @line_no and - other.char_no == @char_no and - other.value == @value - end - - def set_text text - @value = text - self - end - - alias text value - end - - class TkOp < Token - def initialize(seek, line_no, char_no, name = nil) - super seek, line_no, char_no - @name = name - end - - attr_accessor :name - - def ==(other) - self.class == other.class and - other.line_no == @line_no and - other.char_no == @char_no and - other.name == @name - end - - def set_text text - @name = text - self - end - - alias text name - end - - class TkOPASGN < TkOp - def initialize(seek, line_no, char_no, op) - super(seek, line_no, char_no) - op = TkReading2Token[op][0] unless op.kind_of?(Symbol) - @op = op - @text = nil - end - - attr :op - - def ==(other) - self.class == other.class and - other.line_no == @line_no and - other.char_no == @char_no and - other.op == @op - end - - def text - @text ||= "#{TkToken2Reading[op]}=" - end - end - - class TkUnknownChar < Token - def initialize(seek, line_no, char_no, id) - super(seek, line_no, char_no) - @name = name - end - attr :name - - def ==(other) - self.class == other.class and - other.line_no == @line_no and - other.char_no == @char_no and - other.name == @name - end - - def set_text text - @name = text - self - end - - alias text name - end - - class TkError < Token - end - - def Token(token, value = nil) - value ||= TkToken2Reading[token] - - case token - when String - if (tk = TkReading2Token[token]).nil? - IRB.fail TkReading2TokenNoKey, token - end - - tk = Token(tk[0], value) - - if tk.kind_of?(TkOp) then - tk.name = token - end - when Symbol - if (tk = TkSymbol2Token[token]).nil? - IRB.fail TkSymbol2TokenNoKey, token - end - - tk = Token(tk[0], value) - else - if token.instance_method(:initialize).arity == 3 then - tk = token.new(@prev_seek, @prev_line_no, @prev_char_no) - tk.set_text value - else - tk = token.new(@prev_seek, @prev_line_no, @prev_char_no, value) - end - end - - tk - end - - TokenDefinitions = [ - [:TkCLASS, TkKW, "class", EXPR_CLASS], - [:TkMODULE, TkKW, "module", EXPR_BEG], - [:TkDEF, TkKW, "def", EXPR_FNAME], - [:TkUNDEF, TkKW, "undef", EXPR_FNAME], - [:TkBEGIN, TkKW, "begin", EXPR_BEG], - [:TkRESCUE, TkKW, "rescue", EXPR_MID], - [:TkENSURE, TkKW, "ensure", EXPR_BEG], - [:TkEND, TkKW, "end", EXPR_END], - [:TkIF, TkKW, "if", EXPR_BEG, :TkIF_MOD], - [:TkUNLESS, TkKW, "unless", EXPR_BEG, :TkUNLESS_MOD], - [:TkTHEN, TkKW, "then", EXPR_BEG], - [:TkELSIF, TkKW, "elsif", EXPR_BEG], - [:TkELSE, TkKW, "else", EXPR_BEG], - [:TkCASE, TkKW, "case", EXPR_BEG], - [:TkWHEN, TkKW, "when", EXPR_BEG], - [:TkWHILE, TkKW, "while", EXPR_BEG, :TkWHILE_MOD], - [:TkUNTIL, TkKW, "until", EXPR_BEG, :TkUNTIL_MOD], - [:TkFOR, TkKW, "for", EXPR_BEG], - [:TkBREAK, TkKW, "break", EXPR_END], - [:TkNEXT, TkKW, "next", EXPR_END], - [:TkREDO, TkKW, "redo", EXPR_END], - [:TkRETRY, TkKW, "retry", EXPR_END], - [:TkIN, TkKW, "in", EXPR_BEG], - [:TkDO, TkKW, "do", EXPR_BEG], - [:TkRETURN, TkKW, "return", EXPR_MID], - [:TkYIELD, TkKW, "yield", EXPR_END], - [:TkSUPER, TkKW, "super", EXPR_END], - [:TkSELF, TkKW, "self", EXPR_END], - [:TkNIL, TkKW, "nil", EXPR_END], - [:TkTRUE, TkKW, "true", EXPR_END], - [:TkFALSE, TkKW, "false", EXPR_END], - [:TkAND, TkKW, "and", EXPR_BEG], - [:TkOR, TkKW, "or", EXPR_BEG], - [:TkNOT, TkKW, "not", EXPR_BEG], - [:TkIF_MOD, TkKW], - [:TkUNLESS_MOD, TkKW], - [:TkWHILE_MOD, TkKW], - [:TkUNTIL_MOD, TkKW], - [:TkALIAS, TkKW, "alias", EXPR_FNAME], - [:TkDEFINED, TkKW, "defined?", EXPR_END], - [:TklBEGIN, TkKW, "BEGIN", EXPR_END], - [:TklEND, TkKW, "END", EXPR_END], - [:Tk__LINE__, TkKW, "__LINE__", EXPR_END], - [:Tk__FILE__, TkKW, "__FILE__", EXPR_END], - - [:TkIDENTIFIER, TkId], - [:TkFID, TkId], - [:TkGVAR, TkId], - [:TkCVAR, TkId], - [:TkIVAR, TkId], - [:TkCONSTANT, TkId], - - [:TkINTEGER, TkVal], - [:TkFLOAT, TkVal], - [:TkSTRING, TkVal], - [:TkXSTRING, TkVal], - [:TkREGEXP, TkVal], - [:TkSYMBOL, TkVal], - - [:TkDSTRING, TkNode], - [:TkDXSTRING, TkNode], - [:TkDREGEXP, TkNode], - [:TkNTH_REF, TkNode], - [:TkBACK_REF, TkNode], - - [:TkUPLUS, TkOp, "+@"], - [:TkUMINUS, TkOp, "-@"], - [:TkPOW, TkOp, "**"], - [:TkCMP, TkOp, "<=>"], - [:TkEQ, TkOp, "=="], - [:TkEQQ, TkOp, "==="], - [:TkNEQ, TkOp, "!="], - [:TkGEQ, TkOp, ">="], - [:TkLEQ, TkOp, "<="], - [:TkANDOP, TkOp, "&&"], - [:TkOROP, TkOp, "||"], - [:TkMATCH, TkOp, "=~"], - [:TkNMATCH, TkOp, "!~"], - [:TkDOT2, TkOp, ".."], - [:TkDOT3, TkOp, "..."], - [:TkAREF, TkOp, "[]"], - [:TkASET, TkOp, "[]="], - [:TkLSHFT, TkOp, "<<"], - [:TkRSHFT, TkOp, ">>"], - [:TkCOLON2, TkOp, '::'], - [:TkCOLON3, TkOp, '::'], - #[:OPASGN, TkOp], # +=, -= etc. # - [:TkASSOC, TkOp, "=>"], - [:TkQUESTION, TkOp, "?"], #? - [:TkCOLON, TkOp, ":"], #: - - [:TkfLPAREN, Token, "("], # func( # - [:TkfLBRACK, Token, "["], # func[ # - [:TkfLBRACE, Token, "{"], # func{ # - [:TkSTAR, Token, "*"], # *arg - [:TkAMPER, Token, "&"], # &arg # - [:TkSYMBEG, Token, ":"], # :SYMBOL - - [:TkGT, TkOp, ">"], - [:TkLT, TkOp, "<"], - [:TkPLUS, TkOp, "+"], - [:TkMINUS, TkOp, "-"], - [:TkMULT, TkOp, "*"], - [:TkDIV, TkOp, "/"], - [:TkMOD, TkOp, "%"], - [:TkBITOR, TkOp, "|"], - [:TkBITXOR, TkOp, "^"], - [:TkBITAND, TkOp, "&"], - [:TkBITNOT, TkOp, "~"], - [:TkNOTOP, TkOp, "!"], - - [:TkBACKQUOTE, TkOp, "`"], - - [:TkASSIGN, Token, "="], - [:TkDOT, Token, "."], - [:TkLPAREN, Token, "("], #(exp) - [:TkLBRACK, Token, "["], #[arry] - [:TkLBRACE, Token, "{"], #{hash} - [:TkRPAREN, Token, ")"], - [:TkRBRACK, Token, "]"], - [:TkRBRACE, Token, "}"], - [:TkCOMMA, Token, ","], - [:TkSEMICOLON, Token, ";"], - - [:TkCOMMENT, TkVal], - [:TkRD_COMMENT], - [:TkSPACE, Token, " "], - [:TkNL, Token, "\n"], - [:TkEND_OF_SCRIPT], - - [:TkBACKSLASH, TkUnknownChar, "\\"], - [:TkAT, TkUnknownChar, "@"], - [:TkDOLLAR, TkUnknownChar, "$"], - ] - - # {reading => token_class} - # {reading => [token_class, *opt]} - TkReading2Token = {} - TkToken2Reading = {} - TkSymbol2Token = {} - - def self.def_token(token_n, super_token = Token, reading = nil, *opts) - token_n = token_n.id2name if token_n.kind_of?(Symbol) - if const_defined?(token_n) - IRB.fail AlreadyDefinedToken, token_n - end - token_c = eval("class #{token_n} < #{super_token}; end; #{token_n}") - - if reading - TkToken2Reading[token_c] = reading - - return if TkReading2Token[reading] - - if opts.empty? - TkReading2Token[reading] = [token_c] - else - TkReading2Token[reading] = [token_c].concat(opts) - end - end - TkSymbol2Token[token_n.intern] = token_c - end - - for defs in TokenDefinitions - def_token(*defs) - end - - NEWLINE_TOKEN = TkNL.new nil, 0, 0, "\n" - - class TkSYMBOL - - def to_sym - @sym ||= text[1..-1].intern - end - - end - - # :startdoc: -end - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/single_class.rb b/Src/StdLib/ruby/1.9.1/rdoc/single_class.rb deleted file mode 100644 index f86583139..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/single_class.rb +++ /dev/null @@ -1,13 +0,0 @@ -require 'rdoc/class_module' - -## -# A singleton class - -class RDoc::SingleClass < RDoc::ClassModule - - def ancestors - includes + [superclass] - end - -end - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/stats.rb b/Src/StdLib/ruby/1.9.1/rdoc/stats.rb deleted file mode 100644 index 746d1e82b..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/stats.rb +++ /dev/null @@ -1,247 +0,0 @@ -require 'rdoc' - -## -# RDoc stats collector - -class RDoc::Stats - - attr_reader :nodoc_constants - attr_reader :nodoc_methods - - attr_reader :num_constants - attr_reader :num_files - attr_reader :num_methods - - attr_reader :total_files - - def initialize(total_files, verbosity = 1) - @nodoc_constants = 0 - @nodoc_methods = 0 - - @num_constants = 0 - @num_files = 0 - @num_methods = 0 - - @total_files = total_files - - @start = Time.now - - @display = case verbosity - when 0 then Quiet.new total_files - when 1 then Normal.new total_files - else Verbose.new total_files - end - end - - def begin_adding - @display.begin_adding - end - - def add_alias(as) - @display.print_alias as - @num_methods += 1 - @nodoc_methods += 1 if as.document_self and as.comment.empty? - end - - def add_class(klass) - @display.print_class klass - end - - def add_constant(constant) - @display.print_constant constant - @num_constants += 1 - @nodoc_constants += 1 if constant.document_self and constant.comment.empty? - end - - def add_file(file) - @display.print_file @num_files, file - @num_files += 1 - end - - def add_method(method) - @display.print_method method - @num_methods += 1 - @nodoc_methods += 1 if method.document_self and method.comment.empty? - end - - def add_module(mod) - @display.print_module mod - end - - def done_adding - @display.done_adding - end - - def print - classes = RDoc::TopLevel.classes - num_classes = classes.length - nodoc_classes = classes.select do |klass| - klass.document_self and klass.comment.empty? - end.length - - modules = RDoc::TopLevel.modules - num_modules = modules.length - nodoc_modules = modules.select do |mod| - mod.document_self and mod.comment.empty? - end.length - - items = num_classes + @num_constants + num_modules + @num_methods - doc_items = items - - nodoc_classes - @nodoc_constants - nodoc_modules - @nodoc_methods - - percent_doc = doc_items.to_f / items * 100 - - puts "Files: %5d" % @num_files - puts "Classes: %5d (%5d undocumented)" % [num_classes, nodoc_classes] - puts "Constants: %5d (%5d undocumented)" % - [@num_constants, @nodoc_constants] - puts "Modules: %5d (%5d undocumented)" % [num_modules, nodoc_modules] - puts "Methods: %5d (%5d undocumented)" % [@num_methods, @nodoc_methods] - puts "%6.2f%% documented" % percent_doc - puts - puts "Elapsed: %0.1fs" % (Time.now - @start) - end - - ## - # Stats printer that prints nothing - - class Quiet - - def initialize total_files - @total_files = total_files - end - - ## - # Prints a message at the beginning of parsing - - def begin_adding(*) end - - ## - # Prints when an alias is added - - def print_alias(*) end - - ## - # Prints when a class is added - - def print_class(*) end - - ## - # Prints when a constant is added - - def print_constant(*) end - - ## - # Prints when a file is added - - def print_file(*) end - - ## - # Prints when a method is added - - def print_method(*) end - - ## - # Prints when a module is added - - def print_module(*) end - - ## - # Prints when RDoc is done - - def done_adding(*) end - - end - - ## - # Stats printer that prints just the files being documented with a progress - # bar - - class Normal < Quiet - - def begin_adding # :nodoc: - puts "Parsing sources..." - end - - ## - # Prints a file with a progress bar - - def print_file(files_so_far, filename) - progress_bar = sprintf("%3d%% [%2d/%2d] ", - 100 * (files_so_far + 1) / @total_files, - files_so_far + 1, - @total_files) - - if $stdout.tty? - # Print a progress bar, but make sure it fits on a single line. Filename - # will be truncated if necessary. - terminal_width = (ENV['COLUMNS'] || 80).to_i - max_filename_size = terminal_width - progress_bar.size - if filename.size > max_filename_size - # Turn "some_long_filename.rb" to "...ong_filename.rb" - filename = filename[(filename.size - max_filename_size) .. -1] - filename[0..2] = "..." - end - - # Pad the line with whitespaces so that leftover output from the - # previous line doesn't show up. - line = "#{progress_bar}#{filename}" - padding = terminal_width - line.size - line << (" " * padding) if padding > 0 - - $stdout.print("#{line}\r") - else - $stdout.puts "#{progress_bar} #{filename}" - end - $stdout.flush - end - - def done_adding # :nodoc: - puts - end - - end - - ## - # Stats printer that prints everything documented, including the documented - # status - - class Verbose < Normal - - ## - # Returns a marker for RDoc::CodeObject +co+ being undocumented - - def nodoc co - " (undocumented)" unless co.documented? - end - - def print_alias as # :nodoc: - puts "\t\talias #{as.new_name} #{as.old_name}#{nodoc as}" - end - - def print_class(klass) # :nodoc: - puts "\tclass #{klass.full_name}#{nodoc klass}" - end - - def print_constant(constant) # :nodoc: - puts "\t\t#{constant.name}#{nodoc constant}" - end - - def print_file(files_so_far, file) # :nodoc: - super - puts - end - - def print_method(method) # :nodoc: - puts "\t\t#{method.singleton ? '::' : '#'}#{method.name}#{nodoc method}" - end - - def print_module(mod) # :nodoc: - puts "\tmodule #{mod.full_name}#{nodoc mod}" - end - - end - -end - - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/task.rb b/Src/StdLib/ruby/1.9.1/rdoc/task.rb deleted file mode 100644 index 4dc1c1023..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/task.rb +++ /dev/null @@ -1,33 +0,0 @@ -#-- -# Copyright (c) 2003, 2004 Jim Weirich, 2009 Eric Hodel -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be -# included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -#++ - -require 'rdoc' -require 'rake' -require 'rake/rdoctask' - -# :stopdoc: -module RDoc - Task = Rake::RDocTask -end -# :startdoc: - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/text.rb b/Src/StdLib/ruby/1.9.1/rdoc/text.rb deleted file mode 100644 index 7b5970ed9..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/text.rb +++ /dev/null @@ -1,130 +0,0 @@ -## -# Methods for manipulating comment text - -module RDoc::Text - - ## - # Expands tab characters in +text+ to eight spaces - - def expand_tabs text - expanded = [] - - text.each_line do |line| - line.gsub!(/^(.{8}*?)([^\t\r\n]{0,7})\t/) do - "#{$1}#{$2}#{' ' * (8 - $2.size)}" - end until line !~ /\t/ - - expanded << line - end - - expanded.join - end - - ## - # Flush +text+ left based on the shortest line - - def flush_left text - indents = [] - - text.each_line do |line| - indents << (line =~ /[^\s]/ || 9999) - end - - indent = indents.min - - flush = [] - - text.each_line do |line| - line[/^ {0,#{indent}}/] = '' - flush << line - end - - flush.join - end - - ## - # Convert a string in markup format into HTML. Removes the first paragraph - # tags if +remove_para+ is true. - # - # Requires the including class to implement #formatter - - def markup text - document = parse text - - document.accept formatter - end - - ## - # Strips hashes, expands tabs then flushes +text+ to the left - - def normalize_comment text - return text if text.empty? - - text = strip_hashes text - text = expand_tabs text - text = flush_left text - strip_newlines text - end - - ## - # Normalizes +text+ then builds a RDoc::Markup::Document from it - - def parse text - return text if RDoc::Markup::Document === text - - text = normalize_comment text - - return RDoc::Markup::Document.new if text =~ /\A\n*\z/ - - RDoc::Markup::Parser.parse text - rescue RDoc::Markup::Parser::Error => e - $stderr.puts <<-EOF -While parsing markup, RDoc encountered a #{e.class}: - -#{e} -\tfrom #{e.backtrace.join "\n\tfrom "} - ----8<--- -#{text} ----8<--- - -RDoc #{RDoc::VERSION} - -Ruby #{RUBY_VERSION}-p#{RUBY_PATCHLEVEL} #{RUBY_RELEASE_DATE} - -Please file a bug report with the above information at: - -http://rubyforge.org/tracker/?atid=2472&group_id=627&func=browse - - EOF - raise - end - - ## - # Strips leading # characters from +text+ - - def strip_hashes text - return text if text =~ /^(?>\s*)[^\#]/ - text.gsub(/^\s*(#+)/) { $1.tr '#',' ' } - end - - ## - # Strips leading and trailing \n characters from +text+ - - def strip_newlines text - text.gsub(/\A\n*(.*?)\n*\z/m, '\1') - end - - ## - # Strips /* */ style comments - - def strip_stars text - text = text.gsub %r%Document-method:\s+[\w:.#]+%, '' - text.sub! %r%/\*+% do " " * $&.length end - text.sub! %r%\*+/% do " " * $&.length end - text.gsub! %r%^[ \t]*\*%m do " " * $&.length end - text - end - -end - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/tokenstream.rb b/Src/StdLib/ruby/1.9.1/rdoc/tokenstream.rb deleted file mode 100644 index 0147e8742..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/tokenstream.rb +++ /dev/null @@ -1,52 +0,0 @@ -module RDoc; end - -## -# A TokenStream is a list of tokens, gathered during the parse of some entity -# (say a method). Entities populate these streams by being registered with the -# lexer. Any class can collect tokens by including TokenStream. From the -# outside, you use such an object by calling the start_collecting_tokens -# method, followed by calls to add_token and pop_token. - -module RDoc::TokenStream - - ## - # Adds +tokens+ to the collected tokens - - def add_tokens(*tokens) - tokens.flatten.each { |token| @token_stream << token } - end - - alias add_token add_tokens - - ## - # Starts collecting tokens - - def collect_tokens - @token_stream = [] - end - - alias start_collecting_tokens collect_tokens - - ## - # Remove the last token from the collected tokens - - def pop_token - @token_stream.pop - end - - ## - # Current token stream - - def token_stream - @token_stream - end - - ## - # Returns a string representation of the token stream - - def tokens_to_s - token_stream.map { |token| token.text }.join '' - end - -end - diff --git a/Src/StdLib/ruby/1.9.1/rdoc/top_level.rb b/Src/StdLib/ruby/1.9.1/rdoc/top_level.rb deleted file mode 100644 index f05723b2b..000000000 --- a/Src/StdLib/ruby/1.9.1/rdoc/top_level.rb +++ /dev/null @@ -1,248 +0,0 @@ -require 'rdoc/context' - -## -# A TopLevel context is a representation of the contents of a single file - -class RDoc::TopLevel < RDoc::Context - - ## - # This TopLevel's File::Stat struct - - attr_accessor :file_stat - - ## - # Relative name of this file - - attr_accessor :relative_name - - ## - # Absolute name of this file - - attr_accessor :absolute_name - - attr_accessor :diagram - - ## - # The parser that processed this file - - attr_accessor :parser - - ## - # Returns all classes and modules discovered by RDoc - - def self.all_classes_and_modules - classes_hash.values + modules_hash.values - end - - ## - # Returns all classes discovered by RDoc - - def self.classes - classes_hash.values - end - - ## - # Hash of all classes known to RDoc - - def self.classes_hash - @all_classes - end - - ## - # All TopLevels known to RDoc - - def self.files - @all_files.values - end - - ## - # Hash of all files known to RDoc - - def self.files_hash - @all_files - end - - ## - # Finds the class with +name+ in all discovered classes - - def self.find_class_named(name) - classes_hash[name] - end - - ## - # Finds the class with +name+ starting in namespace +from+ - - def self.find_class_named_from name, from - from = find_class_named from unless RDoc::Context === from - - until RDoc::TopLevel === from do - return nil unless from - - klass = from.find_class_named name - return klass if klass - - from = from.parent - end - - find_class_named name - end - - ## - # Finds the class or module with +name+ - - def self.find_class_or_module(name) - name =~ /^::/ - name = $' || name - - RDoc::TopLevel.classes_hash[name] || RDoc::TopLevel.modules_hash[name] - end - - ## - # Finds the file with +name+ in all discovered files - - def self.find_file_named(name) - @all_files[name] - end - - ## - # Finds the module with +name+ in all discovered modules - - def self.find_module_named(name) - modules_hash[name] - end - - ## - # Returns all modules discovered by RDoc - - def self.modules - modules_hash.values - end - - ## - # Hash of all modules known to RDoc - - def self.modules_hash - @all_modules - end - - ## - # Empties RDoc of stored class, module and file information - - def self.reset - @all_classes = {} - @all_modules = {} - @all_files = {} - end - - reset - - ## - # Creates a new TopLevel for +file_name+ - - def initialize(file_name) - super() - @name = nil - @relative_name = file_name - @absolute_name = file_name - @file_stat = File.stat(file_name) rescue nil # HACK for testing - @diagram = nil - @parser = nil - - RDoc::TopLevel.files_hash[file_name] = self - end - - ## - # Adds +method+ to Object instead of RDoc::TopLevel - - def add_method(method) - object = self.class.find_class_named 'Object' - object = add_class RDoc::NormalClass, 'Object' unless object - - object.add_method method - end - - ## - # Base name of this file - - def base_name - File.basename @absolute_name - end - - ## - # See RDoc::TopLevel.find_class_or_module - - def find_class_or_module name - RDoc::TopLevel.find_class_or_module name - end - - ## - # Finds a class or module named +symbol+ - - def find_local_symbol(symbol) - find_class_or_module(symbol) || super - end - - ## - # Finds a module or class with +name+ - - def find_module_named(name) - find_class_or_module(name) || find_enclosing_module_named(name) - end - - ## - # The name of this file - - def full_name - @relative_name - end - - ## - # URL for this with a +prefix+ - - def http_url(prefix) - path = [prefix, @relative_name.tr('.', '_')] - - File.join(*path.compact) + '.html' - end - - def inspect # :nodoc: - "#<%s:0x%x %p modules: %p classes: %p>" % [ - self.class, object_id, - base_name, - @modules.map { |n,m| m }, - @classes.map { |n,c| c } - ] - end - - ## - # Date this file was last modified, if known - - def last_modified - @file_stat ? file_stat.mtime.to_s : 'Unknown' - end - - ## - # Base name of this file - - alias name base_name - - ## - # Path to this file - - def path - http_url RDoc::RDoc.current.generator.file_dir - end - - def pretty_print q # :nodoc: - q.group 2, "[#{self.class}: ", "]" do - q.text "base name: #{base_name.inspect}" - q.breakable - - items = @modules.map { |n,m| m } - items.push(*@modules.map { |n,c| c }) - q.seplist items do |mod| q.pp mod end - end - end - -end - diff --git a/Src/StdLib/ruby/1.9.1/shell.rb b/Src/StdLib/ruby/1.9.1/shell.rb deleted file mode 100644 index f838a542c..000000000 --- a/Src/StdLib/ruby/1.9.1/shell.rb +++ /dev/null @@ -1,300 +0,0 @@ -# -# shell.rb - -# $Release Version: 0.7 $ -# $Revision: 1.9 $ -# by Keiju ISHITSUKA(keiju@ruby-lang.org) -# -# -- -# -# -# - -require "e2mmap" - -require "thread" unless defined?(Mutex) - -require "forwardable" - -require "shell/error" -require "shell/command-processor" -require "shell/process-controller" - -class Shell - @RCS_ID='-$Id: shell.rb,v 1.9 2002/03/04 12:01:10 keiju Exp keiju $-' - - include Error - extend Exception2MessageMapper - -# @cascade = true - # debug: true -> normal debug - # debug: 1 -> eval definition debug - # debug: 2 -> detail inspect debug - @debug = false - @verbose = true - - @debug_display_process_id = false - @debug_display_thread_id = true - @debug_output_mutex = Mutex.new - - class << Shell - extend Forwardable - - attr_accessor :cascade, :debug, :verbose - -# alias cascade? cascade - alias debug? debug - alias verbose? verbose - @verbose = true - - def debug=(val) - @debug = val - @verbose = val if val - end - - def cd(path) - new(path) - end - - def default_system_path - if @default_system_path - @default_system_path - else - ENV["PATH"].split(":") - end - end - - def default_system_path=(path) - @default_system_path = path - end - - def default_record_separator - if @default_record_separator - @default_record_separator - else - $/ - end - end - - def default_record_separator=(rs) - @default_record_separator = rs - end - - # os resource mutex - mutex_methods = ["unlock", "lock", "locked?", "synchronize", "try_lock", "exclusive_unlock"] - for m in mutex_methods - def_delegator("@debug_output_mutex", m, "debug_output_"+m.to_s) - end - - end - - def initialize(pwd = Dir.pwd, umask = nil) - @cwd = File.expand_path(pwd) - @dir_stack = [] - @umask = umask - - @system_path = Shell.default_system_path - @record_separator = Shell.default_record_separator - - @command_processor = CommandProcessor.new(self) - @process_controller = ProcessController.new(self) - - @verbose = Shell.verbose - @debug = Shell.debug - end - - attr_reader :system_path - - def system_path=(path) - @system_path = path - rehash - end - - attr_accessor :umask, :record_separator - attr_accessor :verbose, :debug - - def debug=(val) - @debug = val - @verbose = val if val - end - - alias verbose? verbose - alias debug? debug - - attr_reader :command_processor - attr_reader :process_controller - - def expand_path(path) - File.expand_path(path, @cwd) - end - - # Most Shell commands are defined via CommandProcessor - - # - # Dir related methods - # - # Shell#cwd/dir/getwd/pwd - # Shell#chdir/cd - # Shell#pushdir/pushd - # Shell#popdir/popd - # Shell#mkdir - # Shell#rmdir - - attr_reader :cwd - alias dir cwd - alias getwd cwd - alias pwd cwd - - attr_reader :dir_stack - alias dirs dir_stack - - # If called as iterator, it restores the current directory when the - # block ends. - def chdir(path = nil, verbose = @verbose) - check_point - - if iterator? - notify("chdir(with block) #{path}") if verbose - cwd_old = @cwd - begin - chdir(path, nil) - yield - ensure - chdir(cwd_old, nil) - end - else - notify("chdir #{path}") if verbose - path = "~" unless path - @cwd = expand_path(path) - notify "current dir: #{@cwd}" - rehash - Void.new(self) - end - end - alias cd chdir - - def pushdir(path = nil, verbose = @verbose) - check_point - - if iterator? - notify("pushdir(with block) #{path}") if verbose - pushdir(path, nil) - begin - yield - ensure - popdir - end - elsif path - notify("pushdir #{path}") if verbose - @dir_stack.push @cwd - chdir(path, nil) - notify "dir stack: [#{@dir_stack.join ', '}]" - self - else - notify("pushdir") if verbose - if pop = @dir_stack.pop - @dir_stack.push @cwd - chdir pop - notify "dir stack: [#{@dir_stack.join ', '}]" - self - else - Shell.Fail DirStackEmpty - end - end - Void.new(self) - end - alias pushd pushdir - - def popdir - check_point - - notify("popdir") - if pop = @dir_stack.pop - chdir pop - notify "dir stack: [#{@dir_stack.join ', '}]" - self - else - Shell.Fail DirStackEmpty - end - Void.new(self) - end - alias popd popdir - - # - # process management - # - def jobs - @process_controller.jobs - end - - def kill(sig, command) - @process_controller.kill_job(sig, command) - end - - # - # command definitions - # - def Shell.def_system_command(command, path = command) - CommandProcessor.def_system_command(command, path) - end - - def Shell.undef_system_command(command) - CommandProcessor.undef_system_command(command) - end - - def Shell.alias_command(ali, command, *opts, &block) - CommandProcessor.alias_command(ali, command, *opts, &block) - end - - def Shell.unalias_command(ali) - CommandProcessor.unalias_command(ali) - end - - def Shell.install_system_commands(pre = "sys_") - CommandProcessor.install_system_commands(pre) - end - - # - def inspect - if debug.kind_of?(Integer) && debug > 2 - super - else - to_s - end - end - - def self.notify(*opts, &block) - Shell::debug_output_synchronize do - if opts[-1].kind_of?(String) - yorn = verbose? - else - yorn = opts.pop - end - return unless yorn - - if @debug_display_thread_id - if @debug_display_process_id - prefix = "shell(##{Process.pid}:#{Thread.current.to_s.sub("Thread", "Th")}): " - else - prefix = "shell(#{Thread.current.to_s.sub("Thread", "Th")}): " - end - else - prefix = "shell: " - end - _head = true - STDERR.print opts.collect{|mes| - mes = mes.dup - yield mes if iterator? - if _head - _head = false -# "shell" " + mes - prefix + mes - else - " "* prefix.size + mes - end - }.join("\n")+"\n" - end - end - - CommandProcessor.initialize - CommandProcessor.run_config -end diff --git a/Src/StdLib/ruby/1.9.1/shell/builtin-command.rb b/Src/StdLib/ruby/1.9.1/shell/builtin-command.rb deleted file mode 100644 index 563e4241a..000000000 --- a/Src/StdLib/ruby/1.9.1/shell/builtin-command.rb +++ /dev/null @@ -1,160 +0,0 @@ -# -# shell/builtin-command.rb - -# $Release Version: 0.7 $ -# $Revision: 25189 $ -# by Keiju ISHITSUKA(keiju@ruby-lang.org) -# -# -- -# -# -# - -require "shell/filter" - -class Shell - class BuiltInCommand - # - def expand_path(path) - @shell.expand_path(path) - end - - # - # File related commands - # Shell#foreach - # Shell#open - # Shell#unlink - # Shell#test - # - # - - # - # CommandProcessor#foreach(path, rs) - # path: String - # rs: String - record separator - # iterator - # Same as: - # File#foreach (when path is file) - # Dir#foreach (when path is directory) - # path is relative to pwd - # - def foreach(path = nil, *rs) - path = "." unless path - path = expand_path(path) - - if File.directory?(path) - Dir.foreach(path){|fn| yield fn} - else - IO.foreach(path, *rs){|l| yield l} - end - end - - # - # CommandProcessor#open(path, mode) - # path: String - # mode: String - # return: File or Dir - # Same as: - # File#open (when path is file) - # Dir#open (when path is directory) - # mode has an effect only when path is a file - # - def open(path, mode = nil, perm = 0666, &b) - path = expand_path(path) - if File.directory?(path) - Dir.open(path, &b) - else - if @shell.umask - f = File.open(path, mode, perm) - File.chmod(perm & ~@shell.umask, path) - if block_given? - f.each(&b) - end - f - else - f = File.open(path, mode, perm, &b) - end - end - end - # public :open - - # - # CommandProcessor#unlink(path) - # same as: - # Dir#unlink (when path is directory) - # File#unlink (when path is file) - # - def unlink(path) - @shell.check_point - - path = expand_path(path) - if File.directory?(path) - Dir.unlink(path) - else - IO.unlink(path) - end - Void.new(@shell) - end - - # - # CommandProcessor#test(command, file1, file2) - # CommandProcessor#[command, file1, file2] - # command: char or String or Symbol - # file1: String - # file2: String(optional) - # return: Boolean - # same as: - # test() (when command is char or length 1 string or symbol) - # FileTest.command (others) - # example: - # sh[?e, "foo"] - # sh[:e, "foo"] - # sh["e", "foo"] - # sh[:exists?, "foo"] - # sh["exists?", "foo"] - # - alias top_level_test test - def test(command, file1, file2=nil) - file1 = expand_path(file1) - file2 = expand_path(file2) if file2 - command = command.id2name if command.kind_of?(Symbol) - - case command - when Integer - if file2 - top_level_test(command, file1, file2) - else - top_level_test(command, file1) - end - when String - if command.size == 1 - if file2 - top_level_test(command, file1, file2) - else - top_level_test(command, file1) - end - else - if file2 - FileTest.send(command, file1, file2) - else - FileTest.send(command, file1) - end - end - end - end - alias [] test - - # - # Dir related methods - # - # Shell#mkdir - # Shell#rmdir - # - #-- - # - # CommandProcessor#mkdir(*path) - # path: String - # same as Dir.mkdir() - # - def mkdir(*path) - @shell.check_point - notify("mkdir #{path.join(' ')}") - - perm = nil - if path.last.kind_of?(Integer) - perm = path.pop - end - for dir in path - d = expand_path(dir) - if perm - Dir.mkdir(d, perm) - else - Dir.mkdir(d) - end - File.chmod(d, 0666 & ~@shell.umask) if @shell.umask - end - Void.new(@shell) - end - - # - # CommandProcessor#rmdir(*path) - # path: String - # same as Dir.rmdir() - # - def rmdir(*path) - @shell.check_point - notify("rmdir #{path.join(' ')}") - - for dir in path - Dir.rmdir(expand_path(dir)) - end - Void.new(@shell) - end - - # - # CommandProcessor#system(command, *opts) - # command: String - # opts: String - # return: SystemCommand - # Same as system() function - # example: - # print sh.system("ls", "-l") - # sh.system("ls", "-l") | sh.head > STDOUT - # - def system(command, *opts) - if opts.empty? - if command =~ /\*|\?|\{|\}|\[|\]|<|>|\(|\)|~|&|\||\\|\$|;|'|`|"|\n/ - return SystemCommand.new(@shell, find_system_command("sh"), "-c", command) - else - command, *opts = command.split(/\s+/) - end - end - SystemCommand.new(@shell, find_system_command(command), *opts) - end - - # - # ProcessCommand#rehash - # clear command hash table. - # - def rehash - @system_commands = {} - end - - # - # ProcessCommand#transact - # - def check_point - @shell.process_controller.wait_all_jobs_execution - end - alias finish_all_jobs check_point - - def transact(&block) - begin - @shell.instance_eval(&block) - ensure - check_point - end - end - - # - # internal commands - # - def out(dev = STDOUT, &block) - dev.print transact(&block) - end - - def echo(*strings) - Echo.new(@shell, *strings) - end - - def cat(*filenames) - Cat.new(@shell, *filenames) - end - - # def sort(*filenames) - # Sort.new(self, *filenames) - # end - - def glob(pattern) - Glob.new(@shell, pattern) - end - - def append(to, filter) - case to - when String - AppendFile.new(@shell, to, filter) - when IO - AppendIO.new(@shell, to, filter) - else - Shell.Fail Error::CantApplyMethod, "append", to.class - end - end - - def tee(file) - Tee.new(@shell, file) - end - - def concat(*jobs) - Concat.new(@shell, *jobs) - end - - # %pwd, %cwd -> @pwd - def notify(*opts, &block) - Shell.notify(*opts) {|mes| - yield mes if iterator? - - mes.gsub!("%pwd", "#{@cwd}") - mes.gsub!("%cwd", "#{@cwd}") - } - end - - # - # private functions - # - def find_system_command(command) - return command if /^\// =~ command - case path = @system_commands[command] - when String - if exists?(path) - return path - else - Shell.Fail Error::CommandNotFound, command - end - when false - Shell.Fail Error::CommandNotFound, command - end - - for p in @shell.system_path - path = join(p, command) - if FileTest.exist?(path) - @system_commands[command] = path - return path - end - end - @system_commands[command] = false - Shell.Fail Error::CommandNotFound, command - end - - # - # CommandProcessor.def_system_command(command, path) - # command: String - # path: String - # define 'command()' method as method. - # - def self.def_system_command(command, path = command) - begin - eval((d = %Q[def #{command}(*opts) - SystemCommand.new(@shell, '#{path}', *opts) - end]), nil, __FILE__, __LINE__ - 1) - rescue SyntaxError - Shell.notify "warn: Can't define #{command} path: #{path}." - end - Shell.notify "Define #{command} path: #{path}.", Shell.debug? - Shell.notify("Definition of #{command}: ", d, - Shell.debug.kind_of?(Integer) && Shell.debug > 1) - end - - def self.undef_system_command(command) - command = command.id2name if command.kind_of?(Symbol) - remove_method(command) - Shell.module_eval{remove_method(command)} - Filter.module_eval{remove_method(command)} - self - end - - # define command alias - # ex) - # def_alias_command("ls_c", "ls", "-C", "-F") - # def_alias_command("ls_c", "ls"){|*opts| ["-C", "-F", *opts]} - # - @alias_map = {} - def self.alias_map - @alias_map - end - def self.alias_command(ali, command, *opts, &block) - ali = ali.id2name if ali.kind_of?(Symbol) - command = command.id2name if command.kind_of?(Symbol) - begin - if iterator? - @alias_map[ali.intern] = proc - - eval((d = %Q[def #{ali}(*opts) - @shell.__send__(:#{command}, - *(CommandProcessor.alias_map[:#{ali}].call *opts)) - end]), nil, __FILE__, __LINE__ - 1) - - else - args = opts.collect{|opt| '"' + opt + '"'}.join(",") - eval((d = %Q[def #{ali}(*opts) - @shell.__send__(:#{command}, #{args}, *opts) - end]), nil, __FILE__, __LINE__ - 1) - end - rescue SyntaxError - Shell.notify "warn: Can't alias #{ali} command: #{command}." - Shell.notify("Definition of #{ali}: ", d) - raise - end - Shell.notify "Define #{ali} command: #{command}.", Shell.debug? - Shell.notify("Definition of #{ali}: ", d, - Shell.debug.kind_of?(Integer) && Shell.debug > 1) - self - end - - def self.unalias_command(ali) - ali = ali.id2name if ali.kind_of?(Symbol) - @alias_map.delete ali.intern - undef_system_command(ali) - end - - # - # CommandProcessor.def_builtin_commands(delegation_class, command_specs) - # delegation_class: Class or Module - # command_specs: [[command_name, [argument,...]],...] - # command_name: String - # arguments: String - # FILENAME?? -> expand_path(filename??) - # *FILENAME?? -> filename??.collect{|f|expand_path(f)}.join(", ") - # define command_name(argument,...) as - # delegation_class.command_name(argument,...) - # - def self.def_builtin_commands(delegation_class, command_specs) - for meth, args in command_specs - arg_str = args.collect{|arg| arg.downcase}.join(", ") - call_arg_str = args.collect{ - |arg| - case arg - when /^(FILENAME.*)$/ - format("expand_path(%s)", $1.downcase) - when /^(\*FILENAME.*)$/ - # \*FILENAME* -> filenames.collect{|fn| expand_path(fn)}.join(", ") - $1.downcase + '.collect{|fn| expand_path(fn)}' - else - arg - end - }.join(", ") - d = %Q[def #{meth}(#{arg_str}) - #{delegation_class}.#{meth}(#{call_arg_str}) - end] - Shell.notify "Define #{meth}(#{arg_str})", Shell.debug? - Shell.notify("Definition of #{meth}: ", d, - Shell.debug.kind_of?(Integer) && Shell.debug > 1) - eval d - end - end - - # - # CommandProcessor.install_system_commands(pre) - # pre: String - command name prefix - # defines every command which belongs in default_system_path via - # CommandProcessor.command(). It doesn't define already defined - # methods twice. By default, "pre_" is prefixes to each method - # name. Characters that may not be used in a method name are - # all converted to '_'. Definition errors are just ignored. - # - def self.install_system_commands(pre = "sys_") - defined_meth = {} - for m in Shell.methods - defined_meth[m] = true - end - sh = Shell.new - for path in Shell.default_system_path - next unless sh.directory? path - sh.cd path - sh.foreach do - |cn| - if !defined_meth[pre + cn] && sh.file?(cn) && sh.executable?(cn) - command = (pre + cn).gsub(/\W/, "_").sub(/^([0-9])/, '_\1') - begin - def_system_command(command, sh.expand_path(cn)) - rescue - Shell.notify "warn: Can't define #{command} path: #{cn}" - end - defined_meth[command] = command - end - end - end - end - - #---------------------------------------------------------------------- - # - # class initializing methods - - # - #---------------------------------------------------------------------- - def self.add_delegate_command_to_shell(id) - id = id.intern if id.kind_of?(String) - name = id.id2name - if Shell.method_defined?(id) - Shell.notify "warn: override definition of Shell##{name}." - Shell.notify "warn: alias Shell##{name} to Shell##{name}_org.\n" - Shell.module_eval "alias #{name}_org #{name}" - end - Shell.notify "method added: Shell##{name}.", Shell.debug? - Shell.module_eval(%Q[def #{name}(*args, &block) - begin - @command_processor.__send__(:#{name}, *args, &block) - rescue Exception - $@.delete_if{|s| /:in `__getobj__'$/ =~ s} #` - $@.delete_if{|s| /^\\(eval\\):/ =~ s} - raise - end - end], __FILE__, __LINE__) - - if Shell::Filter.method_defined?(id) - Shell.notify "warn: override definition of Shell::Filter##{name}." - Shell.notify "warn: alias Shell##{name} to Shell::Filter##{name}_org." - Filter.module_eval "alias #{name}_org #{name}" - end - Shell.notify "method added: Shell::Filter##{name}.", Shell.debug? - Filter.module_eval(%Q[def #{name}(*args, &block) - begin - self | @shell.__send__(:#{name}, *args, &block) - rescue Exception - $@.delete_if{|s| /:in `__getobj__'$/ =~ s} #` - $@.delete_if{|s| /^\\(eval\\):/ =~ s} - raise - end - end], __FILE__, __LINE__) - end - - # - # define default builtin commands - # - def self.install_builtin_commands - # method related File. - # (exclude open/foreach/unlink) - normal_delegation_file_methods = [ - ["atime", ["FILENAME"]], - ["basename", ["fn", "*opts"]], - ["chmod", ["mode", "*FILENAMES"]], - ["chown", ["owner", "group", "*FILENAME"]], - ["ctime", ["FILENAMES"]], - ["delete", ["*FILENAMES"]], - ["dirname", ["FILENAME"]], - ["ftype", ["FILENAME"]], - ["join", ["*items"]], - ["link", ["FILENAME_O", "FILENAME_N"]], - ["lstat", ["FILENAME"]], - ["mtime", ["FILENAME"]], - ["readlink", ["FILENAME"]], - ["rename", ["FILENAME_FROM", "FILENAME_TO"]], - # ["size", ["FILENAME"]], - ["split", ["pathname"]], - ["stat", ["FILENAME"]], - ["symlink", ["FILENAME_O", "FILENAME_N"]], - ["truncate", ["FILENAME", "length"]], - ["utime", ["atime", "mtime", "*FILENAMES"]]] - - def_builtin_commands(File, normal_delegation_file_methods) - alias_method :rm, :delete - - # method related FileTest - def_builtin_commands(FileTest, - FileTest.singleton_methods(false).collect{|m| [m, ["FILENAME"]]}) - - end - - end -end diff --git a/Src/StdLib/ruby/1.9.1/shell/error.rb b/Src/StdLib/ruby/1.9.1/shell/error.rb deleted file mode 100644 index d2e858df8..000000000 --- a/Src/StdLib/ruby/1.9.1/shell/error.rb +++ /dev/null @@ -1,25 +0,0 @@ -# -# shell/error.rb - -# $Release Version: 0.7 $ -# $Revision: 25189 $ -# by Keiju ISHITSUKA(keiju@ruby-lang.org) -# -# -- -# -# -# - -require "e2mmap" - -class Shell - module Error - extend Exception2MessageMapper - def_e2message TypeError, "wrong argument type %s (expected %s)" - - def_exception :DirStackEmpty, "Directory stack empty." - def_exception :CantDefine, "Can't define method(%s, %s)." - def_exception :CantApplyMethod, "This method(%s) does not apply to this type(%s)." - def_exception :CommandNotFound, "Command not found(%s)." - end -end - diff --git a/Src/StdLib/ruby/1.9.1/shell/filter.rb b/Src/StdLib/ruby/1.9.1/shell/filter.rb deleted file mode 100644 index 7438a7545..000000000 --- a/Src/StdLib/ruby/1.9.1/shell/filter.rb +++ /dev/null @@ -1,109 +0,0 @@ -# -# shell/filter.rb - -# $Release Version: 0.7 $ -# $Revision: 25189 $ -# by Keiju ISHITSUKA(keiju@ruby-lang.org) -# -# -- -# -# -# - -class Shell - # - # Filter - # A method to require - # each() - # - class Filter - include Enumerable - - def initialize(sh) - @shell = sh # parent shell - @input = nil # input filter - end - - attr_reader :input - - def input=(filter) - @input = filter - end - - def each(rs = nil) - rs = @shell.record_separator unless rs - if @input - @input.each(rs){|l| yield l} - end - end - - def < (src) - case src - when String - cat = Cat.new(@shell, src) - cat | self - when IO - self.input = src - self - else - Shell.Fail Error::CantApplyMethod, "<", to.class - end - end - - def > (to) - case to - when String - dst = @shell.open(to, "w") - begin - each(){|l| dst << l} - ensure - dst.close - end - when IO - each(){|l| to << l} - else - Shell.Fail Error::CantApplyMethod, ">", to.class - end - self - end - - def >> (to) - begin - Shell.cd(@shell.pwd).append(to, self) - rescue CantApplyMethod - Shell.Fail Error::CantApplyMethod, ">>", to.class - end - end - - def | (filter) - filter.input = self - if active? - @shell.process_controller.start_job filter - end - filter - end - - def + (filter) - Join.new(@shell, self, filter) - end - - def to_a - ary = [] - each(){|l| ary.push l} - ary - end - - def to_s - str = "" - each(){|l| str.concat l} - str - end - - def inspect - if @shell.debug.kind_of?(Integer) && @shell.debug > 2 - super - else - to_s - end - end - end -end diff --git a/Src/StdLib/ruby/1.9.1/shell/process-controller.rb b/Src/StdLib/ruby/1.9.1/shell/process-controller.rb deleted file mode 100644 index 5cb711646..000000000 --- a/Src/StdLib/ruby/1.9.1/shell/process-controller.rb +++ /dev/null @@ -1,319 +0,0 @@ -# -# shell/process-controller.rb - -# $Release Version: 0.7 $ -# $Revision: 27967 $ -# by Keiju ISHITSUKA(keiju@ruby-lang.org) -# -# -- -# -# -# -require "forwardable" - -require "thread" -require "sync" - -class Shell - class ProcessController - - @ProcessControllers = {} - @ProcessControllersMonitor = Mutex.new - @ProcessControllersCV = ConditionVariable.new - - @BlockOutputMonitor = Mutex.new - @BlockOutputCV = ConditionVariable.new - - class << self - extend Forwardable - - def_delegator("@ProcessControllersMonitor", - "synchronize", "process_controllers_exclusive") - - def active_process_controllers - process_controllers_exclusive do - @ProcessControllers.dup - end - end - - def activate(pc) - process_controllers_exclusive do - @ProcessControllers[pc] ||= 0 - @ProcessControllers[pc] += 1 - end - end - - def inactivate(pc) - process_controllers_exclusive do - if @ProcessControllers[pc] - if (@ProcessControllers[pc] -= 1) == 0 - @ProcessControllers.delete(pc) - @ProcessControllersCV.signal - end - end - end - end - - def each_active_object - process_controllers_exclusive do - for ref in @ProcessControllers.keys - yield ref - end - end - end - - def block_output_synchronize(&b) - @BlockOutputMonitor.synchronize(&b) - end - - def wait_to_finish_all_process_controllers - process_controllers_exclusive do - while !@ProcessControllers.empty? - Shell::notify("Process finishing, but active shell exists", - "You can use Shell#transact or Shell#check_point for more safe execution.") - if Shell.debug? - for pc in @ProcessControllers.keys - Shell::notify(" Not finished jobs in "+pc.shell.to_s) - for com in pc.jobs - com.notify(" Jobs: %id") - end - end - end - @ProcessControllersCV.wait(@ProcessControllersMonitor) - end - end - end - end - - # for shell-command complete finish at this process exit. - USING_AT_EXIT_WHEN_PROCESS_EXIT = true - at_exit do - wait_to_finish_all_process_controllers unless $@ - end - - def initialize(shell) - @shell = shell - @waiting_jobs = [] - @active_jobs = [] - @jobs_sync = Sync.new - - @job_monitor = Mutex.new - @job_condition = ConditionVariable.new - end - - attr_reader :shell - - def jobs - jobs = [] - @jobs_sync.synchronize(:SH) do - jobs.concat @waiting_jobs - jobs.concat @active_jobs - end - jobs - end - - def active_jobs - @active_jobs - end - - def waiting_jobs - @waiting_jobs - end - - def jobs_exist? - @jobs_sync.synchronize(:SH) do - @active_jobs.empty? or @waiting_jobs.empty? - end - end - - def active_jobs_exist? - @jobs_sync.synchronize(:SH) do - @active_jobs.empty? - end - end - - def waiting_jobs_exist? - @jobs_sync.synchronize(:SH) do - @waiting_jobs.empty? - end - end - - # schedule a command - def add_schedule(command) - @jobs_sync.synchronize(:EX) do - ProcessController.activate(self) - if @active_jobs.empty? - start_job command - else - @waiting_jobs.push(command) - end - end - end - - # start a job - def start_job(command = nil) - @jobs_sync.synchronize(:EX) do - if command - return if command.active? - @waiting_jobs.delete command - else - command = @waiting_jobs.shift -# command.notify "job(%id) pre-start.", @shell.debug? - - return unless command - end - @active_jobs.push command - command.start -# command.notify "job(%id) post-start.", @shell.debug? - - # start all jobs that input from the job - for job in @waiting_jobs.dup - start_job(job) if job.input == command - end -# command.notify "job(%id) post2-start.", @shell.debug? - end - end - - def waiting_job?(job) - @jobs_sync.synchronize(:SH) do - @waiting_jobs.include?(job) - end - end - - def active_job?(job) - @jobs_sync.synchronize(:SH) do - @active_jobs.include?(job) - end - end - - # terminate a job - def terminate_job(command) - @jobs_sync.synchronize(:EX) do - @active_jobs.delete command - ProcessController.inactivate(self) - if @active_jobs.empty? - command.notify("start_job in terminate_job(%id)", Shell::debug?) - start_job - end - end - end - - # kill a job - def kill_job(sig, command) - @jobs_sync.synchronize(:EX) do - if @waiting_jobs.delete command - ProcessController.inactivate(self) - return - elsif @active_jobs.include?(command) - begin - r = command.kill(sig) - ProcessController.inactivate(self) - rescue - print "Shell: Warn: $!\n" if @shell.verbose? - return nil - end - @active_jobs.delete command - r - end - end - end - - # wait for all jobs to terminate - def wait_all_jobs_execution - @job_monitor.synchronize do - begin - while !jobs.empty? - @job_condition.wait(@job_monitor) - for job in jobs - job.notify("waiting job(%id)", Shell::debug?) - end - end - ensure - redo unless jobs.empty? - end - end - end - - # simple fork - def sfork(command, &block) - pipe_me_in, pipe_peer_out = IO.pipe - pipe_peer_in, pipe_me_out = IO.pipe - - - pid = nil - pid_mutex = Mutex.new - pid_cv = ConditionVariable.new - - Thread.start do - ProcessController.block_output_synchronize do - STDOUT.flush - ProcessController.each_active_object do |pc| - for jobs in pc.active_jobs - jobs.flush - end - end - - pid = fork { - Thread.list.each do |th| -# th.kill unless [Thread.main, Thread.current].include?(th) - th.kill unless Thread.current == th - end - - STDIN.reopen(pipe_peer_in) - STDOUT.reopen(pipe_peer_out) - - ObjectSpace.each_object(IO) do |io| - if ![STDIN, STDOUT, STDERR].include?(io) - io.close unless io.closed? - end - end - - yield - } - end - pid_cv.signal - - pipe_peer_in.close - pipe_peer_out.close - command.notify "job(%name:##{pid}) start", @shell.debug? - - begin - _pid = nil - command.notify("job(%id) start to waiting finish.", @shell.debug?) - _pid = Process.waitpid(pid, nil) - rescue Errno::ECHILD - command.notify "warn: job(%id) was done already waitpid." - _pid = true - # rescue - # STDERR.puts $! - ensure - command.notify("Job(%id): Wait to finish when Process finished.", @shell.debug?) - # when the process ends, wait until the command terminates - if USING_AT_EXIT_WHEN_PROCESS_EXIT or _pid - else - command.notify("notice: Process finishing...", - "wait for Job[%id] to finish.", - "You can use Shell#transact or Shell#check_point for more safe execution.") - redo - end - -# command.notify "job(%id) pre-pre-finish.", @shell.debug? - @job_monitor.synchronize do -# command.notify "job(%id) pre-finish.", @shell.debug? - terminate_job(command) -# command.notify "job(%id) pre-finish2.", @shell.debug? - @job_condition.signal - command.notify "job(%id) finish.", @shell.debug? - end - end - end - - pid_mutex.synchronize do - while !pid - pid_cv.wait(pid_mutex) - end - end - - return pid, pipe_me_in, pipe_me_out - end - end -end diff --git a/Src/StdLib/ruby/1.9.1/shell/system-command.rb b/Src/StdLib/ruby/1.9.1/shell/system-command.rb deleted file mode 100644 index 6b1f3d870..000000000 --- a/Src/StdLib/ruby/1.9.1/shell/system-command.rb +++ /dev/null @@ -1,159 +0,0 @@ -# -# shell/system-command.rb - -# $Release Version: 0.7 $ -# $Revision: 25189 $ -# by Keiju ISHITSUKA(keiju@ruby-lang.org) -# -# -- -# -# -# - -require "shell/filter" - -class Shell - class SystemCommand < Filter - def initialize(sh, command, *opts) - if t = opts.find{|opt| !opt.kind_of?(String) && opt.class} - Shell.Fail Error::TypeError, t.class, "String" - end - super(sh) - @command = command - @opts = opts - - @input_queue = Queue.new - @pid = nil - - sh.process_controller.add_schedule(self) - end - - attr_reader :command - alias name command - - def wait? - @shell.process_controller.waiting_job?(self) - end - - def active? - @shell.process_controller.active_job?(self) - end - - def input=(inp) - super - if active? - start_export - end - end - - def start - notify([@command, *@opts].join(" ")) - - @pid, @pipe_in, @pipe_out = @shell.process_controller.sfork(self) { - Dir.chdir @shell.pwd - $0 = @command - exec(@command, *@opts) - } - if @input - start_export - end - start_import - end - - def flush - @pipe_out.flush if @pipe_out and !@pipe_out.closed? - end - - def terminate - begin - @pipe_in.close - rescue IOError - end - begin - @pipe_out.close - rescue IOError - end - end - - def kill(sig) - if @pid - Process.kill(sig, @pid) - end - end - - def start_import - notify "Job(%id) start imp-pipe.", @shell.debug? - rs = @shell.record_separator unless rs - _eop = true - th = Thread.start { - begin - while l = @pipe_in.gets - @input_queue.push l - end - _eop = false - rescue Errno::EPIPE - _eop = false - ensure - if !ProcessController::USING_AT_EXIT_WHEN_PROCESS_EXIT and _eop - notify("warn: Process finishing...", - "wait for Job[%id] to finish pipe importing.", - "You can use Shell#transact or Shell#check_point for more safe execution.") - redo - end - notify "job(%id}) close imp-pipe.", @shell.debug? - @input_queue.push :EOF - @pipe_in.close - end - } - end - - def start_export - notify "job(%id) start exp-pipe.", @shell.debug? - _eop = true - th = Thread.start{ - begin - @input.each do |l| - ProcessController::block_output_synchronize do - @pipe_out.print l - end - end - _eop = false - rescue Errno::EPIPE, Errno::EIO - _eop = false - ensure - if !ProcessController::USING_AT_EXIT_WHEN_PROCESS_EXIT and _eop - notify("shell: warn: Process finishing...", - "wait for Job(%id) to finish pipe exporting.", - "You can use Shell#transact or Shell#check_point for more safe execution.") - redo - end - notify "job(%id) close exp-pipe.", @shell.debug? - @pipe_out.close - end - } - end - - alias super_each each - def each(rs = nil) - while (l = @input_queue.pop) != :EOF - yield l - end - end - - # ex) - # if you wish to output: - # "shell: job(#{@command}:#{@pid}) close pipe-out." - # then - # mes: "job(%id) close pipe-out." - # yorn: Boolean(@shell.debug? or @shell.verbose?) - def notify(*opts, &block) - @shell.notify(*opts) do |mes| - yield mes if iterator? - - mes.gsub!("%id", "#{@command}:##{@pid}") - mes.gsub!("%name", "#{@command}") - mes.gsub!("%pid", "#{@pid}") - mes - end - end - end -end diff --git a/Src/StdLib/ruby/1.9.1/shell/version.rb b/Src/StdLib/ruby/1.9.1/shell/version.rb deleted file mode 100644 index c597d7afd..000000000 --- a/Src/StdLib/ruby/1.9.1/shell/version.rb +++ /dev/null @@ -1,15 +0,0 @@ -# -# version.rb - shell version definition file -# $Release Version: 0.7$ -# $Revision: 25189 $ -# by Keiju ISHITSUKA(keiju@ruby-lang.org) -# -# -- -# -# -# - -class Shell - @RELEASE_VERSION = "0.7" - @LAST_UPDATE_DATE = "07/03/20" -end diff --git a/Src/StdLib/ruby/1.9.1/syck.rb b/Src/StdLib/ruby/1.9.1/syck.rb deleted file mode 100644 index a207cf696..000000000 --- a/Src/StdLib/ruby/1.9.1/syck.rb +++ /dev/null @@ -1,447 +0,0 @@ -# -*- mode: ruby; ruby-indent-level: 4; tab-width: 4 -*- vim: sw=4 ts=4 -# $Id: syck.rb 27334 2010-04-14 02:37:54Z nobu $ -# -# = yaml.rb: top-level module with methods for loading and parsing YAML documents -# -# Author:: why the lucky stiff -# - -require 'yaml/syck' - -# == YAML -# -# YAML(tm) (rhymes with 'camel') is a -# straightforward machine parsable data serialization format designed for -# human readability and interaction with scripting languages such as Perl -# and Python. YAML is optimized for data serialization, formatted -# dumping, configuration files, log files, Internet messaging and -# filtering. This specification describes the YAML information model and -# serialization format. Together with the Unicode standard for characters, it -# provides all the information necessary to understand YAML Version 1.0 -# and construct computer programs to process it. -# -# See http://yaml.org/ for more information. For a quick tutorial, please -# visit YAML In Five Minutes (http://yaml.kwiki.org/?YamlInFiveMinutes). -# -# == About This Library -# -# The YAML 1.0 specification outlines four stages of YAML loading and dumping. -# This library honors all four of those stages, although data is really only -# available to you in three stages. -# -# The four stages are: native, representation, serialization, and presentation. -# -# The native stage refers to data which has been loaded completely into Ruby's -# own types. (See +YAML::load+.) -# -# The representation stage means data which has been composed into -# +YAML::BaseNode+ objects. In this stage, the document is available as a -# tree of node objects. You can perform YPath queries and transformations -# at this level. (See +YAML::parse+.) -# -# The serialization stage happens inside the parser. The YAML parser used in -# Ruby is called Syck. Serialized nodes are available in the extension as -# SyckNode structs. -# -# The presentation stage is the YAML document itself. This is accessible -# to you as a string. (See +YAML::dump+.) -# -# For more information about the various information models, see Chapter -# 3 of the YAML 1.0 Specification (http://yaml.org/spec/#id2491269). -# -# The YAML module provides quick access to the most common loading (YAML::load) -# and dumping (YAML::dump) tasks. This module also provides an API for registering -# global types (YAML::add_domain_type). -# -# == Example -# -# A simple round-trip (load and dump) of an object. -# -# require "yaml" -# -# test_obj = ["dogs", "cats", "badgers"] -# -# yaml_obj = YAML::dump( test_obj ) -# # -> --- -# - dogs -# - cats -# - badgers -# ruby_obj = YAML::load( yaml_obj ) -# # => ["dogs", "cats", "badgers"] -# ruby_obj == test_obj -# # => true -# -# To register your custom types with the global resolver, use +add_domain_type+. -# -# YAML::add_domain_type( "your-site.com,2004", "widget" ) do |type, val| -# Widget.new( val ) -# end -# -module Syck - - DefaultResolver.use_types_at( @@tagged_classes ) - - # Returns a new default parser - def self.parser; Parser.new.set_resolver( self.resolver ); end - - # Returns a new generic parser - def self.generic_parser - warn "#{caller[0]}: YAML.generic_parser is deprecated, switch to psych" if $VERBOSE && !caller[0].start_with?(File.dirname(__FILE__)) - Parser.new.set_resolver( GenericResolver ) - end - - # Returns the default resolver - def self.resolver - warn "#{caller[0]}: YAML.resolver is deprecated" if $VERBOSE && !caller[0].start_with?(File.dirname(__FILE__)) - DefaultResolver - end - - # Returns a new default emitter - def self.emitter - warn "#{caller[0]}: YAML.emitter is deprecated" if $VERBOSE && !caller[0].start_with?(File.dirname(__FILE__)) - Emitter.new.set_resolver( self.resolver ) - end - - # - # Converts _obj_ to YAML and writes the YAML result to _io_. - # - # File.open( 'animals.yaml', 'w' ) do |out| - # YAML.dump( ['badger', 'elephant', 'tiger'], out ) - # end - # - # If no _io_ is provided, a string containing the dumped YAML - # is returned. - # - # YAML.dump( :locked ) - # #=> "--- :locked" - # - def self.dump( obj, io = nil ) - obj.to_yaml( io || io2 = StringIO.new ) - io || ( io2.rewind; io2.read ) - end - - # - # Load a document from the current _io_ stream. - # - # File.open( 'animals.yaml' ) { |yf| YAML::load( yf ) } - # #=> ['badger', 'elephant', 'tiger'] - # - # Can also load from a string. - # - # YAML.load( "--- :locked" ) - # #=> :locked - # - def self.load( io ) - yp = parser.load( io ) - end - - # - # Load a document from the file located at _filepath_. - # - # YAML.load_file( 'animals.yaml' ) - # #=> ['badger', 'elephant', 'tiger'] - # - def self.load_file( filepath ) - File.open( filepath ) do |f| - load( f ) - end - end - - # - # Parse the first document from the current _io_ stream - # - # File.open( 'animals.yaml' ) { |yf| YAML::load( yf ) } - # #=> #, - # #, - # #]> - # - # Can also load from a string. - # - # YAML.parse( "--- :locked" ) - # #=> # - # - def self.parse( io ) - yp = generic_parser.load( io ) - end - - # - # Parse a document from the file located at _filepath_. - # - # YAML.parse_file( 'animals.yaml' ) - # #=> #, - # #, - # #]> - # - def self.parse_file( filepath ) - File.open( filepath ) do |f| - parse( f ) - end - end - - # - # Calls _block_ with each consecutive document in the YAML - # stream contained in _io_. - # - # File.open( 'many-docs.yaml' ) do |yf| - # YAML.each_document( yf ) do |ydoc| - # ## ydoc contains the single object - # ## from the YAML document - # end - # end - # - def self.each_document( io, &block ) - warn "#{caller[0]}: YAML.each_document is deprecated" if $VERBOSE && !caller[0].start_with?(File.dirname(__FILE__)) - yp = parser.load_documents( io, &block ) - end - - # - # Calls _block_ with each consecutive document in the YAML - # stream contained in _io_. - # - # File.open( 'many-docs.yaml' ) do |yf| - # YAML.load_documents( yf ) do |ydoc| - # ## ydoc contains the single object - # ## from the YAML document - # end - # end - # - def self.load_documents( io, &doc_proc ) - yp = parser.load_documents( io, &doc_proc ) - end - - # - # Calls _block_ with a tree of +YAML::BaseNodes+, one tree for - # each consecutive document in the YAML stream contained in _io_. - # - # File.open( 'many-docs.yaml' ) do |yf| - # YAML.each_node( yf ) do |ydoc| - # ## ydoc contains a tree of nodes - # ## from the YAML document - # end - # end - # - def self.each_node( io, &doc_proc ) - warn "#{caller[0]}: YAML.each_node is deprecated" if $VERBOSE && !caller[0].start_with?(File.dirname(__FILE__)) - yp = generic_parser.load_documents( io, &doc_proc ) - end - - # - # Calls _block_ with a tree of +YAML::BaseNodes+, one tree for - # each consecutive document in the YAML stream contained in _io_. - # - # File.open( 'many-docs.yaml' ) do |yf| - # YAML.parse_documents( yf ) do |ydoc| - # ## ydoc contains a tree of nodes - # ## from the YAML document - # end - # end - # - def self.parse_documents( io, &doc_proc ) - warn "#{caller[0]}: YAML.parse_documents is deprecated, use load_stream" if $VERBOSE && !caller[0].start_with?(File.dirname(__FILE__)) - self.each_node( io, &doc_proc ) - end - - # - # Loads all documents from the current _io_ stream, - # returning a +YAML::Stream+ object containing all - # loaded documents. - # - def self.load_stream( io ) - d = nil - parser.load_documents( io ) do |doc| - d = Stream.new if not d - d.add( doc ) - end - return d - end - - # - # Returns a YAML stream containing each of the items in +objs+, - # each having their own document. - # - # YAML.dump_stream( 0, [], {} ) - # #=> --- 0 - # --- [] - # --- {} - # - def self.dump_stream( *objs ) - d = Stream.new - objs.each do |doc| - d.add( doc ) - end - d.emit - end - - # - # Add a global handler for a YAML domain type. - # - def self.add_domain_type( domain, type_tag, &transfer_proc ) - resolver.add_type( "tag:#{ domain }:#{ type_tag }", transfer_proc ) - end - - # - # Add a transfer method for a builtin type - # - def self.add_builtin_type( type_tag, &transfer_proc ) - resolver.add_type( "tag:yaml.org,2002:#{ type_tag }", transfer_proc ) - end - - # - # Add a transfer method for a builtin type - # - def self.add_ruby_type( type_tag, &transfer_proc ) - warn "#{caller[0]}: YAML.add_ruby_type is deprecated, use add_domain_type" if $VERBOSE && !caller[0].start_with?(File.dirname(__FILE__)) - resolver.add_type( "tag:ruby.yaml.org,2002:#{ type_tag }", transfer_proc ) - end - - # - # Add a private document type - # - def self.add_private_type( type_re, &transfer_proc ) - warn "#{caller[0]}: YAML.add_private_type is deprecated, use add_domain_type" if $VERBOSE && !caller[0].start_with?(File.dirname(__FILE__)) - resolver.add_type( "x-private:" + type_re, transfer_proc ) - end - - # - # Detect typing of a string - # - def self.detect_implicit( val ) - warn "#{caller[0]}: YAML.detect_implicit is deprecated" if $VERBOSE && !caller[0].start_with?(File.dirname(__FILE__)) - resolver.detect_implicit( val ) - end - - # - # Convert a type_id to a taguri - # - def self.tagurize( val ) - warn "#{caller[0]}: YAML.tagurize is deprecated" if $VERBOSE && !caller[0].start_with?(File.dirname(__FILE__)) - resolver.tagurize( val ) - end - - # - # Apply a transfer method to a Ruby object - # - def self.transfer( type_id, obj ) - warn "#{caller[0]}: YAML.transfer is deprecated" if $VERBOSE && !caller[0].start_with?(File.dirname(__FILE__)) - resolver.transfer( tagurize( type_id ), obj ) - end - - # - # Apply any implicit a node may qualify for - # - def self.try_implicit( obj ) - warn "#{caller[0]}: YAML.try_implicit is deprecated" if $VERBOSE && !caller[0].start_with?(File.dirname(__FILE__)) - transfer( detect_implicit( obj ), obj ) - end - - # - # Method to extract colon-seperated type and class, returning - # the type and the constant of the class - # - def self.read_type_class( type, obj_class ) - warn "#{caller[0]}: YAML.read_type_class is deprecated" if $VERBOSE && !caller[0].start_with?(File.dirname(__FILE__)) - scheme, domain, type, tclass = type.split( ':', 4 ) - tclass.split( "::" ).each { |c| obj_class = obj_class.const_get( c ) } if tclass - return [ type, obj_class ] - end - - # - # Allocate blank object - # - def self.object_maker( obj_class, val ) - warn "#{caller[0]}: YAML.object_maker is deprecated" if $VERBOSE && !caller[0].start_with?(File.dirname(__FILE__)) - if Hash === val - o = obj_class.allocate - val.each_pair { |k,v| - o.instance_variable_set("@#{k}", v) - } - o - else - raise Error, "Invalid object explicitly tagged !ruby/Object: " + val.inspect - end - end - - # - # Allocate an Emitter if needed - # - def self.quick_emit( oid, opts = {}, &e ) - warn "#{caller[0]}: YAML.quick_emit is deprecated" if $VERBOSE && !caller[0].start_with?(File.dirname(__FILE__)) - out = - if opts.is_a? Emitter - opts - else - emitter.reset( opts ) - end - out.emit( oid, &e ) - end - -end - -module Kernel - # - # ryan:: You know how Kernel.p is a really convenient way to dump ruby - # structures? The only downside is that it's not as legible as - # YAML. - # - # _why:: (listening) - # - # ryan:: I know you don't want to urinate all over your users' namespaces. - # But, on the other hand, convenience of dumping for debugging is, - # IMO, a big YAML use case. - # - # _why:: Go nuts! Have a pony parade! - # - # ryan:: Either way, I certainly will have a pony parade. - # - - # Prints any supplied _objects_ out in YAML. Intended as - # a variation on +Kernel::p+. - # - # S = Struct.new(:name, :state) - # s = S['dave', 'TX'] - # y s - # - # _produces:_ - # - # --- !ruby/struct:S - # name: dave - # state: TX - # - def y( object, *objects ) - objects.unshift object - puts( if objects.length == 1 - YAML.dump( *objects ) - else - YAML.dump_stream( *objects ) - end ) - end - private :y -end - - diff --git a/Src/StdLib/ruby/1.9.1/syck/baseemitter.rb b/Src/StdLib/ruby/1.9.1/syck/baseemitter.rb deleted file mode 100644 index 25ab6bfd0..000000000 --- a/Src/StdLib/ruby/1.9.1/syck/baseemitter.rb +++ /dev/null @@ -1,242 +0,0 @@ -# -# BaseEmitter -# - -require 'syck/constants' -require 'syck/encoding' -require 'syck/error' - -module Syck - module BaseEmitter - def options( opt = nil ) - if opt - @options[opt] || DEFAULTS[opt] - else - @options - end - end - - def options=( opt ) - @options = opt - end - - # - # Emit binary data - # - def binary_base64( value ) - self << "!binary " - self.node_text( [value].pack("m"), '|' ) - end - - # - # Emit plain, normal flowing text - # - def node_text( value, block = nil ) - @seq_map = false - valx = value.dup - unless block - block = - if options(:UseBlock) - '|' - elsif not options(:UseFold) and valx =~ /\n[ \t]/ and not valx =~ /#{ESCAPE_CHAR}/ - '|' - else - '>' - end - indt = $&.to_i if block =~ /\d+/ - if valx =~ /(\A\n*[ \t#]|^---\s+)/ - indt = options(:Indent) unless indt.to_i > 0 - block += indt.to_s - end - - block += - if valx =~ /\n\Z\n/ - "+" - elsif valx =~ /\Z\n/ - "" - else - "-" - end - end - block += "\n" - if block[0] == ?" - esc_skip = ( "\t\n" unless valx =~ /^[ \t]/ ) || "" - valx = fold( Syck.escape( valx, esc_skip ) + "\"" ).chomp - self << '"' + indent_text( valx, indt, false ) - else - if block[0] == ?> - valx = fold( valx ) - end - #p [block, indt] - self << block + indent_text( valx, indt ) - end - end - - # - # Emit a simple, unqouted string - # - def simple( value ) - @seq_map = false - self << value.to_s - end - - # - # Emit double-quoted string - # - def double( value ) - "\"#{Syck.escape( value )}\"" - end - - # - # Emit single-quoted string - # - def single( value ) - "'#{value}'" - end - - # - # Write a text block with the current indent - # - def indent_text( text, mod, first_line = true ) - return "" if text.to_s.empty? - spacing = indent( mod ) - text = text.gsub( /\A([^\n])/, "#{ spacing }\\1" ) if first_line - return text.gsub( /\n^([^\n])/, "\n#{spacing}\\1" ) - end - - # - # Write a current indent - # - def indent( mod = nil ) - #p [ self.id, level, mod, :INDENT ] - if level <= 0 - mod ||= 0 - else - mod ||= options(:Indent) - mod += ( level - 1 ) * options(:Indent) - end - return " " * mod - end - - # - # Add indent to the buffer - # - def indent! - self << indent - end - - # - # Folding paragraphs within a column - # - def fold( value ) - value.gsub( /(^[ \t]+.*$)|(\S.{0,#{options(:BestWidth) - 1}})(?:[ \t]+|(\n+(?=[ \t]|\Z))|$)/ ) do - $1 || $2 + ( $3 || "\n" ) - end - end - - # - # Quick mapping - # - def map( type, &e ) - val = Mapping.new - e.call( val ) - self << "#{type} " if type.length.nonzero? - - # - # Empty hashes - # - if val.length.zero? - self << "{}" - @seq_map = false - else - # FIXME - # if @buffer.length == 1 and options(:UseHeader) == false and type.length.zero? - # @headless = 1 - # end - - defkey = @options.delete( :DefaultKey ) - if defkey - seq_map_shortcut - self << "= : " - defkey.to_yaml( :Emitter => self ) - end - - # - # Emit the key and value - # - val.each { |v| - seq_map_shortcut - if v[0].is_complex_yaml? - self << "? " - end - v[0].to_yaml( :Emitter => self ) - if v[0].is_complex_yaml? - self << "\n" - indent! - end - self << ": " - v[1].to_yaml( :Emitter => self ) - } - end - end - - def seq_map_shortcut - # FIXME: seq_map needs to work with the new anchoring system - # if @seq_map - # @anchor_extras[@buffer.length - 1] = "\n" + indent - # @seq_map = false - # else - self << "\n" - indent! - # end - end - - # - # Quick sequence - # - def seq( type, &e ) - @seq_map = false - val = Sequence.new - e.call( val ) - self << "#{type} " if type.length.nonzero? - - # - # Empty arrays - # - if val.length.zero? - self << "[]" - else - # FIXME - # if @buffer.length == 1 and options(:UseHeader) == false and type.length.zero? - # @headless = 1 - # end - - # - # Emit the key and value - # - val.each { |v| - self << "\n" - indent! - self << "- " - @seq_map = true if v.class == Hash - v.to_yaml( :Emitter => self ) - } - end - end - end - - # - # Emitter helper classes - # - class Mapping < Array - def add( k, v ) - push [k, v] - end - end - - class Sequence < Array - def add( v ) - push v - end - end -end diff --git a/Src/StdLib/ruby/1.9.1/syck/basenode.rb b/Src/StdLib/ruby/1.9.1/syck/basenode.rb deleted file mode 100644 index 60b5bbe6d..000000000 --- a/Src/StdLib/ruby/1.9.1/syck/basenode.rb +++ /dev/null @@ -1,223 +0,0 @@ -# -# YAML::BaseNode class -# - -module Syck - - # - # YAML Generic Model container - # - module BaseNode - - # - # Search for YPath entry and return - # qualified nodes. - # - def select( ypath_str ) - warn "#{caller[0]}: select is deprecated" if $VERBOSE - matches = match_path( ypath_str ) - - # - # Create a new generic view of the elements selected - # - if matches - result = [] - matches.each { |m| - result.push m.last - } - Syck.transfer( 'seq', result ) - end - end - - # - # Search for YPath entry and return - # transformed nodes. - # - def select!( ypath_str ) - warn "#{caller[0]}: select!() is deprecated" if $VERBOSE - matches = match_path( ypath_str ) - - # - # Create a new generic view of the elements selected - # - if matches - result = [] - matches.each { |m| - result.push m.last.transform - } - result - end - end - - # - # Search for YPath entry and return a list of - # qualified paths. - # - def search( ypath_str ) - warn "#{caller[0]}: search() is deprecated" if $VERBOSE - matches = match_path( ypath_str ) - - if matches - matches.collect { |m| - path = [] - m.each_index { |i| - path.push m[i] if ( i % 2 ).zero? - } - "/" + path.compact.join( "/" ) - } - end - end - - def at( seg ) - warn "#{caller[0]}: at() is deprecated" if $VERBOSE - if Hash === @value - self[seg] - elsif Array === @value and seg =~ /\A\d+\Z/ and @value[seg.to_i] - @value[seg.to_i] - end - end - - # - # YPath search returning a complete depth array - # - def match_path( ypath_str ) - warn "#{caller[0]}: match_path is deprecated" if $VERBOSE - require 'syck/ypath' - depth = 0 - matches = [] - YPath.each_path( ypath_str ) do |ypath| - seg = match_segment( ypath, 0 ) - matches += seg if seg - end - matches.uniq - end - - # - # Search a node for a single YPath segment - # - def match_segment( ypath, depth ) - warn "#{caller[0]}: match_segment is deprecated" if $VERBOSE - deep_nodes = [] - seg = ypath.segments[ depth ] - if seg == "/" - unless String === @value - idx = -1 - @value.collect { |v| - idx += 1 - if Hash === @value - match_init = [v[0].transform, v[1]] - match_deep = v[1].match_segment( ypath, depth ) - else - match_init = [idx, v] - match_deep = v.match_segment( ypath, depth ) - end - if match_deep - match_deep.each { |m| - deep_nodes.push( match_init + m ) - } - end - } - end - depth += 1 - seg = ypath.segments[ depth ] - end - match_nodes = - case seg - when "." - [[nil, self]] - when ".." - [["..", nil]] - when "*" - if @value.is_a? Enumerable - idx = -1 - @value.collect { |h| - idx += 1 - if Hash === @value - [h[0].transform, h[1]] - else - [idx, h] - end - } - end - else - if seg =~ /^"(.*)"$/ - seg = $1 - elsif seg =~ /^'(.*)'$/ - seg = $1 - end - if ( v = at( seg ) ) - [[ seg, v ]] - end - end - return deep_nodes unless match_nodes - pred = ypath.predicates[ depth ] - if pred - case pred - when /^\.=/ - pred = $' # ' - match_nodes.reject! { |n| - n.last.value != pred - } - else - match_nodes.reject! { |n| - n.last.at( pred ).nil? - } - end - end - return match_nodes + deep_nodes unless ypath.segments.length > depth + 1 - - #puts "DEPTH: #{depth + 1}" - deep_nodes = [] - match_nodes.each { |n| - if n[1].is_a? BaseNode - match_deep = n[1].match_segment( ypath, depth + 1 ) - if match_deep - match_deep.each { |m| - deep_nodes.push( n + m ) - } - end - else - deep_nodes = [] - end - } - deep_nodes = nil if deep_nodes.length == 0 - deep_nodes - end - - # - # We want the node to act like as Hash - # if it is. - # - def []( *key ) - if Hash === @value - v = @value.detect { |k,| k.transform == key.first } - v[1] if v - elsif Array === @value - @value.[]( *key ) - end - end - - def children - if Hash === @value - @value.values.collect { |c| c[1] } - elsif Array === @value - @value - end - end - - def children_with_index - warn "#{caller[0]}: children_with_index is deprecated, use children" if $VERBOSE - if Hash === @value - @value.keys.collect { |i| [self[i], i] } - elsif Array === @value - i = -1; @value.collect { |v| i += 1; [v, i] } - end - end - - def emit - transform.to_yaml - end - end - -end - diff --git a/Src/StdLib/ruby/1.9.1/syck/constants.rb b/Src/StdLib/ruby/1.9.1/syck/constants.rb deleted file mode 100644 index 19b557b29..000000000 --- a/Src/StdLib/ruby/1.9.1/syck/constants.rb +++ /dev/null @@ -1,45 +0,0 @@ -# -# Constants used throughout the library -# -module Syck - - # - # Constants - # - VERSION = '0.60' - SUPPORTED_YAML_VERSIONS = ['1.0'] - - # - # Parser tokens - # - WORD_CHAR = 'A-Za-z0-9' - PRINTABLE_CHAR = '-_A-Za-z0-9!?/()$\'". ' - NOT_PLAIN_CHAR = '\x7f\x0-\x1f\x80-\x9f' - ESCAPE_CHAR = '[\\x00-\\x09\\x0b-\\x1f]' - INDICATOR_CHAR = '*&!|\\\\^@%{}[]=' - SPACE_INDICATORS = '-#:,?' - RESTRICTED_INDICATORS = '#:,}]' - DNS_COMP_RE = "\\w(?:[-\\w]*\\w)?" - DNS_NAME_RE = "(?:(?:#{DNS_COMP_RE}\\.)+#{DNS_COMP_RE}|#{DNS_COMP_RE})" - ESCAPES = %w{\x00 \x01 \x02 \x03 \x04 \x05 \x06 \a - \x08 \t \n \v \f \r \x0e \x0f - \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 - \x18 \x19 \x1a \e \x1c \x1d \x1e \x1f - } - UNESCAPES = { - 'a' => "\x07", 'b' => "\x08", 't' => "\x09", - 'n' => "\x0a", 'v' => "\x0b", 'f' => "\x0c", - 'r' => "\x0d", 'e' => "\x1b", '\\' => '\\', - } - - # - # Default settings - # - DEFAULTS = { - :Indent => 2, :UseHeader => false, :UseVersion => false, :Version => '1.0', - :SortKeys => false, :AnchorFormat => 'id%03d', :ExplicitTypes => false, - :WidthType => 'absolute', :BestWidth => 80, - :UseBlock => false, :UseFold => false, :Encoding => :None - } - -end diff --git a/Src/StdLib/ruby/1.9.1/syck/encoding.rb b/Src/StdLib/ruby/1.9.1/syck/encoding.rb deleted file mode 100644 index 1507c30bb..000000000 --- a/Src/StdLib/ruby/1.9.1/syck/encoding.rb +++ /dev/null @@ -1,35 +0,0 @@ -# -# Handle Unicode-to-Internal conversion -# - -module Syck - - # - # Escape the string, condensing common escapes - # - def self.escape( value, skip = "" ) - warn "#{caller[0]}: YAML.escape is deprecated" if $VERBOSE - value.gsub( /\\/, "\\\\\\" ). - gsub( /"/, "\\\"" ). - gsub( /([\x00-\x1f])/ ) do - skip[$&] || ESCAPES[ $&.unpack("C")[0] ] - end - end - - # - # Unescape the condenses escapes - # - def self.unescape( value ) - warn "#{caller[0]}: YAML.unescape is deprecated" if $VERBOSE - value.gsub( /\\(?:([nevfbart\\])|0?x([0-9a-fA-F]{2})|u([0-9a-fA-F]{4}))/ ) { - if $3 - ["#$3".hex ].pack('U*') - elsif $2 - [$2].pack( "H2" ) - else - UNESCAPES[$1] - end - } - end - -end diff --git a/Src/StdLib/ruby/1.9.1/syck/error.rb b/Src/StdLib/ruby/1.9.1/syck/error.rb deleted file mode 100644 index 40920b0ec..000000000 --- a/Src/StdLib/ruby/1.9.1/syck/error.rb +++ /dev/null @@ -1,34 +0,0 @@ -# -# Error messages and exception class -# - -module Syck - - # - # Error messages - # - - ERROR_NO_HEADER_NODE = "With UseHeader=false, the node Array or Hash must have elements" - ERROR_NEED_HEADER = "With UseHeader=false, the node must be an Array or Hash" - ERROR_BAD_EXPLICIT = "Unsupported explicit transfer: '%s'" - ERROR_MANY_EXPLICIT = "More than one explicit transfer" - ERROR_MANY_IMPLICIT = "More than one implicit request" - ERROR_NO_ANCHOR = "No anchor for alias '%s'" - ERROR_BAD_ANCHOR = "Invalid anchor: %s" - ERROR_MANY_ANCHOR = "More than one anchor" - ERROR_ANCHOR_ALIAS = "Can't define both an anchor and an alias" - ERROR_BAD_ALIAS = "Invalid alias: %s" - ERROR_MANY_ALIAS = "More than one alias" - ERROR_ZERO_INDENT = "Can't use zero as an indentation width" - ERROR_UNSUPPORTED_VERSION = "This release of YAML.rb does not support YAML version %s" - ERROR_UNSUPPORTED_ENCODING = "Attempt to use unsupported encoding: %s" - - # - # YAML Error classes - # - - class Error < StandardError; end - class ParseError < Error; end - class TypeError < StandardError; end - -end diff --git a/Src/StdLib/ruby/1.9.1/syck/loader.rb b/Src/StdLib/ruby/1.9.1/syck/loader.rb deleted file mode 100644 index e1c54970d..000000000 --- a/Src/StdLib/ruby/1.9.1/syck/loader.rb +++ /dev/null @@ -1,14 +0,0 @@ -# -# YAML::Loader class -# .. type handling .. -# -module Syck - class Loader - TRANSFER_DOMAINS = { - 'yaml.org,2002' => {}, - 'ruby.yaml.org,2002' => {} - } - PRIVATE_TYPES = {} - IMPLICIT_TYPES = [ 'null', 'bool', 'time', 'int', 'float' ] - end -end diff --git a/Src/StdLib/ruby/1.9.1/syck/rubytypes.rb b/Src/StdLib/ruby/1.9.1/syck/rubytypes.rb deleted file mode 100644 index 0acc7f49f..000000000 --- a/Src/StdLib/ruby/1.9.1/syck/rubytypes.rb +++ /dev/null @@ -1,464 +0,0 @@ -# -*- mode: ruby; ruby-indent-level: 4; tab-width: 4 -*- vim: sw=4 ts=4 -require 'date' - -class Class - def to_yaml( opts = {} ) - raise TypeError, "can't dump anonymous class %s" % self.class - end -end - -class Object - yaml_as "tag:ruby.yaml.org,2002:object" - def to_yaml_style; end - def to_yaml_properties; instance_variables.sort; end - def to_yaml( opts = {} ) - YAML::quick_emit( self, opts ) do |out| - out.map( taguri, to_yaml_style ) do |map| - to_yaml_properties.each do |m| - map.add( m[1..-1], instance_variable_get( m ) ) - end - end - end - end - alias :syck_to_yaml :to_yaml -end - -class Hash - yaml_as "tag:ruby.yaml.org,2002:hash" - yaml_as "tag:yaml.org,2002:map" - def yaml_initialize( tag, val ) - if Array === val - update Hash.[]( *val ) # Convert the map to a sequence - elsif Hash === val - update val - else - raise YAML::TypeError, "Invalid map explicitly tagged #{ tag }: " + val.inspect - end - end - def to_yaml( opts = {} ) - return super unless YAML::ENGINE.syck? - YAML::quick_emit( self, opts ) do |out| - out.map( taguri, to_yaml_style ) do |map| - each do |k, v| - map.add( k, v ) - end - end - end - end -end - -class Struct - yaml_as "tag:ruby.yaml.org,2002:struct" - def self.yaml_tag_class_name; self.name.gsub( "Struct::", "" ); end - def self.yaml_tag_read_class( name ); "Struct::#{ name }"; end - def self.yaml_new( klass, tag, val ) - if Hash === val - struct_type = nil - - # - # Use existing Struct if it exists - # - props = {} - val.delete_if { |k,v| props[k] = v if k =~ /^@/ } - begin - struct_name, struct_type = YAML.read_type_class( tag, Struct ) - rescue NameError - end - if not struct_type - struct_def = [ tag.split( ':', 4 ).last ] - struct_type = Struct.new( *struct_def.concat( val.keys.collect { |k| k.intern } ) ) - end - - # - # Set the Struct properties - # - st = YAML::object_maker( struct_type, {} ) - st.members.each do |m| - st.send( "#{m}=", val[m.to_s] ) - end - props.each do |k,v| - st.instance_variable_set(k, v) - end - st - else - raise YAML::TypeError, "Invalid Ruby Struct: " + val.inspect - end - end - def to_yaml( opts = {} ) - return super unless YAML::ENGINE.syck? - YAML::quick_emit( self, opts ) do |out| - # - # Basic struct is passed as a YAML map - # - out.map( taguri, to_yaml_style ) do |map| - self.members.each do |m| - map.add( m.to_s, self[m.to_s] ) - end - self.to_yaml_properties.each do |m| - map.add( m, instance_variable_get( m ) ) - end - end - end - end -end - -class Array - yaml_as "tag:ruby.yaml.org,2002:array" - yaml_as "tag:yaml.org,2002:seq" - def yaml_initialize( tag, val ); concat( val.to_a ); end - def to_yaml( opts = {} ) - return super unless YAML::ENGINE.syck? - YAML::quick_emit( self, opts ) do |out| - out.seq( taguri, to_yaml_style ) do |seq| - each do |x| - seq.add( x ) - end - end - end - end -end - -class Exception - yaml_as "tag:ruby.yaml.org,2002:exception" - def Exception.yaml_new( klass, tag, val ) - o = YAML.object_maker( klass, { 'mesg' => val.delete( 'message' ) } ) - val.each_pair do |k,v| - o.instance_variable_set("@#{k}", v) - end - o - end - def to_yaml( opts = {} ) - return super unless YAML::ENGINE.syck? - YAML::quick_emit( self, opts ) do |out| - out.map( taguri, to_yaml_style ) do |map| - map.add( 'message', message ) - to_yaml_properties.each do |m| - map.add( m[1..-1], instance_variable_get( m ) ) - end - end - end - end -end - -class String - yaml_as "tag:ruby.yaml.org,2002:string" - yaml_as "tag:yaml.org,2002:binary" - yaml_as "tag:yaml.org,2002:str" - def is_complex_yaml? - to_yaml_style or not to_yaml_properties.empty? or self =~ /\n.+/ - end - def is_binary_data? - self.count("^ -~\t\r\n").fdiv(self.size) > 0.3 || self.index("\x00") unless self.empty? - end - def String.yaml_new( klass, tag, val ) - val = val.unpack("m")[0] if tag == "tag:yaml.org,2002:binary" - val = { 'str' => val } if String === val - if Hash === val - s = klass.allocate - # Thank you, NaHi - String.instance_method(:initialize). - bind(s). - call( val.delete( 'str' ) ) - val.each { |k,v| s.instance_variable_set( k, v ) } - s - else - raise YAML::TypeError, "Invalid String: " + val.inspect - end - end - def to_yaml( opts = {} ) - return super unless YAML::ENGINE.syck? - YAML::quick_emit( is_complex_yaml? ? self : nil, opts ) do |out| - if is_binary_data? - out.scalar( "tag:yaml.org,2002:binary", [self].pack("m"), :literal ) - elsif to_yaml_properties.empty? - out.scalar( taguri, self, self =~ /^:/ ? :quote2 : to_yaml_style ) - else - out.map( taguri, to_yaml_style ) do |map| - map.add( 'str', "#{self}" ) - to_yaml_properties.each do |m| - map.add( m, instance_variable_get( m ) ) - end - end - end - end - end -end - -class Symbol - yaml_as "tag:ruby.yaml.org,2002:symbol" - yaml_as "tag:ruby.yaml.org,2002:sym" - def Symbol.yaml_new( klass, tag, val ) - if String === val - val = YAML::load( val ) if val =~ /\A(["']).*\1\z/ - val.intern - else - raise YAML::TypeError, "Invalid Symbol: " + val.inspect - end - end - def to_yaml( opts = {} ) - return super unless YAML::ENGINE.syck? - YAML::quick_emit( nil, opts ) do |out| - out.scalar( "tag:yaml.org,2002:str", self.inspect, :plain ) - end - end -end - -class Range - yaml_as "tag:ruby.yaml.org,2002:range" - def Range.yaml_new( klass, tag, val ) - inr = %r'(\w+|[+-]?\d+(?:\.\d+)?(?:e[+-]\d+)?|"(?:[^\\"]|\\.)*")' - opts = {} - if String === val and val =~ /^#{inr}(\.{2,3})#{inr}$/o - r1, rdots, r2 = $1, $2, $3 - opts = { - 'begin' => YAML.load( "--- #{r1}" ), - 'end' => YAML.load( "--- #{r2}" ), - 'excl' => rdots.length == 3 - } - val = {} - elsif Hash === val - opts['begin'] = val.delete('begin') - opts['end'] = val.delete('end') - opts['excl'] = val.delete('excl') - end - if Hash === opts - r = YAML::object_maker( klass, {} ) - # Thank you, NaHi - Range.instance_method(:initialize). - bind(r). - call( opts['begin'], opts['end'], opts['excl'] ) - val.each { |k,v| r.instance_variable_set( k, v ) } - r - else - raise YAML::TypeError, "Invalid Range: " + val.inspect - end - end - def to_yaml( opts = {} ) - return super unless YAML::ENGINE.syck? - YAML::quick_emit( self, opts ) do |out| - # if self.begin.is_complex_yaml? or self.begin.respond_to? :to_str or - # self.end.is_complex_yaml? or self.end.respond_to? :to_str or - # not to_yaml_properties.empty? - out.map( taguri, to_yaml_style ) do |map| - map.add( 'begin', self.begin ) - map.add( 'end', self.end ) - map.add( 'excl', self.exclude_end? ) - to_yaml_properties.each do |m| - map.add( m, instance_variable_get( m ) ) - end - end - # else - # out.scalar( taguri ) do |sc| - # sc.embed( self.begin ) - # sc.concat( self.exclude_end? ? "..." : ".." ) - # sc.embed( self.end ) - # end - # end - end - end -end - -class Regexp - yaml_as "tag:ruby.yaml.org,2002:regexp" - def Regexp.yaml_new( klass, tag, val ) - if String === val and val =~ /^\/(.*)\/([mix]*)$/ - val = { 'regexp' => $1, 'mods' => $2 } - end - if Hash === val - mods = nil - unless val['mods'].to_s.empty? - mods = 0x00 - mods |= Regexp::EXTENDED if val['mods'].include?( 'x' ) - mods |= Regexp::IGNORECASE if val['mods'].include?( 'i' ) - mods |= Regexp::MULTILINE if val['mods'].include?( 'm' ) - end - val.delete( 'mods' ) - r = YAML::object_maker( klass, {} ) - Regexp.instance_method(:initialize). - bind(r). - call( val.delete( 'regexp' ), mods ) - val.each { |k,v| r.instance_variable_set( k, v ) } - r - else - raise YAML::TypeError, "Invalid Regular expression: " + val.inspect - end - end - def to_yaml( opts = {} ) - return super unless YAML::ENGINE.syck? - YAML::quick_emit( nil, opts ) do |out| - if to_yaml_properties.empty? - out.scalar( taguri, self.inspect, :plain ) - else - out.map( taguri, to_yaml_style ) do |map| - src = self.inspect - if src =~ /\A\/(.*)\/([a-z]*)\Z/ - map.add( 'regexp', $1 ) - map.add( 'mods', $2 ) - else - raise YAML::TypeError, "Invalid Regular expression: " + src - end - to_yaml_properties.each do |m| - map.add( m, instance_variable_get( m ) ) - end - end - end - end - end -end - -class Time - yaml_as "tag:ruby.yaml.org,2002:time" - yaml_as "tag:yaml.org,2002:timestamp" - def Time.yaml_new( klass, tag, val ) - if Hash === val - t = val.delete( 'at' ) - val.each { |k,v| t.instance_variable_set( k, v ) } - t - else - raise YAML::TypeError, "Invalid Time: " + val.inspect - end - end - def to_yaml( opts = {} ) - return super unless YAML::ENGINE.syck? - YAML::quick_emit( self, opts ) do |out| - tz = "Z" - # from the tidy Tobias Peters Thanks! - unless self.utc? - utc_same_instant = self.dup.utc - utc_same_writing = Time.utc(year,month,day,hour,min,sec,usec) - difference_to_utc = utc_same_writing - utc_same_instant - if (difference_to_utc < 0) - difference_sign = '-' - absolute_difference = -difference_to_utc - else - difference_sign = '+' - absolute_difference = difference_to_utc - end - difference_minutes = (absolute_difference/60).round - tz = "%s%02d:%02d" % [ difference_sign, difference_minutes / 60, difference_minutes % 60] - end - standard = self.strftime( "%Y-%m-%d %H:%M:%S" ) - standard += ".%06d" % [usec] if usec.nonzero? - standard += " %s" % [tz] - if to_yaml_properties.empty? - out.scalar( taguri, standard, :plain ) - else - out.map( taguri, to_yaml_style ) do |map| - map.add( 'at', standard ) - to_yaml_properties.each do |m| - map.add( m, instance_variable_get( m ) ) - end - end - end - end - end -end - -class Date - yaml_as "tag:yaml.org,2002:timestamp#ymd" - def to_yaml( opts = {} ) - return super unless YAML::ENGINE.syck? - YAML::quick_emit( self, opts ) do |out| - out.scalar( "tag:yaml.org,2002:timestamp", self.to_s, :plain ) - end - end -end - -class Integer - yaml_as "tag:yaml.org,2002:int" - def to_yaml( opts = {} ) - return super unless YAML::ENGINE.syck? - YAML::quick_emit( nil, opts ) do |out| - out.scalar( "tag:yaml.org,2002:int", self.to_s, :plain ) - end - end -end - -class Float - yaml_as "tag:yaml.org,2002:float" - def to_yaml( opts = {} ) - return super unless YAML::ENGINE.syck? - YAML::quick_emit( nil, opts ) do |out| - str = self.to_s - if str == "Infinity" - str = ".Inf" - elsif str == "-Infinity" - str = "-.Inf" - elsif str == "NaN" - str = ".NaN" - end - out.scalar( "tag:yaml.org,2002:float", str, :plain ) - end - end -end - -class Rational - yaml_as "tag:ruby.yaml.org,2002:object:Rational" - def Rational.yaml_new( klass, tag, val ) - if val.is_a? String - Rational( val ) - else - Rational( val['numerator'], val['denominator'] ) - end - end - def to_yaml( opts = {} ) - return super unless YAML::ENGINE.syck? - YAML::quick_emit( self, opts ) do |out| - out.map( taguri, nil ) do |map| - map.add( 'denominator', denominator ) - map.add( 'numerator', numerator ) - end - end - end -end - -class Complex - yaml_as "tag:ruby.yaml.org,2002:object:Complex" - def Complex.yaml_new( klass, tag, val ) - if val.is_a? String - Complex( val ) - else - Complex( val['real'], val['image'] ) - end - end - def to_yaml( opts = {} ) - return super unless YAML::ENGINE.syck? - YAML::quick_emit( self, opts ) do |out| - out.map( taguri, nil ) do |map| - map.add( 'image', imaginary ) - map.add( 'real', real ) - end - end - end -end - -class TrueClass - yaml_as "tag:yaml.org,2002:bool#yes" - def to_yaml( opts = {} ) - return super unless YAML::ENGINE.syck? - YAML::quick_emit( nil, opts ) do |out| - out.scalar( taguri, "true", :plain ) - end - end -end - -class FalseClass - yaml_as "tag:yaml.org,2002:bool#no" - def to_yaml( opts = {} ) - return super unless YAML::ENGINE.syck? - YAML::quick_emit( nil, opts ) do |out| - out.scalar( taguri, "false", :plain ) - end - end -end - -class NilClass - yaml_as "tag:yaml.org,2002:null" - def to_yaml( opts = {} ) - return super unless YAML::ENGINE.syck? - YAML::quick_emit( nil, opts ) do |out| - out.scalar( taguri, "", :plain ) - end - end -end - diff --git a/Src/StdLib/ruby/1.9.1/syck/stream.rb b/Src/StdLib/ruby/1.9.1/syck/stream.rb deleted file mode 100644 index 995ebe36a..000000000 --- a/Src/StdLib/ruby/1.9.1/syck/stream.rb +++ /dev/null @@ -1,41 +0,0 @@ -module Syck - - # - # YAML::Stream -- for emitting many documents - # - class Stream - - attr_accessor :documents, :options - - def initialize( opts = {} ) - @options = opts - @documents = [] - end - - def []( i ) - @documents[ i ] - end - - def add( doc ) - @documents << doc - end - - def edit( doc_num, doc ) - warn "#{caller[0]}: edit is deprecated" if $VERBOSE - @documents[ doc_num ] = doc - end - - def emit( io = nil ) - # opts = @options.dup - # opts[:UseHeader] = true if @documents.length > 1 - out = Syck.emitter - out.reset( io || io2 = StringIO.new ) - @documents.each { |v| - v.to_yaml( out ) - } - io || ( io2.rewind; io2.read ) - end - - end - -end diff --git a/Src/StdLib/ruby/1.9.1/syck/stringio.rb b/Src/StdLib/ruby/1.9.1/syck/stringio.rb deleted file mode 100644 index 820ad46fa..000000000 --- a/Src/StdLib/ruby/1.9.1/syck/stringio.rb +++ /dev/null @@ -1,85 +0,0 @@ -warn "#{caller[0]}: yaml/stringio is deprecated" if $VERBOSE - -# -# Limited StringIO if no core lib is available -# -begin -require 'stringio' -rescue LoadError - # StringIO based on code by MoonWolf - class StringIO - def initialize(string="") - @string=string - @pos=0 - @eof=(string.size==0) - end - def pos - @pos - end - def eof - @eof - end - alias eof? eof - def readline(rs=$/) - if @eof - raise EOFError - else - if p = @string[@pos..-1]=~rs - line = @string[@pos,p+1] - else - line = @string[@pos..-1] - end - @pos+=line.size - @eof =true if @pos==@string.size - $_ = line - end - end - def rewind - seek(0,0) - end - def seek(offset,whence) - case whence - when 0 - @pos=offset - when 1 - @pos+=offset - when 2 - @pos=@string.size+offset - end - @eof=(@pos>=@string.size) - 0 - end - end - - # - # Class method for creating streams - # - def Syck.make_stream( io ) - if String === io - io = StringIO.new( io ) - elsif not IO === io - raise Syck::Error, "YAML stream must be an IO or String object." - end - if Syck::unicode - def io.readline - Syck.utf_to_internal( readline( @ln_sep ), @utf_encoding ) - end - def io.check_unicode - @utf_encoding = Syck.sniff_encoding( read( 4 ) ) - @ln_sep = Syck.enc_separator( @utf_encoding ) - seek( -4, IO::SEEK_CUR ) - end - def io.utf_encoding - @utf_encoding - end - io.check_unicode - else - def io.utf_encoding - :None - end - end - io - end - -end - diff --git a/Src/StdLib/ruby/1.9.1/syck/syck.rb b/Src/StdLib/ruby/1.9.1/syck/syck.rb deleted file mode 100644 index 1f23411bc..000000000 --- a/Src/StdLib/ruby/1.9.1/syck/syck.rb +++ /dev/null @@ -1,16 +0,0 @@ -# -# YAML::Syck module -# .. glues syck and yaml.rb together .. -# -require 'syck/basenode' - -module Syck - - # - # Mixin BaseNode functionality - # - class Node - include Syck::BaseNode - end - -end diff --git a/Src/StdLib/ruby/1.9.1/syck/tag.rb b/Src/StdLib/ruby/1.9.1/syck/tag.rb deleted file mode 100644 index 28f6ac19c..000000000 --- a/Src/StdLib/ruby/1.9.1/syck/tag.rb +++ /dev/null @@ -1,95 +0,0 @@ -# -*- mode: ruby; ruby-indent-level: 4; tab-width: 4 -*- vim: sw=4 ts=4 -# $Id: tag.rb 27365 2010-04-16 20:31:59Z tenderlove $ -# -# = yaml/tag.rb: methods for associating a taguri to a class. -# -# Author:: why the lucky stiff -# -module Syck - # A dictionary of taguris which map to - # Ruby classes. - @@tagged_classes = {} - - # - # Associates a taguri _tag_ with a Ruby class _cls_. The taguri is used to give types - # to classes when loading YAML. Taguris are of the form: - # - # tag:authorityName,date:specific - # - # The +authorityName+ is a domain name or email address. The +date+ is the date the type - # was issued in YYYY or YYYY-MM or YYYY-MM-DD format. The +specific+ is a name for - # the type being added. - # - # For example, built-in YAML types have 'yaml.org' as the +authorityName+ and '2002' as the - # +date+. The +specific+ is simply the name of the type: - # - # tag:yaml.org,2002:int - # tag:yaml.org,2002:float - # tag:yaml.org,2002:timestamp - # - # The domain must be owned by you on the +date+ declared. If you don't own any domains on the - # date you declare the type, you can simply use an e-mail address. - # - # tag:why@ruby-lang.org,2004:notes/personal - # - def self.tag_class( tag, cls ) - if @@tagged_classes.has_key? tag - warn "class #{ @@tagged_classes[tag] } held ownership of the #{ tag } tag" - end - @@tagged_classes[tag] = cls - end - - # Returns the complete dictionary of taguris, paired with classes. The key for - # the dictionary is the full taguri. The value for each key is the class constant - # associated to that taguri. - # - # YAML.tagged_classes["tag:yaml.org,2002:int"] => Integer - # - def self.tagged_classes - @@tagged_classes - end -end - -class Module - # :stopdoc: - - # Adds a taguri _tag_ to a class, used when dumping or loading the class - # in YAML. See YAML::tag_class for detailed information on typing and - # taguris. - def syck_yaml_as( tag, sc = true ) - verbose, $VERBOSE = $VERBOSE, nil - class_eval <<-"END", __FILE__, __LINE__+1 - attr_writer :taguri - def taguri - if respond_to? :to_yaml_type - Syck.tagurize( to_yaml_type[1..-1] ) - else - return @taguri if defined?(@taguri) and @taguri - tag = #{ tag.dump } - if self.class.yaml_tag_subclasses? and self.class != Syck.tagged_classes[tag] - tag = "\#{ tag }:\#{ self.class.yaml_tag_class_name }" - end - tag - end - end - def self.yaml_tag_subclasses?; #{ sc ? 'true' : 'false' }; end - END - Syck.tag_class tag, self - ensure - $VERBOSE = verbose - end - remove_method :yaml_as rescue nil - alias :yaml_as :syck_yaml_as - - # Transforms the subclass name into a name suitable for display - # in a subclassed tag. - def yaml_tag_class_name - self.name - end - # Transforms the subclass name found in the tag into a Ruby - # constant name. - def yaml_tag_read_class( name ) - name - end - # :startdoc: -end diff --git a/Src/StdLib/ruby/1.9.1/syck/types.rb b/Src/StdLib/ruby/1.9.1/syck/types.rb deleted file mode 100644 index 200187c25..000000000 --- a/Src/StdLib/ruby/1.9.1/syck/types.rb +++ /dev/null @@ -1,192 +0,0 @@ -# -*- mode: ruby; ruby-indent-level: 4 -*- vim: sw=4 -# -# Classes required by the full core typeset -# - -module Syck - - # - # Default private type - # - class PrivateType - def self.tag_subclasses?; false; end - verbose, $VERBOSE = $VERBOSE, nil - def initialize( type, val ) - @type_id = type; @value = val - @value.taguri = "x-private:#{ @type_id }" - end - def to_yaml( opts = {} ) - @value.to_yaml( opts ) - end - ensure - $VERBOSE = verbose - end - - # - # Default domain type - # - class DomainType - def self.tag_subclasses?; false; end - verbose, $VERBOSE = $VERBOSE, nil - def initialize( domain, type, val ) - @domain = domain; @type_id = type; @value = val - @value.taguri = "tag:#{ @domain }:#{ @type_id }" - end - def to_yaml( opts = {} ) - @value.to_yaml( opts ) - end - ensure - $VERBOSE = verbose - end - - # - # Unresolved objects - # - class Object - def self.tag_subclasses?; false; end - def to_yaml( opts = {} ) - Syck.quick_emit( self, opts ) do |out| - out.map( "tag:ruby.yaml.org,2002:object:#{ @class }", to_yaml_style ) do |map| - @ivars.each do |k,v| - map.add( k, v ) - end - end - end - end - end - - # - # YAML Hash class to support comments and defaults - # - class SpecialHash < ::Hash - attr_accessor :default - def inspect - self.default.to_s - end - def to_s - self.default.to_s - end - def update( h ) - if Syck::SpecialHash === h - @default = h.default if h.default - end - super( h ) - end - def to_yaml( opts = {} ) - opts[:DefaultKey] = self.default - super( opts ) - end - end - - # - # Builtin collection: !omap - # - class Omap < ::Array - yaml_as "tag:yaml.org,2002:omap" - def yaml_initialize( tag, val ) - if Array === val - val.each do |v| - if Hash === v - concat( v.to_a ) # Convert the map to a sequence - else - raise Syck::Error, "Invalid !omap entry: " + val.inspect - end - end - else - raise Syck::Error, "Invalid !omap: " + val.inspect - end - self - end - def self.[]( *vals ) - o = Omap.new - 0.step( vals.length - 1, 2 ) do |i| - o[vals[i]] = vals[i+1] - end - o - end - def []( k ) - self.assoc( k ).to_a[1] - end - def []=( k, *rest ) - val, set = rest.reverse - if ( tmp = self.assoc( k ) ) and not set - tmp[1] = val - else - self << [ k, val ] - end - val - end - def has_key?( k ) - self.assoc( k ) ? true : false - end - def is_complex_yaml? - true - end - def to_yaml( opts = {} ) - Syck.quick_emit( self, opts ) do |out| - out.seq( taguri, to_yaml_style ) do |seq| - self.each do |v| - seq.add( Hash[ *v ] ) - end - end - end - end - end - - # - # Builtin collection: !pairs - # - class Pairs < ::Array - yaml_as "tag:yaml.org,2002:pairs" - def yaml_initialize( tag, val ) - if Array === val - val.each do |v| - if Hash === v - concat( v.to_a ) # Convert the map to a sequence - else - raise Syck::Error, "Invalid !pairs entry: " + val.inspect - end - end - else - raise Syck::Error, "Invalid !pairs: " + val.inspect - end - self - end - def self.[]( *vals ) - p = Pairs.new - 0.step( vals.length - 1, 2 ) { |i| - p[vals[i]] = vals[i+1] - } - p - end - def []( k ) - self.assoc( k ).to_a - end - def []=( k, val ) - self << [ k, val ] - val - end - def has_key?( k ) - self.assoc( k ) ? true : false - end - def is_complex_yaml? - true - end - def to_yaml( opts = {} ) - Syck.quick_emit( self, opts ) do |out| - out.seq( taguri, to_yaml_style ) do |seq| - self.each do |v| - seq.add( Hash[ *v ] ) - end - end - end - end - end - - # - # Builtin collection: !set - # - class Set < ::Hash - yaml_as "tag:yaml.org,2002:set" - end -end diff --git a/Src/StdLib/ruby/1.9.1/syck/yamlnode.rb b/Src/StdLib/ruby/1.9.1/syck/yamlnode.rb deleted file mode 100644 index 7d92ea958..000000000 --- a/Src/StdLib/ruby/1.9.1/syck/yamlnode.rb +++ /dev/null @@ -1,54 +0,0 @@ -# -# YAML::YamlNode class -# -require 'syck/basenode' - -module Syck - - # - # YAML Generic Model container - # - class YamlNode - include BaseNode - attr_accessor :kind, :type_id, :value, :anchor - def initialize(t, v) - @type_id = t - if Hash === v - @kind = 'map' - @value = {} - v.each {|key,val| - @value[key.transform] = [key, val] - } - elsif Array === v - @kind = 'seq' - @value = v - elsif String === v - @kind = 'scalar' - @value = v - end - end - - # - # Transform this node fully into a native type - # - def transform - t = nil - if @value.is_a? Hash - t = {} - @value.each { |k,v| - t[ k ] = v[1].transform - } - elsif @value.is_a? Array - t = [] - @value.each { |v| - t.push v.transform - } - else - t = @value - end - Syck.transfer_method( @type_id, t ) - end - - end - -end diff --git a/Src/StdLib/ruby/1.9.1/syck/ypath.rb b/Src/StdLib/ruby/1.9.1/syck/ypath.rb deleted file mode 100644 index 5a58cdac8..000000000 --- a/Src/StdLib/ruby/1.9.1/syck/ypath.rb +++ /dev/null @@ -1,54 +0,0 @@ -# -# YAML::YPath -# - -warn "#{caller[0]}: YAML::YPath is deprecated" if $VERBOSE - -module Syck - - class YPath - attr_accessor :segments, :predicates, :flags - def initialize( str ) - @segments = [] - @predicates = [] - @flags = nil - while str =~ /^\/?(\/|[^\/\[]+)(?:\[([^\]]+)\])?/ - @segments.push $1 - @predicates.push $2 - str = $' - end - unless str.to_s.empty? - @segments += str.split( "/" ) - end - if @segments.length == 0 - @segments.push "." - end - end - def self.each_path( str ) - # - # Find choices - # - paths = [] - str = "(#{ str })" - while str.sub!( /\(([^()]+)\)/, "\n#{ paths.length }\n" ) - paths.push $1.split( '|' ) - end - - # - # Construct all possible paths - # - all = [ str ] - ( paths.length - 1 ).downto( 0 ) do |i| - all = all.collect do |a| - paths[i].collect do |p| - a.gsub( /\n#{ i }\n/, p ) - end - end.flatten.uniq - end - all.collect do |path| - yield YPath.new( path ) - end - end - end - -end diff --git a/Src/StdLib/ruby/1.9.1/sync.rb b/Src/StdLib/ruby/1.9.1/sync.rb deleted file mode 100644 index af6340a0e..000000000 --- a/Src/StdLib/ruby/1.9.1/sync.rb +++ /dev/null @@ -1,307 +0,0 @@ -# -# sync.rb - 2 phase lock with counter -# $Release Version: 1.0$ -# $Revision: 27967 $ -# by Keiju ISHITSUKA(keiju@ishitsuka.com) -# -# -- -# Sync_m, Synchronizer_m -# Usage: -# obj.extend(Sync_m) -# or -# class Foo -# include Sync_m -# : -# end -# -# Sync_m#sync_mode -# Sync_m#sync_locked?, locked? -# Sync_m#sync_shared?, shared? -# Sync_m#sync_exclusive?, sync_exclusive? -# Sync_m#sync_try_lock, try_lock -# Sync_m#sync_lock, lock -# Sync_m#sync_unlock, unlock -# -# Sync, Synchronizer: -# Usage: -# sync = Sync.new -# -# Sync#mode -# Sync#locked? -# Sync#shared? -# Sync#exclusive? -# Sync#try_lock(mode) -- mode = :EX, :SH, :UN -# Sync#lock(mode) -- mode = :EX, :SH, :UN -# Sync#unlock -# Sync#synchronize(mode) {...} -# -# - -unless defined? Thread - raise "Thread not available for this ruby interpreter" -end - -module Sync_m - RCS_ID='-$Id: sync.rb 27967 2010-05-23 08:48:44Z nobu $-' - - # lock mode - UN = :UN - SH = :SH - EX = :EX - - # exceptions - class Err < StandardError - def Err.Fail(*opt) - fail self, sprintf(self::Message, *opt) - end - - class UnknownLocker < Err - Message = "Thread(%s) not locked." - def UnknownLocker.Fail(th) - super(th.inspect) - end - end - - class LockModeFailer < Err - Message = "Unknown lock mode(%s)" - def LockModeFailer.Fail(mode) - if mode.id2name - mode = id2name - end - super(mode) - end - end - end - - def Sync_m.define_aliases(cl) - cl.module_eval %q{ - alias locked? sync_locked? - alias shared? sync_shared? - alias exclusive? sync_exclusive? - alias lock sync_lock - alias unlock sync_unlock - alias try_lock sync_try_lock - alias synchronize sync_synchronize - } - end - - def Sync_m.append_features(cl) - super - # do nothing for Modules - # make aliases for Classes. - define_aliases(cl) unless cl.instance_of?(Module) - self - end - - def Sync_m.extend_object(obj) - super - obj.sync_extend - end - - def sync_extend - unless (defined? locked? and - defined? shared? and - defined? exclusive? and - defined? lock and - defined? unlock and - defined? try_lock and - defined? synchronize) - Sync_m.define_aliases(singleton_class) - end - sync_initialize - end - - # accessing - def sync_locked? - sync_mode != UN - end - - def sync_shared? - sync_mode == SH - end - - def sync_exclusive? - sync_mode == EX - end - - # locking methods. - def sync_try_lock(mode = EX) - return unlock if mode == UN - @sync_mutex.synchronize do - ret = sync_try_lock_sub(mode) - end - ret - end - - def sync_lock(m = EX) - return unlock if m == UN - - while true - @sync_mutex.synchronize do - if sync_try_lock_sub(m) - return self - else - if sync_sh_locker[Thread.current] - sync_upgrade_waiting.push [Thread.current, sync_sh_locker[Thread.current]] - sync_sh_locker.delete(Thread.current) - else - sync_waiting.push Thread.current - end - @sync_mutex.sleep - end - end - end - self - end - - def sync_unlock(m = EX) - wakeup_threads = [] - @sync_mutex.synchronize do - if sync_mode == UN - Err::UnknownLocker.Fail(Thread.current) - end - - m = sync_mode if m == EX and sync_mode == SH - - runnable = false - case m - when UN - Err::UnknownLocker.Fail(Thread.current) - - when EX - if sync_ex_locker == Thread.current - if (self.sync_ex_count = sync_ex_count - 1) == 0 - self.sync_ex_locker = nil - if sync_sh_locker.include?(Thread.current) - self.sync_mode = SH - else - self.sync_mode = UN - end - runnable = true - end - else - Err::UnknownLocker.Fail(Thread.current) - end - - when SH - if (count = sync_sh_locker[Thread.current]).nil? - Err::UnknownLocker.Fail(Thread.current) - else - if (sync_sh_locker[Thread.current] = count - 1) == 0 - sync_sh_locker.delete(Thread.current) - if sync_sh_locker.empty? and sync_ex_count == 0 - self.sync_mode = UN - runnable = true - end - end - end - end - - if runnable - if sync_upgrade_waiting.size > 0 - th, count = sync_upgrade_waiting.shift - sync_sh_locker[th] = count - th.wakeup - wakeup_threads.push th - else - wait = sync_waiting - self.sync_waiting = [] - for th in wait - th.wakeup - wakeup_threads.push th - end - end - end - end - for th in wakeup_threads - th.run - end - self - end - - def sync_synchronize(mode = EX) - sync_lock(mode) - begin - yield - ensure - sync_unlock - end - end - - attr_accessor :sync_mode - - attr_accessor :sync_waiting - attr_accessor :sync_upgrade_waiting - attr_accessor :sync_sh_locker - attr_accessor :sync_ex_locker - attr_accessor :sync_ex_count - - def sync_inspect - sync_iv = instance_variables.select{|iv| /^@sync_/ =~ iv.id2name}.collect{|iv| iv.id2name + '=' + instance_eval(iv.id2name).inspect}.join(",") - print "<#{self.class}.extend Sync_m: #{inspect}, " - end - - private - - def sync_initialize - @sync_mode = UN - @sync_waiting = [] - @sync_upgrade_waiting = [] - @sync_sh_locker = Hash.new - @sync_ex_locker = nil - @sync_ex_count = 0 - - @sync_mutex = Mutex.new - end - - def initialize(*args) - super - sync_initialize - end - - def sync_try_lock_sub(m) - case m - when SH - case sync_mode - when UN - self.sync_mode = m - sync_sh_locker[Thread.current] = 1 - ret = true - when SH - count = 0 unless count = sync_sh_locker[Thread.current] - sync_sh_locker[Thread.current] = count + 1 - ret = true - when EX - # in EX mode, lock will upgrade to EX lock - if sync_ex_locker == Thread.current - self.sync_ex_count = sync_ex_count + 1 - ret = true - else - ret = false - end - end - when EX - if sync_mode == UN or - sync_mode == SH && sync_sh_locker.size == 1 && sync_sh_locker.include?(Thread.current) - self.sync_mode = m - self.sync_ex_locker = Thread.current - self.sync_ex_count = 1 - ret = true - elsif sync_mode == EX && sync_ex_locker == Thread.current - self.sync_ex_count = sync_ex_count + 1 - ret = true - else - ret = false - end - else - Err::LockModeFailer.Fail mode - end - return ret - end -end -Synchronizer_m = Sync_m - -class Sync - include Sync_m -end -Synchronizer = Sync diff --git a/Src/StdLib/ruby/1.9.1/thwait.rb b/Src/StdLib/ruby/1.9.1/thwait.rb deleted file mode 100644 index 57ba8f631..000000000 --- a/Src/StdLib/ruby/1.9.1/thwait.rb +++ /dev/null @@ -1,143 +0,0 @@ -# -# thwait.rb - thread synchronization class -# $Release Version: 0.9 $ -# $Revision: 1.3 $ -# by Keiju ISHITSUKA(Nihon Rational Software Co.,Ltd.) - -require "thread.rb" -require "e2mmap.rb" - -# -# This class watches for termination of multiple threads. Basic functionality -# (wait until specified threads have terminated) can be accessed through the -# class method ThreadsWait::all_waits. Finer control can be gained using -# instance methods. -# -# Example: -# -# ThreadsWait.all_wait(thr1, thr2, ...) do |t| -# STDERR.puts "Thread #{t} has terminated." -# end -# -# -# th = ThreadsWait.new(thread1,...) -# th.next_wait # next one to be done -# -# -class ThreadsWait - RCS_ID='-$Id: thwait.rb,v 1.3 1998/06/26 03:19:34 keiju Exp keiju $-' - - extend Exception2MessageMapper - def_exception("ErrNoWaitingThread", "No threads for waiting.") - def_exception("ErrNoFinishedThread", "No finished threads.") - - # - # Waits until all specified threads have terminated. If a block is provided, - # it is executed for each thread as they terminate. - # - def ThreadsWait.all_waits(*threads) # :yield: thread - tw = ThreadsWait.new(*threads) - if block_given? - tw.all_waits do |th| - yield th - end - else - tw.all_waits - end - end - - # - # Creates a ThreadsWait object, specifying the threads to wait on. - # Non-blocking. - # - def initialize(*threads) - @threads = [] - @wait_queue = Queue.new - join_nowait(*threads) unless threads.empty? - end - - # Returns the array of threads that have not terminated yet. - attr :threads - - # - # Returns +true+ if there are no threads in the pool still running. - # - def empty? - @threads.empty? - end - - # - # Returns +true+ if any thread has terminated and is ready to be collected. - # - def finished? - !@wait_queue.empty? - end - - # - # Waits for specified threads to terminate, and returns when one of - # the threads terminated. - # - def join(*threads) - join_nowait(*threads) - next_wait - end - - # - # Specifies the threads that this object will wait for, but does not actually - # wait. - # - def join_nowait(*threads) - threads.flatten! - @threads.concat threads - for th in threads - Thread.start(th) do |t| - begin - t.join - ensure - @wait_queue.push t - end - end - end - end - - # - # Waits until any of the specified threads has terminated, and returns the one - # that does. - # - # If there is no thread to wait, raises +ErrNoWaitingThread+. If +nonblock+ - # is true, and there is no terminated thread, raises +ErrNoFinishedThread+. - # - def next_wait(nonblock = nil) - ThreadsWait.fail ErrNoWaitingThread if @threads.empty? - begin - @threads.delete(th = @wait_queue.pop(nonblock)) - th - rescue ThreadError - ThreadsWait.fail ErrNoFinishedThread - end - end - - # - # Waits until all of the specified threads are terminated. If a block is - # supplied for the method, it is executed for each thread termination. - # - # Raises exceptions in the same manner as +next_wait+. - # - def all_waits - until @threads.empty? - th = next_wait - yield th if block_given? - end - end -end - -ThWait = ThreadsWait - - -# Documentation comments: -# - Source of documentation is evenly split between Nutshell, existing -# comments, and my own rephrasing. -# - I'm not particularly confident that the comments are all exactly correct. -# - The history, etc., up the top appears in the RDoc output. Perhaps it would -# be better to direct that not to appear, and put something else there -# instead. diff --git a/Src/StdLib/ruby/1.9.1/ubygems.rb b/Src/StdLib/ruby/1.9.1/ubygems.rb deleted file mode 100644 index 66a8a589c..000000000 --- a/Src/StdLib/ruby/1.9.1/ubygems.rb +++ /dev/null @@ -1,10 +0,0 @@ -# This file allows for the running of rubygems with a nice -# command line look-and-feel: ruby -rubygems foo.rb -#-- -# Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others. -# All rights reserved. -# See LICENSE.txt for permissions. -#++ - - -require 'rubygems' diff --git a/Src/StdLib/ruby/1.9.1/xmlrpc/base64.rb b/Src/StdLib/ruby/1.9.1/xmlrpc/base64.rb deleted file mode 100644 index e46c85c8a..000000000 --- a/Src/StdLib/ruby/1.9.1/xmlrpc/base64.rb +++ /dev/null @@ -1,81 +0,0 @@ -=begin -= xmlrpc/base64.rb -Copyright (C) 2001, 2002, 2003 by Michael Neumann (mneumann@ntecs.de) - -Released under the same term of license as Ruby. - -= Classes -* (()) - -= XMLRPC::Base64 -== Description -This class is necessary for (('xmlrpc4r')) to determine that a string should -be transmitted base64-encoded and not as a raw-string. -You can use (({XMLRPC::Base64})) on the client and server-side as a -parameter and/or return-value. - -== Class Methods ---- XMLRPC::Base64.new( str, state = :dec ) - Creates a new (({XMLRPC::Base64})) instance with string ((|str|)) as the - internal string. When ((|state|)) is (({:dec})) it assumes that the - string ((|str|)) is not in base64 format (perhaps already decoded), - otherwise if ((|state|)) is (({:enc})) it decodes ((|str|)) - and stores it as the internal string. - ---- XMLRPC::Base64.decode( str ) - Decodes string ((|str|)) with base64 and returns that value. - ---- XMLRPC::Base64.encode( str ) - Encodes string ((|str|)) with base64 and returns that value. - -== Instance Methods ---- XMLRPC::Base64#decoded - Returns the internal string decoded. - ---- XMLRPC::Base64#encoded - Returns the internal string encoded with base64. - -=end - -module XMLRPC - -class Base64 - - def initialize(str, state = :dec) - case state - when :enc - @str = Base64.decode(str) - when :dec - @str = str - else - raise ArgumentError, "wrong argument; either :enc or :dec" - end - end - - def decoded - @str - end - - def encoded - Base64.encode(@str) - end - - - def Base64.decode(str) - str.gsub(/\s+/, "").unpack("m")[0] - end - - def Base64.encode(str) - [str].pack("m") - end - -end - - -end # module XMLRPC - - -=begin -= History - $Id: base64.rb 25189 2009-10-02 12:04:37Z akr $ -=end diff --git a/Src/StdLib/ruby/1.9.1/xmlrpc/client.rb b/Src/StdLib/ruby/1.9.1/xmlrpc/client.rb deleted file mode 100644 index 88bd4572d..000000000 --- a/Src/StdLib/ruby/1.9.1/xmlrpc/client.rb +++ /dev/null @@ -1,625 +0,0 @@ -=begin -= xmlrpc/client.rb -Copyright (C) 2001, 2002, 2003 by Michael Neumann (mneumann@ntecs.de) - -Released under the same term of license as Ruby. - -= Classes -* (()) -* (()) - - -= XMLRPC::Client -== Synopsis - require "xmlrpc/client" - - server = XMLRPC::Client.new("www.ruby-lang.org", "/RPC2", 80) - begin - param = server.call("michael.add", 4, 5) - puts "4 + 5 = #{param}" - rescue XMLRPC::FaultException => e - puts "Error:" - puts e.faultCode - puts e.faultString - end - -or - - require "xmlrpc/client" - - server = XMLRPC::Client.new("www.ruby-lang.org", "/RPC2", 80) - ok, param = server.call2("michael.add", 4, 5) - if ok then - puts "4 + 5 = #{param}" - else - puts "Error:" - puts param.faultCode - puts param.faultString - end - -== Description -Class (({XMLRPC::Client})) provides remote procedure calls to a XML-RPC server. -After setting the connection-parameters with (()) which -creates a new (({XMLRPC::Client})) instance, you can execute a remote procedure -by sending the (()) or (()) -message to this new instance. The given parameters indicate which method to -call on the remote-side and of course the parameters for the remote procedure. - -== Class Methods ---- XMLRPC::Client.new( host=nil, path=nil, port=nil, proxy_host=nil, proxy_port=nil, user=nil, password=nil, use_ssl=false, timeout =nil) - Creates an object which represents the remote XML-RPC server on the - given host ((|host|)). If the server is CGI-based, ((|path|)) is the - path to the CGI-script, which will be called, otherwise (in the - case of a standalone server) ((|path|)) should be (({"/RPC2"})). - ((|port|)) is the port on which the XML-RPC server listens. - If ((|proxy_host|)) is given, then a proxy server listening at - ((|proxy_host|)) is used. ((|proxy_port|)) is the port of the - proxy server. - - Default values for ((|host|)), ((|path|)) and ((|port|)) are 'localhost', '/RPC2' and - '80' respectively using SSL '443'. - - If ((|user|)) and ((|password|)) are given, each time a request is send, - a Authorization header is send. Currently only Basic Authentification is - implemented no Digest. - - If ((|use_ssl|)) is set to (({true})), comunication over SSL is enabled. - Note, that you need the SSL package from RAA installed. - - Parameter ((|timeout|)) is the time to wait for a XML-RPC response, defaults to 30. - ---- XMLRPC::Client.new2( uri, proxy=nil, timeout=nil) ---- XMLRPC::Client.new_from_uri( uri, proxy=nil, timeout=nil) -: uri - URI specifying protocol (http or https), host, port, path, user and password. - Example: https://user:password@host:port/path - -: proxy - Is of the form "host:port". - -: timeout - Defaults to 30. - ---- XMLRPC::Client.new3( hash={} ) ---- XMLRPC::Client.new_from_hash( hash={} ) - Parameter ((|hash|)) has following case-insensitive keys: - * host - * path - * port - * proxy_host - * proxy_port - * user - * password - * use_ssl - * timeout - - Calls (()) with the corresponding values. - -== Instance Methods ---- XMLRPC::Client#call( method, *args ) - Invokes the method named ((|method|)) with the parameters given by - ((|args|)) on the XML-RPC server. - The parameter ((|method|)) is converted into a (({String})) and should - be a valid XML-RPC method-name. - Each parameter of ((|args|)) must be of one of the following types, - where (({Hash})), (({Struct})) and (({Array})) can contain any of these listed ((:types:)): - * (({Fixnum})), (({Bignum})) - * (({TrueClass})), (({FalseClass})) ((({true})), (({false}))) - * (({String})), (({Symbol})) - * (({Float})) - * (({Hash})), (({Struct})) - * (({Array})) - * (({Date})), (({Time})), (({XMLRPC::DateTime})) - * (({XMLRPC::Base64})) - * A Ruby object which class includes XMLRPC::Marshallable (only if Config::ENABLE_MARSHALLABLE is (({true}))). - That object is converted into a hash, with one additional key/value pair "___class___" which contains the class name - for restoring later that object. - - The method returns the return-value from the RPC - ((-stands for Remote Procedure Call-)). - The type of the return-value is one of the above shown, - only that a (({Bignum})) is only allowed when it fits in 32-bit and - that a XML-RPC (('dateTime.iso8601')) type is always returned as - a ((<(({XMLRPC::DateTime}))|URL:datetime.html>)) object and - a (({Struct})) is never returned, only a (({Hash})), the same for a (({Symbol})), where - always a (({String})) is returned. - A (({XMLRPC::Base64})) is returned as a (({String})) from xmlrpc4r version 1.6.1 on. - - If the remote procedure returned a fault-structure, then a - (({XMLRPC::FaultException})) exception is raised, which has two accessor-methods - (({faultCode})) and (({faultString})) of type (({Integer})) and (({String})). - ---- XMLRPC::Client#call2( method, *args ) - The difference between this method and (()) is, that - this method do ((*not*)) raise a (({XMLRPC::FaultException})) exception. - The method returns an array of two values. The first value indicates if - the second value is a return-value ((({true}))) or an object of type - (({XMLRPC::FaultException})). - Both are explained in (()). - - Simple to remember: The "2" in "call2" denotes the number of values it returns. - ---- XMLRPC::Client#multicall( *methods ) - You can use this method to execute several methods on a XMLRPC server which supports - the multi-call extension. - Example: - - s.multicall( - ['michael.add', 3, 4], - ['michael.sub', 4, 5] - ) - # => [7, -1] - ---- XMLRPC::Client#multicall2( *methods ) - Same as (()), but returns like (()) two parameters - instead of raising an (({XMLRPC::FaultException})). - ---- XMLRPC::Client#proxy( prefix, *args ) - Returns an object of class (({XMLRPC::Client::Proxy})), initialized with - ((|prefix|)) and ((|args|)). A proxy object returned by this method behaves - like (()), i.e. a call on that object will raise a - (({XMLRPC::FaultException})) when a fault-structure is returned by that call. - ---- XMLRPC::Client#proxy2( prefix, *args ) - Almost the same like (()) only that a call on the returned - (({XMLRPC::Client::Proxy})) object behaves like (()), i.e. - a call on that object will return two parameters. - - - - ---- XMLRPC::Client#call_async(...) ---- XMLRPC::Client#call2_async(...) ---- XMLRPC::Client#multicall_async(...) ---- XMLRPC::Client#multicall2_async(...) ---- XMLRPC::Client#proxy_async(...) ---- XMLRPC::Client#proxy2_async(...) - In contrast to corresponding methods without "_async", these can be - called concurrently and use for each request a new connection, where the - non-asynchronous counterparts use connection-alive (one connection for all requests) - if possible. - - Note, that you have to use Threads to call these methods concurrently. - The following example calls two methods concurrently: - - Thread.new { - p client.call_async("michael.add", 4, 5) - } - - Thread.new { - p client.call_async("michael.div", 7, 9) - } - - ---- XMLRPC::Client#timeout ---- XMLRPC::Client#user ---- XMLRPC::Client#password - Return the corresponding attributes. - ---- XMLRPC::Client#timeout= (new_timeout) ---- XMLRPC::Client#user= (new_user) ---- XMLRPC::Client#password= (new_password) - Set the corresponding attributes. - - ---- XMLRPC::Client#set_writer( writer ) - Sets the XML writer to use for generating XML output. - Should be an instance of a class from module (({XMLRPC::XMLWriter})). - If this method is not called, then (({XMLRPC::Config::DEFAULT_WRITER})) is used. - ---- XMLRPC::Client#set_parser( parser ) - Sets the XML parser to use for parsing XML documents. - Should be an instance of a class from module (({XMLRPC::XMLParser})). - If this method is not called, then (({XMLRPC::Config::DEFAULT_PARSER})) is used. - ---- XMLRPC::Client#cookie ---- XMLRPC::Client#cookie= (cookieString) - Get and set the HTTP Cookie header. - ---- XMLRPC::Client#http_header_extra= (additionalHeaders) - Set extra HTTP headers that are included in the request. - ---- XMLRPC::Client#http_header_extra - Access the via (()) assigned header. - ---- XMLRPC::Client#http_last_response - Returns the (({Net::HTTPResponse})) object of the last RPC. - -= XMLRPC::Client::Proxy -== Synopsis - require "xmlrpc/client" - - server = XMLRPC::Client.new("www.ruby-lang.org", "/RPC2", 80) - - michael = server.proxy("michael") - michael2 = server.proxy("michael", 4) - - # both calls should return the same value '9'. - p michael.add(4,5) - p michael2.add(5) - -== Description -Class (({XMLRPC::Client::Proxy})) makes XML-RPC calls look nicer! -You can call any method onto objects of that class - the object handles -(({method_missing})) and will forward the method call to a XML-RPC server. -Don't use this class directly, but use instead method (()) or -(()). - -== Class Methods ---- XMLRPC::Client::Proxy.new( server, prefix, args=[], meth=:call, delim="." ) - Creates an object which provides (({method_missing})). - - ((|server|)) must be of type (({XMLRPC::Client})), which is the XML-RPC server to be used - for a XML-RPC call. ((|prefix|)) and ((|delim|)) will be prepended to the methodname - called onto this object. - - Parameter ((|meth|)) is the method (call, call2, call_async, call2_async) to use for - a RPC. - - ((|args|)) are arguments which are automatically given - to every XML-RPC call before the arguments provides through (({method_missing})). - -== Instance Methods -Every method call is forwarded to the XML-RPC server defined in (()). - -Note: Inherited methods from class (({Object})) cannot be used as XML-RPC names, because they get around -(({method_missing})). - - - -= History - $Id: client.rb 25189 2009-10-02 12:04:37Z akr $ - -=end - - - -require "xmlrpc/parser" -require "xmlrpc/create" -require "xmlrpc/config" -require "xmlrpc/utils" # ParserWriterChooseMixin -require "net/http" - -module XMLRPC - - class Client - - USER_AGENT = "XMLRPC::Client (Ruby #{RUBY_VERSION})" - - include ParserWriterChooseMixin - include ParseContentType - - - # Constructors ------------------------------------------------------------------- - - def initialize(host=nil, path=nil, port=nil, proxy_host=nil, proxy_port=nil, - user=nil, password=nil, use_ssl=nil, timeout=nil) - - @http_header_extra = nil - @http_last_response = nil - @cookie = nil - - @host = host || "localhost" - @path = path || "/RPC2" - @proxy_host = proxy_host - @proxy_port = proxy_port - @proxy_host ||= 'localhost' if @proxy_port != nil - @proxy_port ||= 8080 if @proxy_host != nil - @use_ssl = use_ssl || false - @timeout = timeout || 30 - - if use_ssl - require "net/https" - @port = port || 443 - else - @port = port || 80 - end - - @user, @password = user, password - - set_auth - - # convert ports to integers - @port = @port.to_i if @port != nil - @proxy_port = @proxy_port.to_i if @proxy_port != nil - - # HTTP object for synchronous calls - Net::HTTP.version_1_2 - @http = Net::HTTP.new(@host, @port, @proxy_host, @proxy_port) - @http.use_ssl = @use_ssl if @use_ssl - @http.read_timeout = @timeout - @http.open_timeout = @timeout - - @parser = nil - @create = nil - end - - - class << self - - def new2(uri, proxy=nil, timeout=nil) - if match = /^([^:]+):\/\/(([^@]+)@)?([^\/]+)(\/.*)?$/.match(uri) - proto = match[1] - user, passwd = (match[3] || "").split(":") - host, port = match[4].split(":") - path = match[5] - - if proto != "http" and proto != "https" - raise "Wrong protocol specified. Only http or https allowed!" - end - - else - raise "Wrong URI as parameter!" - end - - proxy_host, proxy_port = (proxy || "").split(":") - - self.new(host, path, port, proxy_host, proxy_port, user, passwd, (proto == "https"), timeout) - end - - alias new_from_uri new2 - - def new3(hash={}) - - # convert all keys into lowercase strings - h = {} - hash.each { |k,v| h[k.to_s.downcase] = v } - - self.new(h['host'], h['path'], h['port'], h['proxy_host'], h['proxy_port'], h['user'], h['password'], - h['use_ssl'], h['timeout']) - end - - alias new_from_hash new3 - - end - - - # Attribute Accessors ------------------------------------------------------------------- - - # add additional HTTP headers to the request - attr_accessor :http_header_extra - - # makes last HTTP response accessible - attr_reader :http_last_response - - # Cookie support - attr_accessor :cookie - - - attr_reader :timeout, :user, :password - - def timeout=(new_timeout) - @timeout = new_timeout - @http.read_timeout = @timeout - @http.open_timeout = @timeout - end - - def user=(new_user) - @user = new_user - set_auth - end - - def password=(new_password) - @password = new_password - set_auth - end - - # Call methods -------------------------------------------------------------- - - def call(method, *args) - ok, param = call2(method, *args) - if ok - param - else - raise param - end - end - - def call2(method, *args) - request = create().methodCall(method, *args) - data = do_rpc(request, false) - parser().parseMethodResponse(data) - end - - def call_async(method, *args) - ok, param = call2_async(method, *args) - if ok - param - else - raise param - end - end - - def call2_async(method, *args) - request = create().methodCall(method, *args) - data = do_rpc(request, true) - parser().parseMethodResponse(data) - end - - - # Multicall methods -------------------------------------------------------------- - - def multicall(*methods) - ok, params = multicall2(*methods) - if ok - params - else - raise params - end - end - - def multicall2(*methods) - gen_multicall(methods, false) - end - - def multicall_async(*methods) - ok, params = multicall2_async(*methods) - if ok - params - else - raise params - end - end - - def multicall2_async(*methods) - gen_multicall(methods, true) - end - - - # Proxy generating methods ------------------------------------------ - - def proxy(prefix=nil, *args) - Proxy.new(self, prefix, args, :call) - end - - def proxy2(prefix=nil, *args) - Proxy.new(self, prefix, args, :call2) - end - - def proxy_async(prefix=nil, *args) - Proxy.new(self, prefix, args, :call_async) - end - - def proxy2_async(prefix=nil, *args) - Proxy.new(self, prefix, args, :call2_async) - end - - - private # ---------------------------------------------------------- - - def set_auth - if @user.nil? - @auth = nil - else - a = "#@user" - a << ":#@password" if @password != nil - @auth = ("Basic " + [a].pack("m")).chomp - end - end - - def do_rpc(request, async=false) - header = { - "User-Agent" => USER_AGENT, - "Content-Type" => "text/xml; charset=utf-8", - "Content-Length" => request.size.to_s, - "Connection" => (async ? "close" : "keep-alive") - } - - header["Cookie"] = @cookie if @cookie - header.update(@http_header_extra) if @http_header_extra - - if @auth != nil - # add authorization header - header["Authorization"] = @auth - end - - resp = nil - @http_last_response = nil - - if async - # use a new HTTP object for each call - Net::HTTP.version_1_2 - http = Net::HTTP.new(@host, @port, @proxy_host, @proxy_port) - http.use_ssl = @use_ssl if @use_ssl - http.read_timeout = @timeout - http.open_timeout = @timeout - - # post request - http.start { - resp = http.post2(@path, request, header) - } - else - # reuse the HTTP object for each call => connection alive is possible - # we must start connection explicitely first time so that http.request - # does not assume that we don't want keepalive - @http.start if not @http.started? - - # post request - resp = @http.post2(@path, request, header) - end - - @http_last_response = resp - - data = resp.body - - if resp.code == "401" - # Authorization Required - raise "Authorization failed.\nHTTP-Error: #{resp.code} #{resp.message}" - elsif resp.code[0,1] != "2" - raise "HTTP-Error: #{resp.code} #{resp.message}" - end - - ct = parse_content_type(resp["Content-Type"]).first - if ct != "text/xml" - if ct == "text/html" - raise "Wrong content-type (received '#{ct}' but expected 'text/xml'): \n#{data}" - else - raise "Wrong content-type (received '#{ct}' but expected 'text/xml')" - end - end - - expected = resp["Content-Length"] || "" - if data.nil? or data.size == 0 - raise "Wrong size. Was #{data.size}, should be #{expected}" - elsif expected != "" and expected.to_i != data.size and resp["Transfer-Encoding"].nil? - raise "Wrong size. Was #{data.size}, should be #{expected}" - end - - set_cookies = resp.get_fields("Set-Cookie") - if set_cookies and !set_cookies.empty? - require 'webrick/cookie' - @cookie = set_cookies.collect do |set_cookie| - cookie = WEBrick::Cookie.parse_set_cookie(set_cookie) - WEBrick::Cookie.new(cookie.name, cookie.value).to_s - end.join("; ") - end - - return data - end - - def gen_multicall(methods=[], async=false) - meth = :call2 - meth = :call2_async if async - - ok, params = self.send(meth, "system.multicall", - methods.collect {|m| {'methodName' => m[0], 'params' => m[1..-1]} } - ) - - if ok - params = params.collect do |param| - if param.is_a? Array - param[0] - elsif param.is_a? Hash - XMLRPC::FaultException.new(param["faultCode"], param["faultString"]) - else - raise "Wrong multicall return value" - end - end - end - - return ok, params - end - - - - class Proxy - - def initialize(server, prefix, args=[], meth=:call, delim=".") - @server = server - @prefix = prefix ? prefix + delim : "" - @args = args - @meth = meth - end - - def method_missing(mid, *args) - pre = @prefix + mid.to_s - arg = @args + args - @server.send(@meth, pre, *arg) - end - - end # class Proxy - - end # class Client - -end # module XMLRPC - diff --git a/Src/StdLib/ruby/1.9.1/xmlrpc/config.rb b/Src/StdLib/ruby/1.9.1/xmlrpc/config.rb deleted file mode 100644 index d24142ed4..000000000 --- a/Src/StdLib/ruby/1.9.1/xmlrpc/config.rb +++ /dev/null @@ -1,40 +0,0 @@ -# -# $Id: config.rb 25189 2009-10-02 12:04:37Z akr $ -# Configuration file for XML-RPC for Ruby -# - -module XMLRPC - - module Config - - DEFAULT_WRITER = XMLWriter::Simple # or XMLWriter::XMLParser - - # available parser: - # * XMLParser::NQXMLTreeParser - # * XMLParser::NQXMLStreamParser - # * XMLParser::XMLTreeParser - # * XMLParser::XMLStreamParser (fastest) - # * XMLParser::REXMLStreamParser - # * XMLParser::XMLScanStreamParser - DEFAULT_PARSER = XMLParser::REXMLStreamParser - - # enable tag - ENABLE_NIL_CREATE = false - ENABLE_NIL_PARSER = false - - # allows integers greater than 32-bit if true - ENABLE_BIGINT = false - - # enable marshalling ruby objects which include XMLRPC::Marshallable - ENABLE_MARSHALLING = true - - # enable multiCall extension by default - ENABLE_MULTICALL = false - - # enable Introspection extension by default - ENABLE_INTROSPECTION = false - - end - -end - diff --git a/Src/StdLib/ruby/1.9.1/xmlrpc/create.rb b/Src/StdLib/ruby/1.9.1/xmlrpc/create.rb deleted file mode 100644 index 652c654ef..000000000 --- a/Src/StdLib/ruby/1.9.1/xmlrpc/create.rb +++ /dev/null @@ -1,283 +0,0 @@ -# -# Creates XML-RPC call/response documents -# -# Copyright (C) 2001, 2002, 2003 by Michael Neumann (mneumann@ntecs.de) -# -# $Id: create.rb 25189 2009-10-02 12:04:37Z akr $ -# - -require "date" -require "xmlrpc/base64" - -module XMLRPC - - module XMLWriter - - class Abstract - def ele(name, *children) - element(name, nil, *children) - end - - def tag(name, txt) - element(name, nil, text(txt)) - end - end - - - class Simple < Abstract - - def document_to_str(doc) - doc - end - - def document(*params) - params.join("") - end - - def pi(name, *params) - "" - end - - def element(name, attrs, *children) - raise "attributes not yet implemented" unless attrs.nil? - if children.empty? - "<#{name}/>" - else - "<#{name}>" + children.join("") + "" - end - end - - def text(txt) - cleaned = txt.dup - cleaned.gsub!(/&/, '&') - cleaned.gsub!(//, '>') - cleaned - end - - end # class Simple - - - class XMLParser < Abstract - - def initialize - require "xmltreebuilder" - end - - def document_to_str(doc) - doc.to_s - end - - def document(*params) - XML::SimpleTree::Document.new(*params) - end - - def pi(name, *params) - XML::SimpleTree::ProcessingInstruction.new(name, *params) - end - - def element(name, attrs, *children) - XML::SimpleTree::Element.new(name, attrs, *children) - end - - def text(txt) - XML::SimpleTree::Text.new(txt) - end - - end # class XMLParser - - Classes = [Simple, XMLParser] - - # yields an instance of each installed XML writer - def self.each_installed_writer - XMLRPC::XMLWriter::Classes.each do |klass| - begin - yield klass.new - rescue LoadError - end - end - end - - end # module XMLWriter - - class Create - - def initialize(xml_writer = nil) - @writer = xml_writer || Config::DEFAULT_WRITER.new - end - - - def methodCall(name, *params) - name = name.to_s - - if name !~ /[a-zA-Z0-9_.:\/]+/ - raise ArgumentError, "Wrong XML-RPC method-name" - end - - parameter = params.collect do |param| - @writer.ele("param", conv2value(param)) - end - - tree = @writer.document( - @writer.pi("xml", 'version="1.0"'), - @writer.ele("methodCall", - @writer.tag("methodName", name), - @writer.ele("params", *parameter) - ) - ) - - @writer.document_to_str(tree) + "\n" - end - - - - # - # generates a XML-RPC methodResponse document - # - # if is_ret == false then the params array must - # contain only one element, which is a structure - # of a fault return-value. - # - # if is_ret == true then a normal - # return-value of all the given params is created. - # - def methodResponse(is_ret, *params) - - if is_ret - resp = params.collect do |param| - @writer.ele("param", conv2value(param)) - end - - resp = [@writer.ele("params", *resp)] - else - if params.size != 1 or params[0] === XMLRPC::FaultException - raise ArgumentError, "no valid fault-structure given" - end - resp = @writer.ele("fault", conv2value(params[0].to_h)) - end - - - tree = @writer.document( - @writer.pi("xml", 'version="1.0"'), - @writer.ele("methodResponse", resp) - ) - - @writer.document_to_str(tree) + "\n" - end - - - - ##################################### - private - ##################################### - - # - # converts a Ruby object into - # a XML-RPC tag - # - def conv2value(param) - - val = case param - when Integer - if Config::ENABLE_BIGINT or (param >= -(2**31) and param <= (2**31-1)) - @writer.tag("i4", param.to_s) - else - raise "Integer is too big! Must be signed 32-bit integer!" - end - when TrueClass, FalseClass - @writer.tag("boolean", param ? "1" : "0") - - when Symbol - @writer.tag("string", param.to_s) - - when String - @writer.tag("string", param) - - when NilClass - if Config::ENABLE_NIL_CREATE - @writer.ele("nil") - else - raise "Wrong type NilClass. Not allowed!" - end - - when Float - @writer.tag("double", param.to_s) - - when Struct - h = param.members.collect do |key| - value = param[key] - @writer.ele("member", - @writer.tag("name", key.to_s), - conv2value(value) - ) - end - - @writer.ele("struct", *h) - - when Hash - # TODO: can a Hash be empty? - - h = param.collect do |key, value| - @writer.ele("member", - @writer.tag("name", key.to_s), - conv2value(value) - ) - end - - @writer.ele("struct", *h) - - when Array - # TODO: can an Array be empty? - a = param.collect {|v| conv2value(v) } - - @writer.ele("array", - @writer.ele("data", *a) - ) - - when Time, Date, ::DateTime - @writer.tag("dateTime.iso8601", param.strftime("%Y%m%dT%H:%M:%S")) - - when XMLRPC::DateTime - @writer.tag("dateTime.iso8601", - format("%.4d%02d%02dT%02d:%02d:%02d", *param.to_a)) - - when XMLRPC::Base64 - @writer.tag("base64", param.encoded) - - else - if Config::ENABLE_MARSHALLING and param.class.included_modules.include? XMLRPC::Marshallable - # convert Ruby object into Hash - ret = {"___class___" => param.class.name} - param.instance_variables.each {|v| - name = v[1..-1] - val = param.instance_variable_get(v) - - if val.nil? - ret[name] = val if Config::ENABLE_NIL_CREATE - else - ret[name] = val - end - } - return conv2value(ret) - else - ok, pa = wrong_type(param) - if ok - return conv2value(pa) - else - raise "Wrong type!" - end - end - end - - @writer.ele("value", val) - end - - def wrong_type(value) - false - end - - - end # class Create - -end # module XMLRPC - diff --git a/Src/StdLib/ruby/1.9.1/xmlrpc/datetime.rb b/Src/StdLib/ruby/1.9.1/xmlrpc/datetime.rb deleted file mode 100644 index 6dd820b76..000000000 --- a/Src/StdLib/ruby/1.9.1/xmlrpc/datetime.rb +++ /dev/null @@ -1,142 +0,0 @@ -=begin -= xmlrpc/datetime.rb -Copyright (C) 2001, 2002, 2003 by Michael Neumann (mneumann@ntecs.de) - -Released under the same term of license as Ruby. - -= Classes -* (()) - -= XMLRPC::DateTime -== Description -This class is important to handle XMLRPC (('dateTime.iso8601')) values, -correcly, because normal UNIX-dates (class (({Date}))) only handle dates -from year 1970 on, and class (({Time})) handles dates without the time -component. (({XMLRPC::DateTime})) is able to store a XMLRPC -(('dateTime.iso8601')) value correctly. - -== Class Methods ---- XMLRPC::DateTime.new( year, month, day, hour, min, sec ) - Creates a new (({XMLRPC::DateTime})) instance with the - parameters ((|year|)), ((|month|)), ((|day|)) as date and - ((|hour|)), ((|min|)), ((|sec|)) as time. - Raises (({ArgumentError})) if a parameter is out of range, or ((|year|)) is not - of type (({Integer})). - -== Instance Methods ---- XMLRPC::DateTime#year ---- XMLRPC::DateTime#month ---- XMLRPC::DateTime#day ---- XMLRPC::DateTime#hour ---- XMLRPC::DateTime#min ---- XMLRPC::DateTime#sec - Return the value of the specified date/time component. - ---- XMLRPC::DateTime#mon - Alias for (()). - ---- XMLRPC::DateTime#year=( value ) ---- XMLRPC::DateTime#month=( value ) ---- XMLRPC::DateTime#day=( value ) ---- XMLRPC::DateTime#hour=( value ) ---- XMLRPC::DateTime#min=( value ) ---- XMLRPC::DateTime#sec=( value ) - Set ((|value|)) as the new date/time component. - Raises (({ArgumentError})) if ((|value|)) is out of range, or in the case - of (({XMLRPC::DateTime#year=})) if ((|value|)) is not of type (({Integer})). - ---- XMLRPC::DateTime#mon=( value ) - Alias for (()). - ---- XMLRPC::DateTime#to_time - Return a (({Time})) object of the date/time which (({self})) represents. - If the (('year')) is below 1970, this method returns (({nil})), - because (({Time})) cannot handle years below 1970. - The used timezone is GMT. - ---- XMLRPC::DateTime#to_date - Return a (({Date})) object of the date which (({self})) represents. - The (({Date})) object do ((*not*)) contain the time component (only date). - ---- XMLRPC::DateTime#to_a - Returns all date/time components in an array. - Returns (({[year, month, day, hour, min, sec]})). -=end - -require "date" - -module XMLRPC - -class DateTime - - attr_reader :year, :month, :day, :hour, :min, :sec - - def year= (value) - raise ArgumentError, "date/time out of range" unless value.is_a? Integer - @year = value - end - - def month= (value) - raise ArgumentError, "date/time out of range" unless (1..12).include? value - @month = value - end - - def day= (value) - raise ArgumentError, "date/time out of range" unless (1..31).include? value - @day = value - end - - def hour= (value) - raise ArgumentError, "date/time out of range" unless (0..24).include? value - @hour = value - end - - def min= (value) - raise ArgumentError, "date/time out of range" unless (0..59).include? value - @min = value - end - - def sec= (value) - raise ArgumentError, "date/time out of range" unless (0..59).include? value - @sec = value - end - - alias mon month - alias mon= month= - - - def initialize(year, month, day, hour, min, sec) - self.year, self.month, self.day = year, month, day - self.hour, self.min, self.sec = hour, min, sec - end - - def to_time - if @year >= 1970 - Time.gm(*to_a) - else - nil - end - end - - def to_date - Date.new(*to_a[0,3]) - end - - def to_a - [@year, @month, @day, @hour, @min, @sec] - end - - def ==(o) - self.to_a == Array(o) rescue false - end - -end - - -end # module XMLRPC - - -=begin -= History - $Id: datetime.rb 25189 2009-10-02 12:04:37Z akr $ -=end diff --git a/Src/StdLib/ruby/1.9.1/xmlrpc/httpserver.rb b/Src/StdLib/ruby/1.9.1/xmlrpc/httpserver.rb deleted file mode 100644 index daaa36ab6..000000000 --- a/Src/StdLib/ruby/1.9.1/xmlrpc/httpserver.rb +++ /dev/null @@ -1,178 +0,0 @@ -# -# Implements a simple HTTP-server by using John W. Small's (jsmall@laser.net) -# ruby-generic-server. -# -# Copyright (C) 2001, 2002, 2003 by Michael Neumann (mneumann@ntecs.de) -# -# $Id: httpserver.rb 25189 2009-10-02 12:04:37Z akr $ -# - - -require "gserver" - -class HttpServer < GServer - - ## - # handle_obj specifies the object, that receives calls to request_handler - # and ip_auth_handler - def initialize(handle_obj, port = 8080, host = DEFAULT_HOST, maxConnections = 4, - stdlog = $stdout, audit = true, debug = true) - @handler = handle_obj - super(port, host, maxConnections, stdlog, audit, debug) - end - -private - - # Constants ----------------------------------------------- - - CRLF = "\r\n" - HTTP_PROTO = "HTTP/1.0" - SERVER_NAME = "HttpServer (Ruby #{RUBY_VERSION})" - - DEFAULT_HEADER = { - "Server" => SERVER_NAME - } - - ## - # Mapping of status code and error message - # - StatusCodeMapping = { - 200 => "OK", - 400 => "Bad Request", - 403 => "Forbidden", - 405 => "Method Not Allowed", - 411 => "Length Required", - 500 => "Internal Server Error" - } - - # Classes ------------------------------------------------- - - class Request - attr_reader :data, :header, :method, :path, :proto - - def initialize(data, method=nil, path=nil, proto=nil) - @header, @data = Table.new, data - @method, @path, @proto = method, path, proto - end - - def content_length - len = @header['Content-Length'] - return nil if len.nil? - return len.to_i - end - - end - - class Response - attr_reader :header - attr_accessor :body, :status, :status_message - - def initialize(status=200) - @status = status - @status_message = nil - @header = Table.new - end - end - - - ## - # a case-insensitive Hash class for HTTP header - # - class Table - include Enumerable - - def initialize(hash={}) - @hash = hash - update(hash) - end - - def [](key) - @hash[key.to_s.capitalize] - end - - def []=(key, value) - @hash[key.to_s.capitalize] = value - end - - def update(hash) - hash.each {|k,v| self[k] = v} - self - end - - def each - @hash.each {|k,v| yield k.capitalize, v } - end - - def writeTo(port) - each { |k,v| port << "#{k}: #{v}" << CRLF } - end - end # class Table - - - # Helper Methods ------------------------------------------ - - def http_header(header=nil) - new_header = Table.new(DEFAULT_HEADER) - new_header.update(header) unless header.nil? - - new_header["Connection"] = "close" - new_header["Date"] = http_date(Time.now) - - new_header - end - - def http_date( aTime ) - aTime.gmtime.strftime( "%a, %d %b %Y %H:%M:%S GMT" ) - end - - def http_resp(status_code, status_message=nil, header=nil, body=nil) - status_message ||= StatusCodeMapping[status_code] - - str = "" - str << "#{HTTP_PROTO} #{status_code} #{status_message}" << CRLF - http_header(header).writeTo(str) - str << CRLF - str << body unless body.nil? - str - end - - # Main Serve Loop ----------------------------------------- - - def serve(io) - # perform IP authentification - unless @handler.ip_auth_handler(io) - io << http_resp(403, "Forbidden") - return - end - - # parse first line - if io.gets =~ /^(\S+)\s+(\S+)\s+(\S+)/ - request = Request.new(io, $1, $2, $3) - else - io << http_resp(400, "Bad Request") - return - end - - # parse HTTP headers - while (line=io.gets) !~ /^(\n|\r)/ - if line =~ /^([\w-]+):\s*(.*)$/ - request.header[$1] = $2.strip - end - end - - io.binmode - response = Response.new - - # execute request handler - @handler.request_handler(request, response) - - # write response back to the client - io << http_resp(response.status, response.status_message, - response.header, response.body) - - rescue Exception => e - io << http_resp(500, "Internal Server Error") - end - -end # class HttpServer - diff --git a/Src/StdLib/ruby/1.9.1/xmlrpc/marshal.rb b/Src/StdLib/ruby/1.9.1/xmlrpc/marshal.rb deleted file mode 100644 index 8c4053672..000000000 --- a/Src/StdLib/ruby/1.9.1/xmlrpc/marshal.rb +++ /dev/null @@ -1,76 +0,0 @@ -# -# Marshalling of XML-RPC methodCall and methodResponse -# -# Copyright (C) 2001, 2002, 2003 by Michael Neumann (mneumann@ntecs.de) -# -# $Id: marshal.rb 25189 2009-10-02 12:04:37Z akr $ -# - -require "xmlrpc/parser" -require "xmlrpc/create" -require "xmlrpc/config" -require "xmlrpc/utils" - -module XMLRPC - - class Marshal - include ParserWriterChooseMixin - - # class methods ------------------------------- - - class << self - - def dump_call( methodName, *params ) - new.dump_call( methodName, *params ) - end - - def dump_response( param ) - new.dump_response( param ) - end - - def load_call( stringOrReadable ) - new.load_call( stringOrReadable ) - end - - def load_response( stringOrReadable ) - new.load_response( stringOrReadable ) - end - - alias dump dump_response - alias load load_response - - end # class self - - # instance methods ---------------------------- - - def initialize( parser = nil, writer = nil ) - set_parser( parser ) - set_writer( writer ) - end - - def dump_call( methodName, *params ) - create.methodCall( methodName, *params ) - end - - def dump_response( param ) - create.methodResponse( ! param.kind_of?( XMLRPC::FaultException ) , param ) - end - - ## - # returns [ methodname, params ] - # - def load_call( stringOrReadable ) - parser.parseMethodCall( stringOrReadable ) - end - - ## - # returns paramOrFault - # - def load_response( stringOrReadable ) - parser.parseMethodResponse( stringOrReadable )[1] - end - - end # class Marshal - -end - diff --git a/Src/StdLib/ruby/1.9.1/xmlrpc/parser.rb b/Src/StdLib/ruby/1.9.1/xmlrpc/parser.rb deleted file mode 100644 index f01655194..000000000 --- a/Src/StdLib/ruby/1.9.1/xmlrpc/parser.rb +++ /dev/null @@ -1,813 +0,0 @@ -# -# Parser for XML-RPC call and response -# -# Copyright (C) 2001, 2002, 2003 by Michael Neumann (mneumann@ntecs.de) -# -# $Id: parser.rb 27235 2010-04-06 03:01:52Z naruse $ -# - - -require "date" -require "xmlrpc/base64" -require "xmlrpc/datetime" - - -# add some methods to NQXML::Node -module NQXML - class Node - - def removeChild(node) - @children.delete(node) - end - def childNodes - @children - end - def hasChildNodes - not @children.empty? - end - def [] (index) - @children[index] - end - - def nodeType - if @entity.instance_of? NQXML::Text then :TEXT - elsif @entity.instance_of? NQXML::Comment then :COMMENT - #elsif @entity.instance_of? NQXML::Element then :ELEMENT - elsif @entity.instance_of? NQXML::Tag then :ELEMENT - else :ELSE - end - end - - def nodeValue - #TODO: error when wrong Entity-type - @entity.text - end - def nodeName - #TODO: error when wrong Entity-type - @entity.name - end - end # class Node -end # module NQXML - -module XMLRPC - - class FaultException < StandardError - attr_reader :faultCode, :faultString - - alias message faultString - - def initialize(faultCode, faultString) - @faultCode = faultCode - @faultString = faultString - end - - # returns a hash - def to_h - {"faultCode" => @faultCode, "faultString" => @faultString} - end - end - - module Convert - def self.int(str) - str.to_i - end - - def self.boolean(str) - case str - when "0" then false - when "1" then true - else - raise "RPC-value of type boolean is wrong" - end - end - - def self.double(str) - str.to_f - end - - def self.dateTime(str) - case str - when /^(-?\d\d\d\d)-?(\d\d)-?(\d\d)T(\d\d):(\d\d):(\d\d)(?:Z|([+-])(\d\d):?(\d\d))?$/ - a = [$1, $2, $3, $4, $5, $6].collect{|i| i.to_i} - if $7 - ofs = $8.to_i*3600 + $9.to_i*60 - ofs = -ofs if $7=='+' - utc = Time.utc(*a) + ofs - a = [ utc.year, utc.month, utc.day, utc.hour, utc.min, utc.sec ] - end - XMLRPC::DateTime.new(*a) - when /^(-?\d\d)-?(\d\d)-?(\d\d)T(\d\d):(\d\d):(\d\d)(Z|([+-]\d\d):(\d\d))?$/ - a = [$1, $2, $3, $4, $5, $6].collect{|i| i.to_i} - if a[0] < 70 - a[0] += 2000 - else - a[0] += 1900 - end - if $7 - ofs = $8.to_i*3600 + $9.to_i*60 - ofs = -ofs if $7=='+' - utc = Time.utc(*a) + ofs - a = [ utc.year, utc.month, utc.day, utc.hour, utc.min, utc.sec ] - end - XMLRPC::DateTime.new(*a) - else - raise "wrong dateTime.iso8601 format " + str - end - end - - def self.base64(str) - XMLRPC::Base64.decode(str) - end - - def self.struct(hash) - # convert to marhalled object - klass = hash["___class___"] - if klass.nil? or Config::ENABLE_MARSHALLING == false - hash - else - begin - mod = Module - klass.split("::").each {|const| mod = mod.const_get(const.strip)} - - obj = mod.allocate - - hash.delete "___class___" - hash.each {|key, value| - obj.instance_variable_set("@#{ key }", value) if key =~ /^([a-zA-Z_]\w*)$/ - } - obj - rescue - hash - end - end - end - - def self.fault(hash) - if hash.kind_of? Hash and hash.size == 2 and - hash.has_key? "faultCode" and hash.has_key? "faultString" and - hash["faultCode"].kind_of? Integer and hash["faultString"].kind_of? String - - XMLRPC::FaultException.new(hash["faultCode"], hash["faultString"]) - else - raise "wrong fault-structure: #{hash.inspect}" - end - end - - end # module Convert - - module XMLParser - - class AbstractTreeParser - - def parseMethodResponse(str) - methodResponse_document(createCleanedTree(str)) - end - - def parseMethodCall(str) - methodCall_document(createCleanedTree(str)) - end - - private - - # - # remove all whitespaces but in the tags i4, int, boolean.... - # and all comments - # - def removeWhitespacesAndComments(node) - remove = [] - childs = node.childNodes.to_a - childs.each do |nd| - case _nodeType(nd) - when :TEXT - # TODO: add nil? - unless %w(i4 int boolean string double dateTime.iso8601 base64).include? node.nodeName - - if node.nodeName == "value" - if not node.childNodes.to_a.detect {|n| _nodeType(n) == :ELEMENT}.nil? - remove << nd if nd.nodeValue.strip == "" - end - else - remove << nd if nd.nodeValue.strip == "" - end - end - when :COMMENT - remove << nd - else - removeWhitespacesAndComments(nd) - end - end - - remove.each { |i| node.removeChild(i) } - end - - - def nodeMustBe(node, name) - cmp = case name - when Array - name.include?(node.nodeName) - when String - name == node.nodeName - else - raise "error" - end - - if not cmp then - raise "wrong xml-rpc (name)" - end - - node - end - - # - # returns, when successfully the only child-node - # - def hasOnlyOneChild(node, name=nil) - if node.childNodes.to_a.size != 1 - raise "wrong xml-rpc (size)" - end - if name != nil then - nodeMustBe(node.firstChild, name) - end - end - - - def assert(b) - if not b then - raise "assert-fail" - end - end - - # the node `node` has empty string or string - def text_zero_one(node) - nodes = node.childNodes.to_a.size - - if nodes == 1 - text(node.firstChild) - elsif nodes == 0 - "" - else - raise "wrong xml-rpc (size)" - end - end - - - def integer(node) - #TODO: check string for float because to_i returnsa - # 0 when wrong string - nodeMustBe(node, %w(i4 int)) - hasOnlyOneChild(node) - - Convert.int(text(node.firstChild)) - end - - def boolean(node) - nodeMustBe(node, "boolean") - hasOnlyOneChild(node) - - Convert.boolean(text(node.firstChild)) - end - - def v_nil(node) - nodeMustBe(node, "nil") - assert( node.childNodes.to_a.size == 0 ) - nil - end - - def string(node) - nodeMustBe(node, "string") - text_zero_one(node) - end - - def double(node) - #TODO: check string for float because to_f returnsa - # 0.0 when wrong string - nodeMustBe(node, "double") - hasOnlyOneChild(node) - - Convert.double(text(node.firstChild)) - end - - def dateTime(node) - nodeMustBe(node, "dateTime.iso8601") - hasOnlyOneChild(node) - - Convert.dateTime( text(node.firstChild) ) - end - - def base64(node) - nodeMustBe(node, "base64") - #hasOnlyOneChild(node) - - Convert.base64(text_zero_one(node)) - end - - def member(node) - nodeMustBe(node, "member") - assert( node.childNodes.to_a.size == 2 ) - - [ name(node[0]), value(node[1]) ] - end - - def name(node) - nodeMustBe(node, "name") - #hasOnlyOneChild(node) - text_zero_one(node) - end - - def array(node) - nodeMustBe(node, "array") - hasOnlyOneChild(node, "data") - data(node.firstChild) - end - - def data(node) - nodeMustBe(node, "data") - - node.childNodes.to_a.collect do |val| - value(val) - end - end - - def param(node) - nodeMustBe(node, "param") - hasOnlyOneChild(node, "value") - value(node.firstChild) - end - - def methodResponse(node) - nodeMustBe(node, "methodResponse") - hasOnlyOneChild(node, %w(params fault)) - child = node.firstChild - - case child.nodeName - when "params" - [ true, params(child,false) ] - when "fault" - [ false, fault(child) ] - else - raise "unexpected error" - end - - end - - def methodName(node) - nodeMustBe(node, "methodName") - hasOnlyOneChild(node) - text(node.firstChild) - end - - def params(node, call=true) - nodeMustBe(node, "params") - - if call - node.childNodes.to_a.collect do |n| - param(n) - end - else # response (only one param) - hasOnlyOneChild(node) - param(node.firstChild) - end - end - - def fault(node) - nodeMustBe(node, "fault") - hasOnlyOneChild(node, "value") - f = value(node.firstChild) - Convert.fault(f) - end - - - - # _nodeType is defined in the subclass - def text(node) - assert( _nodeType(node) == :TEXT ) - assert( node.hasChildNodes == false ) - assert( node.nodeValue != nil ) - - node.nodeValue.to_s - end - - def struct(node) - nodeMustBe(node, "struct") - - hash = {} - node.childNodes.to_a.each do |me| - n, v = member(me) - hash[n] = v - end - - Convert.struct(hash) - end - - - def value(node) - nodeMustBe(node, "value") - nodes = node.childNodes.to_a.size - if nodes == 0 - return "" - elsif nodes > 1 - raise "wrong xml-rpc (size)" - end - - child = node.firstChild - - case _nodeType(child) - when :TEXT - text_zero_one(node) - when :ELEMENT - case child.nodeName - when "i4", "int" then integer(child) - when "boolean" then boolean(child) - when "string" then string(child) - when "double" then double(child) - when "dateTime.iso8601" then dateTime(child) - when "base64" then base64(child) - when "struct" then struct(child) - when "array" then array(child) - when "nil" - if Config::ENABLE_NIL_PARSER - v_nil(child) - else - raise "wrong/unknown XML-RPC type 'nil'" - end - else - raise "wrong/unknown XML-RPC type" - end - else - raise "wrong type of node" - end - - end - - def methodCall(node) - nodeMustBe(node, "methodCall") - assert( (1..2).include?( node.childNodes.to_a.size ) ) - name = methodName(node[0]) - - if node.childNodes.to_a.size == 2 then - pa = params(node[1]) - else # no parameters given - pa = [] - end - [name, pa] - end - - end # module TreeParserMixin - - class AbstractStreamParser - def parseMethodResponse(str) - parser = @parser_class.new - parser.parse(str) - raise "No valid method response!" if parser.method_name != nil - if parser.fault != nil - # is a fault structure - [false, parser.fault] - else - # is a normal return value - raise "Missing return value!" if parser.params.size == 0 - raise "Too many return values. Only one allowed!" if parser.params.size > 1 - [true, parser.params[0]] - end - end - - def parseMethodCall(str) - parser = @parser_class.new - parser.parse(str) - raise "No valid method call - missing method name!" if parser.method_name.nil? - [parser.method_name, parser.params] - end - end - - module StreamParserMixin - attr_reader :params - attr_reader :method_name - attr_reader :fault - - def initialize(*a) - super(*a) - @params = [] - @values = [] - @val_stack = [] - - @names = [] - @name = [] - - @structs = [] - @struct = {} - - @method_name = nil - @fault = nil - - @data = nil - end - - def startElement(name, attrs=[]) - @data = nil - case name - when "value" - @value = nil - when "nil" - raise "wrong/unknown XML-RPC type 'nil'" unless Config::ENABLE_NIL_PARSER - @value = :nil - when "array" - @val_stack << @values - @values = [] - when "struct" - @names << @name - @name = [] - - @structs << @struct - @struct = {} - end - end - - def endElement(name) - @data ||= "" - case name - when "string" - @value = @data - when "i4", "int" - @value = Convert.int(@data) - when "boolean" - @value = Convert.boolean(@data) - when "double" - @value = Convert.double(@data) - when "dateTime.iso8601" - @value = Convert.dateTime(@data) - when "base64" - @value = Convert.base64(@data) - when "value" - @value = @data if @value.nil? - @values << (@value == :nil ? nil : @value) - when "array" - @value = @values - @values = @val_stack.pop - when "struct" - @value = Convert.struct(@struct) - - @name = @names.pop - @struct = @structs.pop - when "name" - @name[0] = @data - when "member" - @struct[@name[0]] = @values.pop - - when "param" - @params << @values[0] - @values = [] - - when "fault" - @fault = Convert.fault(@values[0]) - - when "methodName" - @method_name = @data - end - - @data = nil - end - - def character(data) - if @data - @data << data - else - @data = data - end - end - - end # module StreamParserMixin - - # --------------------------------------------------------------------------- - class XMLStreamParser < AbstractStreamParser - def initialize - require "xmlparser" - @parser_class = Class.new(::XMLParser) { - include StreamParserMixin - } - end - end # class XMLStreamParser - # --------------------------------------------------------------------------- - class NQXMLStreamParser < AbstractStreamParser - def initialize - require "nqxml/streamingparser" - @parser_class = XMLRPCParser - end - - class XMLRPCParser - include StreamParserMixin - - def parse(str) - parser = NQXML::StreamingParser.new(str) - parser.each do |ele| - case ele - when NQXML::Text - @data = ele.text - #character(ele.text) - when NQXML::Tag - if ele.isTagEnd - endElement(ele.name) - else - startElement(ele.name, ele.attrs) - end - end - end # do - end # method parse - end # class XMLRPCParser - - end # class NQXMLStreamParser - # --------------------------------------------------------------------------- - class XMLTreeParser < AbstractTreeParser - - def initialize - require "xmltreebuilder" - - # The new XMLParser library (0.6.2+) uses a slightly different DOM implementation. - # The following code removes the differences between both versions. - if defined? XML::DOM::Builder - return if defined? XML::DOM::Node::DOCUMENT # code below has been already executed - klass = XML::DOM::Node - klass.const_set("DOCUMENT", klass::DOCUMENT_NODE) - klass.const_set("TEXT", klass::TEXT_NODE) - klass.const_set("COMMENT", klass::COMMENT_NODE) - klass.const_set("ELEMENT", klass::ELEMENT_NODE) - end - end - - private - - def _nodeType(node) - tp = node.nodeType - if tp == XML::SimpleTree::Node::TEXT then :TEXT - elsif tp == XML::SimpleTree::Node::COMMENT then :COMMENT - elsif tp == XML::SimpleTree::Node::ELEMENT then :ELEMENT - else :ELSE - end - end - - - def methodResponse_document(node) - assert( node.nodeType == XML::SimpleTree::Node::DOCUMENT ) - hasOnlyOneChild(node, "methodResponse") - - methodResponse(node.firstChild) - end - - def methodCall_document(node) - assert( node.nodeType == XML::SimpleTree::Node::DOCUMENT ) - hasOnlyOneChild(node, "methodCall") - - methodCall(node.firstChild) - end - - def createCleanedTree(str) - doc = XML::SimpleTreeBuilder.new.parse(str) - doc.documentElement.normalize - removeWhitespacesAndComments(doc) - doc - end - - end # class XMLParser - # --------------------------------------------------------------------------- - class NQXMLTreeParser < AbstractTreeParser - - def initialize - require "nqxml/treeparser" - end - - private - - def _nodeType(node) - node.nodeType - end - - def methodResponse_document(node) - methodResponse(node) - end - - def methodCall_document(node) - methodCall(node) - end - - def createCleanedTree(str) - doc = ::NQXML::TreeParser.new(str).document.rootNode - removeWhitespacesAndComments(doc) - doc - end - - end # class NQXMLTreeParser - # --------------------------------------------------------------------------- - class REXMLStreamParser < AbstractStreamParser - def initialize - require "rexml/document" - @parser_class = StreamListener - end - - class StreamListener - include StreamParserMixin - - alias :tag_start :startElement - alias :tag_end :endElement - alias :text :character - alias :cdata :character - - def method_missing(*a) - # ignore - end - - def parse(str) - parser = REXML::Document.parse_stream(str, self) - end - end - - end - # --------------------------------------------------------------------------- - class XMLScanStreamParser < AbstractStreamParser - def initialize - require "xmlscan/parser" - @parser_class = XMLScanParser - end - - class XMLScanParser - include StreamParserMixin - - Entities = { - "lt" => "<", - "gt" => ">", - "amp" => "&", - "quot" => '"', - "apos" => "'" - } - - def parse(str) - parser = XMLScan::XMLParser.new(self) - parser.parse(str) - end - - alias :on_stag :startElement - alias :on_etag :endElement - - def on_stag_end(name); end - - def on_stag_end_empty(name) - startElement(name) - endElement(name) - end - - def on_chardata(str) - character(str) - end - - def on_cdata(str) - character(str) - end - - def on_entityref(ent) - str = Entities[ent] - if str - character(str) - else - raise "unknown entity" - end - end - - def on_charref(code) - character(code.chr) - end - - def on_charref_hex(code) - character(code.chr) - end - - def method_missing(*a) - end - - # TODO: call/implement? - # valid_name? - # valid_chardata? - # valid_char? - # parse_error - - end - end - # --------------------------------------------------------------------------- - XMLParser = XMLTreeParser - NQXMLParser = NQXMLTreeParser - - Classes = [XMLStreamParser, XMLTreeParser, - NQXMLStreamParser, NQXMLTreeParser, - REXMLStreamParser, XMLScanStreamParser] - - # yields an instance of each installed parser - def self.each_installed_parser - XMLRPC::XMLParser::Classes.each do |klass| - begin - yield klass.new - rescue LoadError - end - end - end - - end # module XMLParser - - -end # module XMLRPC - diff --git a/Src/StdLib/ruby/1.9.1/xmlrpc/server.rb b/Src/StdLib/ruby/1.9.1/xmlrpc/server.rb deleted file mode 100644 index 29ebd3b2e..000000000 --- a/Src/StdLib/ruby/1.9.1/xmlrpc/server.rb +++ /dev/null @@ -1,778 +0,0 @@ -=begin -= xmlrpc/server.rb -Copyright (C) 2001, 2002, 2003, 2005 by Michael Neumann (mneumann@ntecs.de) - -Released under the same term of license as Ruby. - -= Classes -* (()) -* (()) -* (()) -* (()) -* (()) - -= XMLRPC::BasicServer -== Description -Is the base class for all XML-RPC server-types (CGI, standalone). -You can add handler and set a default handler. -Do not use this server, as this is/should be an abstract class. - -=== How the method to call is found -The arity (number of accepted arguments) of a handler (method or (({Proc})) object) is -compared to the given arguments submitted by the client for a RPC ((-Remote Procedure Call-)). -A handler is only called if it accepts the number of arguments, otherwise the search -for another handler will go on. When at the end no handler was found, -the (()) will be called. -With this technique it is possible to do overloading by number of parameters, but -only for (({Proc})) handler, because you cannot define two methods of the same name in -the same class. - - -== Class Methods ---- XMLRPC::BasicServer.new( class_delim="." ) - Creates a new (({XMLRPC::BasicServer})) instance, which should not be - done, because (({XMLRPC::BasicServer})) is an abstract class. This - method should be called from a subclass indirectly by a (({super})) call - in the method (({initialize})). The paramter ((|class_delim|)) is used - in (()) when an object is - added as handler, to delimit the object-prefix and the method-name. - -== Instance Methods ---- XMLRPC::BasicServer#add_handler( name, signature=nil, help=nil ) { aBlock } - Adds ((|aBlock|)) to the list of handlers, with ((|name|)) as the name of the method. - Parameters ((|signature|)) and ((|help|)) are used by the Introspection method if specified, - where ((|signature|)) is either an Array containing strings each representing a type of it's - signature (the first is the return value) or an Array of Arrays if the method has multiple - signatures. Value type-names are "int, boolean, double, string, dateTime.iso8601, base64, array, struct". - - Parameter ((|help|)) is a String with informations about how to call this method etc. - - A handler method or code-block can return the types listed at - (()). - When a method fails, it can tell it the client by throwing an - (({XMLRPC::FaultException})) like in this example: - s.add_handler("michael.div") do |a,b| - if b == 0 - raise XMLRPC::FaultException.new(1, "division by zero") - else - a / b - end - end - The client gets in the case of (({b==0})) an object back of type - (({XMLRPC::FaultException})) that has a ((|faultCode|)) and ((|faultString|)) - field. - ---- XMLRPC::BasicServer#add_handler( prefix, obj ) - This is the second form of (()). - To add an object write: - server.add_handler("michael", MyHandlerClass.new) - All public methods of (({MyHandlerClass})) are accessible to - the XML-RPC clients by (('michael."name of method"')). This is - where the ((|class_delim|)) in (()) - has it's role, a XML-RPC method-name is defined by - ((|prefix|)) + ((|class_delim|)) + (('"name of method"')). - ---- XMLRPC::BasicServer#add_handler( interface, obj ) - This is the third form of (()). - - Use (({XMLRPC::interface})) to generate an ServiceInterface object, which - represents an interface (with signature and help text) for a handler class. - - Parameter ((|interface|)) must be of type (({XMLRPC::ServiceInterface})). - Adds all methods of ((|obj|)) which are defined in ((|interface|)) to the - server. - - This is the recommended way of adding services to a server! - - ---- XMLRPC::BasicServer#get_default_handler - Returns the default-handler, which is called when no handler for - a method-name is found. - It is a (({Proc})) object or (({nil})). - ---- XMLRPC::BasicServer#set_default_handler ( &handler ) - Sets ((|handler|)) as the default-handler, which is called when - no handler for a method-name is found. ((|handler|)) is a code-block. - The default-handler is called with the (XML-RPC) method-name as first argument, and - the other arguments are the parameters given by the client-call. - - If no block is specified the default of (({XMLRPC::BasicServer})) is used, which raises a - XMLRPC::FaultException saying "method missing". - - ---- XMLRPC::BasicServer#set_writer( writer ) - Sets the XML writer to use for generating XML output. - Should be an instance of a class from module (({XMLRPC::XMLWriter})). - If this method is not called, then (({XMLRPC::Config::DEFAULT_WRITER})) is used. - ---- XMLRPC::BasicServer#set_parser( parser ) - Sets the XML parser to use for parsing XML documents. - Should be an instance of a class from module (({XMLRPC::XMLParser})). - If this method is not called, then (({XMLRPC::Config::DEFAULT_PARSER})) is used. - ---- XMLRPC::BasicServer#add_introspection - Adds the introspection handlers "system.listMethods", "system.methodSignature" and "system.methodHelp", - where only the first one works. - ---- XMLRPC::BasicServer#add_multicall - Adds the multi-call handler "system.multicall". - ---- XMLRPC::BasicServer#get_service_hook - Returns the service-hook, which is called on each service request (RPC) unless it's (({nil})). - ---- XMLRPC::BasicServer#set_service_hook ( &handler ) - A service-hook is called for each service request (RPC). - You can use a service-hook for example to wrap existing methods and catch exceptions of them or - convert values to values recognized by XMLRPC. You can disable it by passing (({nil})) as parameter - ((|handler|)) . - - The service-hook is called with a (({Proc})) object and with the parameters for this (({Proc})). - An example: - - server.set_service_hook {|obj, *args| - begin - ret = obj.call(*args) # call the original service-method - # could convert the return value - rescue - # rescue exceptions - end - } - -=end - - - -require "xmlrpc/parser" -require "xmlrpc/create" -require "xmlrpc/config" -require "xmlrpc/utils" # ParserWriterChooseMixin - - - -module XMLRPC - - -class BasicServer - - include ParserWriterChooseMixin - include ParseContentType - - ERR_METHOD_MISSING = 1 - ERR_UNCAUGHT_EXCEPTION = 2 - ERR_MC_WRONG_PARAM = 3 - ERR_MC_MISSING_PARAMS = 4 - ERR_MC_MISSING_METHNAME = 5 - ERR_MC_RECURSIVE_CALL = 6 - ERR_MC_WRONG_PARAM_PARAMS = 7 - ERR_MC_EXPECTED_STRUCT = 8 - - - def initialize(class_delim=".") - @handler = [] - @default_handler = nil - @service_hook = nil - - @class_delim = class_delim - @create = nil - @parser = nil - - add_multicall if Config::ENABLE_MULTICALL - add_introspection if Config::ENABLE_INTROSPECTION - end - - def add_handler(prefix, obj_or_signature=nil, help=nil, &block) - if block_given? - # proc-handler - @handler << [prefix, block, obj_or_signature, help] - else - if prefix.kind_of? String - # class-handler - raise ArgumentError, "Expected non-nil value" if obj_or_signature.nil? - @handler << [prefix + @class_delim, obj_or_signature] - elsif prefix.kind_of? XMLRPC::Service::BasicInterface - # class-handler with interface - # add all methods - @handler += prefix.get_methods(obj_or_signature, @class_delim) - else - raise ArgumentError, "Wrong type for parameter 'prefix'" - end - end - self - end - - def get_service_hook - @service_hook - end - - def set_service_hook(&handler) - @service_hook = handler - self - end - - def get_default_handler - @default_handler - end - - def set_default_handler (&handler) - @default_handler = handler - self - end - - def add_multicall - add_handler("system.multicall", %w(array array), "Multicall Extension") do |arrStructs| - unless arrStructs.is_a? Array - raise XMLRPC::FaultException.new(ERR_MC_WRONG_PARAM, "system.multicall expects an array") - end - - arrStructs.collect {|call| - if call.is_a? Hash - methodName = call["methodName"] - params = call["params"] - - if params.nil? - multicall_fault(ERR_MC_MISSING_PARAMS, "Missing params") - elsif methodName.nil? - multicall_fault(ERR_MC_MISSING_METHNAME, "Missing methodName") - else - if methodName == "system.multicall" - multicall_fault(ERR_MC_RECURSIVE_CALL, "Recursive system.multicall forbidden") - else - unless params.is_a? Array - multicall_fault(ERR_MC_WRONG_PARAM_PARAMS, "Parameter params have to be an Array") - else - ok, val = call_method(methodName, *params) - if ok - # correct return value - [val] - else - # exception - multicall_fault(val.faultCode, val.faultString) - end - end - end - end - - else - multicall_fault(ERR_MC_EXPECTED_STRUCT, "system.multicall expected struct") - end - } - end # end add_handler - self - end - - def add_introspection - add_handler("system.listMethods",%w(array), "List methods available on this XML-RPC server") do - methods = [] - @handler.each do |name, obj| - if obj.kind_of? Proc - methods << name - else - obj.class.public_instance_methods(false).each do |meth| - methods << "#{name}#{meth}" - end - end - end - methods - end - - add_handler("system.methodSignature", %w(array string), "Returns method signature") do |meth| - sigs = [] - @handler.each do |name, obj, sig| - if obj.kind_of? Proc and sig != nil and name == meth - if sig[0].kind_of? Array - # sig contains multiple signatures, e.g. [["array"], ["array", "string"]] - sig.each {|s| sigs << s} - else - # sig is a single signature, e.g. ["array"] - sigs << sig - end - end - end - sigs.uniq! || sigs # remove eventually duplicated signatures - end - - add_handler("system.methodHelp", %w(string string), "Returns help on using this method") do |meth| - help = nil - @handler.each do |name, obj, sig, hlp| - if obj.kind_of? Proc and name == meth - help = hlp - break - end - end - help || "" - end - - self - end - - - - def process(data) - method, params = parser().parseMethodCall(data) - handle(method, *params) - end - - private # -------------------------------------------------------------- - - def multicall_fault(nr, str) - {"faultCode" => nr, "faultString" => str} - end - - # - # method dispatch - # - def dispatch(methodname, *args) - for name, obj in @handler - if obj.kind_of? Proc - next unless methodname == name - else - next unless methodname =~ /^#{name}(.+)$/ - next unless obj.respond_to? $1 - obj = obj.method($1) - end - - if check_arity(obj, args.size) - if @service_hook.nil? - return obj.call(*args) - else - return @service_hook.call(obj, *args) - end - end - end - - if @default_handler.nil? - raise XMLRPC::FaultException.new(ERR_METHOD_MISSING, "Method #{methodname} missing or wrong number of parameters!") - else - @default_handler.call(methodname, *args) - end - end - - - # - # returns true, if the arity of "obj" matches - # - def check_arity(obj, n_args) - ary = obj.arity - - if ary >= 0 - n_args == ary - else - n_args >= (ary+1).abs - end - end - - - - def call_method(methodname, *args) - begin - [true, dispatch(methodname, *args)] - rescue XMLRPC::FaultException => e - [false, e] - rescue Exception => e - [false, XMLRPC::FaultException.new(ERR_UNCAUGHT_EXCEPTION, "Uncaught exception #{e.message} in method #{methodname}")] - end - end - - # - # - # - def handle(methodname, *args) - create().methodResponse(*call_method(methodname, *args)) - end - - -end - - -=begin -= XMLRPC::CGIServer -== Synopsis - require "xmlrpc/server" - - s = XMLRPC::CGIServer.new - - s.add_handler("michael.add") do |a,b| - a + b - end - - s.add_handler("michael.div") do |a,b| - if b == 0 - raise XMLRPC::FaultException.new(1, "division by zero") - else - a / b - end - end - - s.set_default_handler do |name, *args| - raise XMLRPC::FaultException.new(-99, "Method #{name} missing" + - " or wrong number of parameters!") - end - - s.serve - -== Description -Implements a CGI-based XML-RPC server. - -== Superclass -(()) - -== Class Methods ---- XMLRPC::CGIServer.new( *a ) - Creates a new (({XMLRPC::CGIServer})) instance. All parameters given - are by-passed to (()). You can only create - ((*one*)) (({XMLRPC::CGIServer})) instance, because more than one makes - no sense. - -== Instance Methods ---- XMLRPC::CGIServer#serve - Call this after you have added all you handlers to the server. - This method processes a XML-RPC methodCall and sends the answer - back to the client. - Make sure that you don't write to standard-output in a handler, or in - any other part of your program, this would case a CGI-based server to fail! -=end - -class CGIServer < BasicServer - @@obj = nil - - def CGIServer.new(*a) - @@obj = super(*a) if @@obj.nil? - @@obj - end - - def initialize(*a) - super(*a) - end - - def serve - catch(:exit_serve) { - length = ENV['CONTENT_LENGTH'].to_i - - http_error(405, "Method Not Allowed") unless ENV['REQUEST_METHOD'] == "POST" - http_error(400, "Bad Request") unless parse_content_type(ENV['CONTENT_TYPE']).first == "text/xml" - http_error(411, "Length Required") unless length > 0 - - # TODO: do we need a call to binmode? - $stdin.binmode if $stdin.respond_to? :binmode - data = $stdin.read(length) - - http_error(400, "Bad Request") if data.nil? or data.size != length - - http_write(process(data), "Content-type" => "text/xml; charset=utf-8") - } - end - - - private - - def http_error(status, message) - err = "#{status} #{message}" - msg = <<-"MSGEND" - - - #{err} - - -

#{err}

-

Unexpected error occured while processing XML-RPC request!

- - - MSGEND - - http_write(msg, "Status" => err, "Content-type" => "text/html") - throw :exit_serve # exit from the #serve method - end - - def http_write(body, header) - h = {} - header.each {|key, value| h[key.to_s.capitalize] = value} - h['Status'] ||= "200 OK" - h['Content-length'] ||= body.size.to_s - - str = "" - h.each {|key, value| str << "#{key}: #{value}\r\n"} - str << "\r\n#{body}" - - print str - end - -end - -=begin -= XMLRPC::ModRubyServer -== Description -Implements a XML-RPC server, which works with Apache mod_ruby. - -Use it in the same way as CGIServer! - -== Superclass -(()) -=end - -class ModRubyServer < BasicServer - - def initialize(*a) - @ap = Apache::request - super(*a) - end - - def serve - catch(:exit_serve) { - header = {} - @ap.headers_in.each {|key, value| header[key.capitalize] = value} - - length = header['Content-length'].to_i - - http_error(405, "Method Not Allowed") unless @ap.request_method == "POST" - http_error(400, "Bad Request") unless parse_content_type(header['Content-type']).first == "text/xml" - http_error(411, "Length Required") unless length > 0 - - # TODO: do we need a call to binmode? - @ap.binmode - data = @ap.read(length) - - http_error(400, "Bad Request") if data.nil? or data.size != length - - http_write(process(data), 200, "Content-type" => "text/xml; charset=utf-8") - } - end - - - private - - def http_error(status, message) - err = "#{status} #{message}" - msg = <<-"MSGEND" - - - #{err} - - -

#{err}

-

Unexpected error occured while processing XML-RPC request!

- - - MSGEND - - http_write(msg, status, "Status" => err, "Content-type" => "text/html") - throw :exit_serve # exit from the #serve method - end - - def http_write(body, status, header) - h = {} - header.each {|key, value| h[key.to_s.capitalize] = value} - h['Status'] ||= "200 OK" - h['Content-length'] ||= body.size.to_s - - h.each {|key, value| @ap.headers_out[key] = value } - @ap.content_type = h["Content-type"] - @ap.status = status.to_i - @ap.send_http_header - - @ap.print body - end - -end - -=begin -= XMLRPC::Server -== Synopsis - require "xmlrpc/server" - - s = XMLRPC::Server.new(8080) - - s.add_handler("michael.add") do |a,b| - a + b - end - - s.add_handler("michael.div") do |a,b| - if b == 0 - raise XMLRPC::FaultException.new(1, "division by zero") - else - a / b - end - end - - s.set_default_handler do |name, *args| - raise XMLRPC::FaultException.new(-99, "Method #{name} missing" + - " or wrong number of parameters!") - end - - s.serve - -== Description -Implements a standalone XML-RPC server. The method (({serve}))) is left if a SIGHUP is sent to the -program. - -== Superclass -(()) - -== Class Methods ---- XMLRPC::Server.new( port=8080, host="127.0.0.1", maxConnections=4, stdlog=$stdout, audit=true, debug=true, *a ) - Creates a new (({XMLRPC::Server})) instance, which is a XML-RPC server listening on - port ((|port|)) and accepts requests for the host ((|host|)), which is by default only the localhost. - The server is not started, to start it you have to call (()). - - Parameters ((|audit|)) and ((|debug|)) are obsolete! - - All additionally given parameters in ((|*a|)) are by-passed to (()). - -== Instance Methods ---- XMLRPC::Server#serve - Call this after you have added all you handlers to the server. - This method starts the server to listen for XML-RPC requests and answer them. - ---- XMLRPC::Server#shutdown - Stops and shuts the server down. - -=end - -class WEBrickServlet < BasicServer; end # forward declaration - -class Server < WEBrickServlet - - def initialize(port=8080, host="127.0.0.1", maxConnections=4, stdlog=$stdout, audit=true, debug=true, *a) - super(*a) - require 'webrick' - @server = WEBrick::HTTPServer.new(:Port => port, :BindAddress => host, :MaxClients => maxConnections, - :Logger => WEBrick::Log.new(stdlog)) - @server.mount("/", self) - end - - def serve - signals = %w[INT TERM HUP] & Signal.list.keys - signals.each { |signal| trap(signal) { @server.shutdown } } - - @server.start - end - - def shutdown - @server.shutdown - end - -end - -=begin -= XMLRPC::WEBrickServlet -== Synopsis - - require "webrick" - require "xmlrpc/server" - - s = XMLRPC::WEBrickServlet.new - s.add_handler("michael.add") do |a,b| - a + b - end - - s.add_handler("michael.div") do |a,b| - if b == 0 - raise XMLRPC::FaultException.new(1, "division by zero") - else - a / b - end - end - - s.set_default_handler do |name, *args| - raise XMLRPC::FaultException.new(-99, "Method #{name} missing" + - " or wrong number of parameters!") - end - - httpserver = WEBrick::HTTPServer.new(:Port => 8080) - httpserver.mount("/RPC2", s) - trap("HUP") { httpserver.shutdown } # use 1 instead of "HUP" on Windows - httpserver.start - -== Instance Methods - ---- XMLRPC::WEBrickServlet#set_valid_ip( *ip_addr ) - Specifies the valid IP addresses that are allowed to connect to the server. - Each IP is either a (({String})) or a (({Regexp})). - ---- XMLRPC::WEBrickServlet#get_valid_ip - Return the via method (()) specified - valid IP addresses. - -== Description -Implements a servlet for use with WEBrick, a pure Ruby (HTTP-) server framework. - -== Superclass -(()) - -=end - -class WEBrickServlet < BasicServer - def initialize(*a) - super - require "webrick/httpstatus" - @valid_ip = nil - end - - # deprecated from WEBrick/1.2.2. - # but does not break anything. - def require_path_info? - false - end - - def get_instance(config, *options) - # TODO: set config & options - self - end - - def set_valid_ip(*ip_addr) - if ip_addr.size == 1 and ip_addr[0].nil? - @valid_ip = nil - else - @valid_ip = ip_addr - end - end - - def get_valid_ip - @valid_ip - end - - def service(request, response) - - if @valid_ip - raise WEBrick::HTTPStatus::Forbidden unless @valid_ip.any? { |ip| request.peeraddr[3] =~ ip } - end - - if request.request_method != "POST" - raise WEBrick::HTTPStatus::MethodNotAllowed, - "unsupported method `#{request.request_method}'." - end - - if parse_content_type(request['Content-type']).first != "text/xml" - raise WEBrick::HTTPStatus::BadRequest - end - - length = (request['Content-length'] || 0).to_i - - raise WEBrick::HTTPStatus::LengthRequired unless length > 0 - - data = request.body - - if data.nil? or data.size != length - raise WEBrick::HTTPStatus::BadRequest - end - - resp = process(data) - if resp.nil? or resp.size <= 0 - raise WEBrick::HTTPStatus::InternalServerError - end - - response.status = 200 - response['Content-Length'] = resp.size - response['Content-Type'] = "text/xml; charset=utf-8" - response.body = resp - end -end - - -end # module XMLRPC - - -=begin -= History - $Id: server.rb 26986 2010-03-20 03:30:59Z nobu $ -=end - diff --git a/Src/StdLib/ruby/1.9.1/xmlrpc/utils.rb b/Src/StdLib/ruby/1.9.1/xmlrpc/utils.rb deleted file mode 100644 index a48ae8696..000000000 --- a/Src/StdLib/ruby/1.9.1/xmlrpc/utils.rb +++ /dev/null @@ -1,165 +0,0 @@ -# -# Defines ParserWriterChooseMixin, which makes it possible to choose a -# different XML writer and/or XML parser then the default one. -# The Mixin is used in client.rb (class Client) and server.rb (class -# BasicServer) -# -# Copyright (C) 2001, 2002, 2003 by Michael Neumann (mneumann@ntecs.de) -# -# $Id: utils.rb 27537 2010-04-28 18:51:35Z jeg2 $ -# - -module XMLRPC - - # - # This module enables a user-class to be marshalled - # by XML-RPC for Ruby into a Hash, with one additional - # key/value pair "___class___" => ClassName - # - module Marshallable - end - - - module ParserWriterChooseMixin - - def set_writer(writer) - @create = Create.new(writer) - self - end - - def set_parser(parser) - @parser = parser - self - end - - private - - def create - # if set_writer was not already called then call it now - if @create.nil? then - set_writer(Config::DEFAULT_WRITER.new) - end - @create - end - - def parser - # if set_parser was not already called then call it now - if @parser.nil? then - set_parser(Config::DEFAULT_PARSER.new) - end - @parser - end - - end # module ParserWriterChooseMixin - - - module Service - - # - # base class for Service Interface definitions, used - # by BasicServer#add_handler - # - - class BasicInterface - attr_reader :prefix, :methods - - def initialize(prefix) - @prefix = prefix - @methods = [] - end - - def add_method(sig, help=nil, meth_name=nil) - mname = nil - sig = [sig] if sig.kind_of? String - - sig = sig.collect do |s| - name, si = parse_sig(s) - raise "Wrong signatures!" if mname != nil and name != mname - mname = name - si - end - - @methods << [mname, meth_name || mname, sig, help] - end - - private # --------------------------------- - - def parse_sig(sig) - # sig is a String - if sig =~ /^\s*(\w+)\s+([^(]+)(\(([^)]*)\))?\s*$/ - params = [$1] - name = $2.strip - $4.split(",").each {|i| params << i.strip} if $4 != nil - return name, params - else - raise "Syntax error in signature" - end - end - - end # class BasicInterface - - # - # class which wraps a Service Interface definition, used - # by BasicServer#add_handler - # - class Interface < BasicInterface - def initialize(prefix, &p) - raise "No interface specified" if p.nil? - super(prefix) - instance_eval(&p) - end - - def get_methods(obj, delim=".") - prefix = @prefix + delim - @methods.collect { |name, meth, sig, help| - [prefix + name.to_s, obj.method(meth).to_proc, sig, help] - } - end - - private # --------------------------------- - - def meth(*a) - add_method(*a) - end - - end # class Interface - - class PublicInstanceMethodsInterface < BasicInterface - def initialize(prefix) - super(prefix) - end - - def get_methods(obj, delim=".") - prefix = @prefix + delim - obj.class.public_instance_methods(false).collect { |name| - [prefix + name.to_s, obj.method(name).to_proc, nil, nil] - } - end - end - - - end # module Service - - - # - # short-form to create a Service::Interface - # - def self.interface(prefix, &p) - Service::Interface.new(prefix, &p) - end - - # short-cut for creating a PublicInstanceMethodsInterface - def self.iPIMethods(prefix) - Service::PublicInstanceMethodsInterface.new(prefix) - end - - - module ParseContentType - def parse_content_type(str) - a, *b = str.split(";") - return a.strip.downcase, *b - end - end - -end # module XMLRPC - diff --git a/Src/StdLib/ruby/1.9.1/yaml/syck.rb b/Src/StdLib/ruby/1.9.1/yaml/syck.rb deleted file mode 100644 index 655f70a97..000000000 --- a/Src/StdLib/ruby/1.9.1/yaml/syck.rb +++ /dev/null @@ -1,14 +0,0 @@ -# $Id$ -# -# = yaml/syck.rb: -# - -require 'stringio' -require 'syck.so' -require 'syck/error' -require 'syck/syck' -require 'syck/tag' -require 'syck/stream' -require 'syck/constants' -require 'syck/rubytypes' -require 'syck/types' diff --git a/Util/NuGet/nuget.exe b/Util/NuGet/nuget.exe deleted file mode 100644 index 9cba6edbfc43ef7cc1ee121d6bafe5b37cd98f1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1655808 zcmb@v4VYX-mH&U|cF*nZJ2Oc-J(*52KoUZd%M5|=5}26)Nx%?!32!mH7?F2*6E1Xv z2;&Tc5fL#UA|fKPNq7+vBSsei5fNQPM4~JrLKZQLEFvPZF3Yl#|L2^#x2GrE<8ODL z|2#=|-EW;bRdwprsZ%evdfEFw>*YMp%kzKB7SH=G-}1LeKmY#62+`xF-8atrcIojM z-)%YM@fq(s{fzqbb8GQwwG+>te)5UuoD-iv{iIW;*Dg3``Wfd;f6rmdr=K04a_Y_< z9pMfM>%*6L-XSeH@1KWXJTlGgx1Qh9)>8DmzA2s;I`msd6P`}^1iqzo682rW32FJ| z+xrLN!R0UKExOF}Cg{J>@8r>uc&EVk5DCNg%pd`qzec8b?aj~s!|)H_OASWMl$N_-^`Jgg|z#o%-PzLM5z%p^%c3K|yT5}%HLA;|{q3F9__UGj*$0zXDdVUO2>(pToSduK?l zl)E#me~>xKw<`I8je==Sf`Jan_MPB?wESTZ!J@al*uNbyMJ-U#6{s*M+#)h- zGuJ45R!&88)5o1PCCgj|UwQRHLL0y^^9R~44K9SyqBC`LWQDcM`&JJo<3P~s7_G0aN!nv)a8ciaub|*2_)s(2EqtumK zTZ+0sEBRt=e2aH(IUiSf>~ZxN?|qrVP^EJH`_lH!wV||)+R$!EZ3G>b53NmGVSpy~ zdV;NsGqfk7E5wt@3T=5%q)lBz5hk*BiJFD&NaLx{3`kdK)(kD{L4Mp#q)Mzi-iBb0 zHwKHgRct$d5S_~RZ13lWGypR&G|XWda2Pt~Fby~im2;Q|97cH@rU8ecMh??}!;rYc zG~h5az+oD2813ya4S@Z@k0@5q8KHt<|Mnn$ME*fEjpqTBfoCB|(4V6bJ^mn~%=dUw zPZ!GOgXU!LQ8eL$rY3w`D4P$OmBB~RgbzBB@NuDRJ}6%XA4L;Bn1_Uq3rSyZ^X4E0 z`SYXc2*uAuG;ZMMBQz%PyCOsx_|vy+*>XvQyn@t5ba*>!s-|=_wxrYKtr1O{nOyrh zdIK}pRvLg87{YUy2Eb^)9pN*k{bm6)x1SLBk)laG>FP;6T}XM;xgBo}zhH2Ryo^|RLjtHtz!6o=HjI=T3Pz=Z`aY72pc*xdNE-3f zGKm*dqw=lszQPYx>Yb3wbynK_)^dBi5UdX^^*}oO)+FbRl%(9Dk(bf z!cEqJx-zajt}DN`Jg(Zxhts+qZ!tno|F%Q7{hIPs@-j9bKuY2A&?{y*(3qDzATb*u#tCAaf58uW7&=UC?mmfNSZ@>6Xu$1rm zd-;&jt+%5TVS9QpCo=f;x{mqi*n+7=K}4;tY^ACg@Lr|w|0p?^oP!7NWhrl}-=SPf%96&)q9lrx;V zfJX90pSO9ZrR$xRK0375HG&1v{1}VyiSj)a{TTAO*s;JP{;~LI#{xy;sbhOlhSc7H8KlY54rQCFNHKyn4Ogtn;M=Py`!6G9 zvEgt3Q_7v@s3#0Y=se2K3VO7RKA4IC<|bSxO4CnQy!pH{VLs7Z=( zB8h5eiSB9EI$L58a&X~1E0FGr^Vhs{ng4LA%_ z>F6}zFpRLnG~h7YGlyxwVN}~;8gLk1hQl-fMhC)c&+DYc_haN33<==i9xtqlFSf1s z8)y-K*%u8B`l~$p5k?B9kY*25&hZj#Nsk}V3!U%iCf=Q)A7OriHb25*20U{o{rB5>DY{>_Wg)16h!CX_(b#p%5pHD^#geJ zBYH*(>_C2EdZRy%2TQ2_o5DsX2$ATLD2ba>ws{v&C~PiumEN^6Cq>+eP*uAO769AU ztI8ONZug!q6x3V$qS#92zD(EgNYCH_Uuhwh%`0>j)!)Giqims0v%x7J;!HCVfzrBH?bu;OA0&Dk3P(|v$&8$DH#BtE$~%Ha&{jj^J<&OErH#Hwqp!w z!l)FjCJEfnA^F@JHl3?^z0*Z)yW<$_xn!Clqnj`7FO98v2356(M9L^uva_4Wlz_qpN!;a4aa*&vc$9^BGA`334{UtOVzfXm z`)wskyB3DgYc6n-RtVC`)cumbE9L`@qC~V<5D$`l*mo-}9mF3a+~(I_OG$?J!5tZR zFZ`$b5Y)EK%j^Wh=q!Yr8qnjLXCK9C^Gv1arUmFrI3moHb!$Bv1WFq=n|4fBf?HnYVyHLg`GSW;*S%ISMlN3c88q`b9kZTame4Vg-lAu z)PtEybIx?mJzyJYO@yIxbv2Pke|VAP(x)|9nNbsUhR1MhZK{kURt~N*@;Ih4^|Ug9 zbL9_b?zE|c%!2+vKAmy#Yd55Hi4ve7iI!j?(316y_-2AnNX_JVn)j<4|`C6YhZ`pzb2XE~hPO#c%bq&5dhIvcM6=s)DEr!us= z_F*wiERA3^#BrwI3M{q?J#pzYKsvBJQ%nO6+bhL109Kh-@&3YhS;sl_1^>!fxC*E< zz_pjCdsmm*;E+Ws`X#Fd+QaUHC|L`@nz0s8h%ZMx?Oh#xUm&Vjati^d(B#i--@NmHm0Zx60BZ#D;jL+y!5a#mr%gegNUmt)2E{;@R4Smstbnd+v&_0AQVj)tE!`%m67)&J%W0PNVRDkX zRpw3cHt{`4>w&H(9igC%{tQIU`SMSyNPyku<841=!d3l)5}8^CKa z@~SOetKKuit7>{dUA1a^z8K}`uN{7_6n%*dbdgg!eJPqE-fN^;OMz-Pjm<{K6V(=M zK+Kd}8cy1>o3`u09#^SL{SjvJvPbwH29&@b+F!r4p9oLFFt`*(5R_)2NFZB~ymH0gDWE-J3 z>gGel6=8y9<58>V*xd-b0TEr9VVVM^+kET5>-3m#L{N>2wt-C#)4s%K{+PG#eQp@* zW=;MicrY!%{iGMW1+=anKj%l(DyT}k21tqS$GieYGOwT&!}g%c^Z<#{o<$Tpp2n<> zILZ~yeRk70rF^Gr*T$@1H2<02E=M|_y?b8Odjv}KpzL?CD6N?WnrWL~h{wS*mv4>M zl8sttN;WPZt>Li{Pa<;o+bv!`-`W|yioU9&?iNCIU8*yBWg?c@QNrbqXe_4YQNVsi zQjb;cVVs%#tV-)dZJ%&lYbnNHgqy|_UC#H5EuhDK1?ahICD8#Ao7`UZgY)HA0&LN_rZHoc~A0CCs_w6ZzWM~0Cr9g4E3JW;%yeuz*iz^=1TP{E`2M)hpCbLQgIpwYPz{6js|cWH(S0{;kog zh@fX&zBBrhR99xexeFdd@L|w8E+4-aIkgq?v)(CugR0bThNtW#_x5zT_3k7682t|i zL^u6-EkTK4o+s-KY)qig;zu4P-?A600pj=dbNS9X<{^x}O4Bfohu+EH)3kiJt;y8+ zP!cw_?hew2Mr8CIQu@&^<+F2$=?1GxLQ=a3NyWFoBk?)i>Qhj^RkFKFvQxYLOMg%j zITd$FSrY2>Bgg|C9~0g}EOnzkhf7fEqXCB)uxJ%?Xo)7y*w&>=d6 zJfIT%E}vbs+sEn`6G1=vnuy>uWU{st?*Z>(eT2`UgGpQ*l+T1@KRV7PQP|mjB;2aC z7shha*d{sAt&pS%rFY&A z_t~<2@{EjLC|4LgOyY8&Td%n5FOs@{BI%NFdzp+2^n=~;hB+2nP`RrGs z#?HsHDG_UKN|aRQr;sLv`U07`dCz{0lGbFl8ecE9PlPq2kaX>2eV+}(E~Q#qE>zQi zYXFtHN=fx%ohZ)?lRk+t)x(i3Q6-sARZ4)wZD@fI_3vS&8M z`!%JfN05=i*$-o6`C&DQgzaIsN=~^jznxbM)b!w(jx%dM-JEyTrq^-Pa7b>Yl zB~+(mQHji0l^>-#Ba3R4@{*{8*KtCHW5&TEmvMPCW08TQOZNlW8W-Yk@(?EWq)@S|_THvtHSU90h2S~}~P#jw3l|3|($ zIBLKorA516{T>kYVq^MfSZ1RzAKy!;v~j$YYA1s6eeyx)3*+xeOd-ZZgz@(!TnQou z2KH8p@elacV+Hivu)1hxYE^qStxnUmAYBa zWYJE%3)bdS4;`mcf1uqv_EhJKR_3*OyOS&9ae3ns>Y}YvJD3#HI-?)KBSfWs%y<7d z$QS_i0L87SdP_Ps%epa*@6CosCwqDS1a<9fI81DbACZ)FXik#-grM||UY#E&&(nF1 zA0;MaNmB-Q47)Ul$~7?3Q2 zV*lKDEylu)*RcA8vYISe2GPs-B(v0$o?W{Zjyju;FN1`FxV4bHo^y?;WBoboF)JxU z%NUrLf*s12Ok*~QnSM+%roz3$M`OU!`N<1Zss1yfMg-NUi0V-^WVbusWdDyi?igZCe#C$60EOoVZx z2yP=B<6j8dKDsfA`b)xW`#d0#PZDOWf+hHiPGzXSg;tYqYom97!#%s+IKKB`tWs$ zxl13!Sb*j7u}C6WIh9S+kJ+W#SUGdV zXf31|M3J-@$x&I4E_GZ23DS%4RKkH84@DkC;A#v1g+SLn(}7Fz^8yw-E2UxugIO+? zOXX0d-zS|3+lLX7vo?XYow_D|xhSLyaJ#uEoC)J_+XAtlLWGP(aPjKvq$2nMUHvc;WL>Xk{>) z)pxpeLHob@3{fW{sOR};-?T5uJKXWzC+GrAqo$5*Ic-^nvuY{+9n~kKrvjuMOZER^ zf_$-@&)EhpXjge}uLGk=4Lxsg(A#%8VOhhGGiEzeM>p=W&?d!i8`UyS6}Oh?f2u$n z7j6nqX$sFA4KvmK20U~fwp81-5m8W|nxlSd3MnOhvm{y`#EU3CM1hOu+8V;f<$WxaDE2a8-agI>W zkmG@e5F}6{tJ6uX6!D=7R@(d=s!6Ry^%oO6a8g700=FuWY=@-d*edUK&XqTXUjvT+ETlmRQE3+rvEth~l=5R#U5{>=vOs8TBH$=)u=dYA!@a%3 zE1QUD;Gq6jAre%h@dpja=6&`H}_8=yjS-x^O?; zz{{ml{!ds8P)Ce!YsAJNHT*j7sWlmYmT{ z^>(dy$qeT!%ASqnx+}8G>3YzpO`=U?y5r#bYFrdn2PgXR+fp!}L_tq6u2F$m`ZPQB zRSsfBQ3lKUqv(9}I3IE*uUdm$rNdUhRDgL~!vI!X2EI!U%>F^KlDb?l6tAMgHtQGmB21O7)*p z*fNN0D4K<0*{+MO_n8Q#Kv zY(z5Ws@5J(wcSlpSi@98)-iQ8LPs)1IBq~%^#cz`I@4`ZjYl{jh%SqN{&Dy+oTg>+ zqdO>?ZjQ8dwkOlgJ)sGrr}$v4cNz?wlkI{5k+r{3q9jh2kyKs&>c<9(fi9K!VF_W`RQt;V2jCb~wdfXcGcHVA>r!GUgchpH$1)qn7ZSfx)GP}lajg>tO=|*CS>t_nxxYDZY?girnX=|Z^iYlJ}3Fnui=8u z{t$7xHBkHn)!E8CU-r1Yy{O-`cj_1l6br>qnaIc{98ZAjUrO=3MK)k$3a@fZBbv z;JCzU(1+e9gKpEvARV)#J^|)zo4Eb2k5HMypb++-MR4?p>dUaNmm#GAv5LLJCo~oE z4^qg9Qb<8HD#E1o4xiXW^okJ42t6XGM!B(?j?KoBD_DMX?o(;)JAvU0 zf_OuPp%s*`95lJ;#o=Y}iOZ{U;04HcG>60aw4=-alHRuG%lQDp5zdLrc`*N^}H?(;m~?Hm1ku5qT;6I3;zy z-T3l&JVy2H#+M6&QZVP#jjzxh$`hPZ*Xo?Q&&vrHaoQMg#kwH(7-2rwlb$>I72rn@ z>LKWy(8-_d<9?0re(39eq`F~{A3B>Us*2w_09ae7CQr-sDZKPEy5Z~WY^%37C_^dlH)6Rsf8p#ZXHQ?iu(oHI z%no6rK1bp!7ZbZV&g5t!`^Xk5DwWrlX(n&Fn0Bp$YH6OQ+1YN$25Zr%+#( zX}pW$&J+~msUmhaK|q9>SLpY!9};&<4Bz7N_VoDiNAQ013pVfk5}_ z-E1wWJuR|(4)(k!`qpT8M9c=vL~iWsoF-4QucHCYV-SntFbz2Dj1<#=!%h+m9`tbi zK1IIMGc5SMIv$+q>&Dp7hlos%vs8yp6;j%5Tkl}{*FtHx(PJwE_rc%y^-hzDV%o_`_V@b9+Vi^{yXMF{ zi5!v&rI}0`&E$eK6L%Q4_CosXb|9Ni$*6VK?2@xu%;C1mubDhCrUDt5f|)-br*BN_84L#nMl=@qR+W#oAA$3AF-#^g6{; zCu!j8!go-k+B6G^a;J+_&vYFDZ(5sq<8tdWA9q9=>3rRMV2S9 z6M7(;k%g(&=#d~jK98`O!2NH|25EgO^NQ*l@29eUO*l-Wt8vR`=7|~@FK@&mk?y>DNYU^=GIHAqBmh5%!AUw{0kPil})?}+Y zm$}uQ*j2Yj{~oQ^s}#4Nru+YIkG`9;Y`f9_mk9rAm`l#Pw2huT`J3b^f^sKMn9;HL zrUki7>M|&Hr2k@xZ}$hq#LVj8ocxy&eiC;GanWHs*S0!CrORlUr>GiBY0jqL708)) zjD%#?>agG#kh)Jce}fw_Y&Mdzc8 zU3e<9yqBDHS?rzl^>jS_S8wm>>DtItZy#iP0J5$BN&S@E&`LZGob~tXmuh6w8LeYL z|Bq+1cqcdHD=|m1h-laMKa0Aa)=}V%v984E=z*o8NjdqMo?sIGdFMO5k1&G_W3V&ZI!<8B z5>9bR{lXaypjKjiqG|HVFq=z8SU=y%>ZB}DaE}HbY9G7jP1G~o2a$&!W!3$~`WsSw zov_w_DM4r1+6rpiwX8b5;3#JnfaIW;3nmF z?KIx|0qHPkw9_gzge(lQqj(Y;+drMC=AlFf?wiv3rjE(mn(V*%l;grOY%+h=^y4Hw zUa<}^OkQMQ5;6OO;siNK&V|O=(zjE_Zt;Q{h@)HU-c9T%B^egv^sREhsE*YM>l_vS zzgQI&>RwyAF}#|YaxU8@b4kw<>xCI!;6tmpXey`AF2r&(ZkH#@{T0wg{P%u zoT97EI_&UT6&p8vOjdg3#Z&5{q8dSMeVVT64Or5(O1ktguJhp=?^(sE+%!PJkR=_% z$x;IjJ1@mF;ILYXX~1Fi6w`pi&QCE7fXRCgR9g1e{(jqt7yGV*DM9Te>Y4b)+rY+; zSU6y^R$WxkCycA8BBnIpQkk=OO*v)iI&L zN~5}1l1!qu9gPaK5RA)>wJo{V;dM}a3hK)WVxmUc;d)7_cG0~B?ldW0gc*uhFTU@L|%UHdvO!o6NAjY+JVw!xkTWJn!lY1u$@%CZ?`y{VYJd?1fQ!bvsn-Ixb z|G()_GG?vcm4b~dis6(pH!xnZyEDzMPb5(LTl(m7mwgBh#7PZDH7*^KF7&p)Asv%C zb+7dB|EoNxQj=0~h| z263kgv+x(hT@tS3Wi^_6zZk=$jAP{fVw%O@Qz|F>oxO{Y{gKFCUU2^3^{h785Jdq3 zrv*DwnD*kNMOnS7sp;LN5rtyR%M5fSSAREkyM!J=tx8nT!OrXqoCcoInGIHOhbk!% z+UUg2oKIRv_x5bjlVO1jRrXRGX?IH3OXQda95N^_q=ZJdxY^V zlW{?HS1nlB_bFlmwP206RmM|uoiR^)PoGcpv?aRR6?ZVu7UB+K^$e@CVAGa0N49Mh zdDv)VLOy+KggfR)q%*r@i~sEO{K%L^OFbJZJ03TEBei!^Jw_uux-s=i?7K7OI#+iK zQX5j~xV0izoUYpD20UHnmP#8>AUJLMHubr*pWHsNUWDY7vx6HQD*0*Ci_=Pb%a}A- z->|4EsW`mqGR*As&YkMK4E1dDpE;hkkPA%I$(>wM?c#Y#DOPFgC~zRDbj)(2z=i3f zxW%$&mM~uj-gH>EAP03zDnvp`sFzLz@y?Wf;Sz-D)@E6=Jb-HS9O_gpr)B7Nm$UsZ zFtJQI%`P*oy8sS;@1ny8`dI3-XaMPf4W*a{z`Exh?M=;j-cht`{dcUqb6-s-o*!o2 zY5V}*sHd-VCE%6#?l=vLSq{ep>ed{cZx0^htN3UjdkVr*Z5V&H8Qxpq&o?6jf~@7E z?+&u!nB|XfK6U@V@p3DH?i93+*mu(=eeKXTuMsw7UV8`v&9(1nsNCV3cE_ytxWtVX zwDz<-f38uU+DmELg#K-LmeM89)k!={`HQpkb%WUsk5>b=yDJ&`KSQn#P9oP3nY=MR z%(6|siD7&#aigQ8OQ5H z%e)&;F46D>68ohFli`oZ^A|^-FO=smk3N4?p1zU1xU1dlE6b97g}b3NG7h#d3RuA;IwkcQaJCht6hSOgWxQ`t?~` z<)<5Py5^4t;8rurqwI^^z2fcRt54tj<*9+u#U=tOFh$r@4 z;xPFUddo>AdVAV8o+I1#;_z?zs{f7iHh5z11c)xEFFHa5N zl9IVIvZLE#T}`ESD;aVSM(U65Vp^Q;Y5*Q!pG+|gfXTU{Udezz_Tu&xRaz(?i}={; zark$nj)+M1SU=~+adrwnPK2Kyx>UYehdv=++~LNGlx!=KN4xlq`sYhOPg+7Hn*d8( zd!WjxPlq(z`ZlXhO_8qo4sghR@|F0ObG_T>gR~RArFOi{%>wrarBwPt3H>X1#X~E) z*h#&~uW6l)e{&dVDFy3C~nPLCadx@`&VBhb3tf>Dpo9~6PbeQ3(? z<%H5D=L4yZyRl4Ajgm_Vdxz1`2GK!6v_FL&5mck1y&>u-4PVhj#wKb|e~*v}s!`EC zGT&gW9qF+q+P57o!YGJz86ka6YXlK|n_W+07bC5?&$!WI?3oCEP#U;@ceuE^y0giz zQQ_v%N^FHAZCHuq!XUSnJ*Q>YW8D6P=*fHG_JPqh+;%E&Jn2YU>m?Yym$Ev;C7mdu zegQp(8*GBy)ML_lLq47&eNfzJ?MIxcLu=T7N8tit5$I(jyuYxYcc<@pCoVmIIcI!U6M=TVfc zRg+DSPd91NA)-ZSTsR`AMnwz`y_1iT!DaZ$CemdMQb9FJNpZe7(jq!m==+&y90#rC zi90#8o35f1<<`l^xK_TFr>0g`UuR-bPR@og^Tsd*Gi~%y`;t1arB+p z46UE!AWBpYrW!fOfhV{!d2^R8s)ES*r%?{m@EMOOw;q#{&7lEQ+|)(-$3WCL3+~>D z19uLU>msAWX;bTF_ZE&vHF`^%8&kJxf9xI01-^G`%kP#te@oUMzlQ)m*wABVT5z=+ zR^w1<9gJf*BIvMuIMcGaiRdsPQqv;nuzaX#3DpbG3#&LoE7qgEZx1pos_kG0T^f>; zw9?CB{I9TfQ`!_xzg$!#Mn2i!`q8`hw~~4F>D~d!ytx;ZB;;8C@? z$2nc=kzvEu`N>Tl%8T)R>$?{@KO{Cw-yz37=$|utdX}ll_UZF6DW8Ly?;q8u9`EAj zJ4jRaQ=If9-pYGxT;6AwF-HEHvq{-YH>%Tsa*#jqSw4%f<^0e!@-1hOG(dW=&!w0K z9CmGrX#h;lecg?TJ5lBOep)ecug6?UBmTB-Jg{bk%L`TXH@4lG+pi$pPqbIuh%UMJ zL2D0)Hlq>D?Ki%ki9>WG;qw{zTB7BIs;kc=sM|QDTO^3vy$D^2unoO9nZm!HK@CM& zg_qtherYCqSqt1a0g~(toU86~2qK!hH`)lAu-L>fyKuPR zf2a2D+^FLfj#fW<4<+Q(@J|r09*)%`vCLeKLnxy_^o$&0qZ+C2F4NzWv<>O~7;?sF zK9PIIT~U%y(sj?<-5a9qPu6s_%$RxDL(+&ci+1y{$#QWnERThZ?Z2R(B~{v+VSwXf zPm{ZQ{iVI{8zNk{S?@Z1SINBqBmRX$SoIox%Xfu%AiQJ=9Fq9kwiG`zo8 zG1uumUR)O*{hEf*5?9;)uJ>0MnA9k6ZAN!0+r+g?)&vgp9&UH+q z`wwZH23*{l6w`pi)~1*S9JVgSG~lpXQcMF5yEVl$;IP|LOal(PK`_d6dm5(!7x&c^ z(}2V7NHGn7Rk*iDwDuI${geJ@x__nUzSFtdva|`Ew#jK^J${hReEjGHsGU38Mn>*g zkKqM+jh7yhh)#sak2oQnkV-#x&;G}5q|gy2IdpqkH>NozdtyQKagwnSHBr;VJg7Rb zs&NJ3be`w-mKoL=H&1EgQzi|s76~x=ezZR*S$0M%rPH-5g(C4cnS66!NC{}RpX-WP zy$L4x+*KpztD{SJ%Iisa&YygMv>acF?ASalX?)+obeR+rp@Vm@0kq(3J}EILeM;ssqNDsV75{_nx`PrH$=D}4W3_zJ2~5fka&_;?D$E3q;~XG%l|W}P@;J!9L%WGADGOgxzM$f5ML zEFw#zkz_GU=l;me{!8wSh~#xa$3~S-byepi)BOWJdhQX z+iORV_2}yNElk#10(}vP8TZ*#MfVO0!`G3>!8!bek+hBlS^m=Zj-0PBLC@KqPCmH{ z@T@q;>IM;ao*rpYBld#Te7);5{~YQkv)WKM19i2&JKmM&j?$zBJ5l}ud)#99oY&m+ zN`NZ4CcOzApNeSP3J4`K3?CqO0w~}|C|tTetlLoB@SeP5=*kgz5#=~jWTUSYa7tRP6iCj? z6p3TaZxu|qUM~8Se7kh*9IgKy%j00ySFXK509z=r->`V$baaozF zmRs(`_T+e-W%vbZvevB=rxw36!e0}&TbZks%tfC7lB2ANEJLwza&Em*mL%6tngv+% zKP^DDonu>K{JATzq-B|%wBfh>;kzhr+P$xV#`Q2kHEQ?^(lV(oLXV@^p#NNhUQmr1 zzP_2hGH-&ki+A=`I?@Hkh0i3fy+$qEh^DV$I<)?0Ik)R{(oGw6VtmFhAPxoK zXW`&O4ir3`d!4&p#&5n}Ch6vKfsb6AC8yj)!Nk864I9W&1ihy7Uw$X;#a!QKTw z@W%1Td}WIFSH4*)!k76dgxCR{NbvedGK8_VDDQ(VM0E6{`de%W-69VK89#eDA0Iu5 zuRKiA8oGBajOuuR;fSCb6`jmubOWm|E}fu(B~>o&0(FkV=*CS~g-b4`CGx0nlN2r2qAy80dKL=Vc9pA5+LVjdDKGwb zpzAy5X+5wKf!m}XPu=L{~`Drix*~mUxfg&6ZNl!3L-)(5ib;6F`9gYa9QSpa) zWba-$xkHyp%G%OY63&3bQ^t$0B=`LPnnDf9P~Uv-zszhJ_x{J@I4H|JM+ZIm7I!1- zTUxZ|fZ;D`;?2_aH}QdR4$62xPVRVmiL%s@RqbkuI66j-$nZI3tmn}fK%M8o%abH= z;mNhT8{rZ0KPGEZdS30`G=j_M9&3b0WDsyfc+fRo({P-M)!Lhl@Q7M|G&-z{h}fu+ zLD;>BSE@~#j*s^oIQQ|)Y6{P93NINAkBCg%T!{JNx8yxoJCZYx5rC$($K5n+1Iy6fe78X=#MCO@Hg9KFPCyN7)< zNSssut2<^I8xDj3S{U7K&~w_l8SH$fQ2af)4-8-HA6yxJNUHv$Bo*45-&&Bn6OoLE z7g9J~n`&6xWb$3A*6vT^5`!zEagrIWzwb?l89pcV|0$V{dX3_^0r0A;a}1@d-K>#{ zPxVpg^TWTTXnLSPk0Ree$wv7tGt1-Ll$RHXE5? zKw2E1Fskt}zBR%%38VA*h{+}y2x`?CiF9=;<@yfmO}9|y37$AG2rf-X)Yv z{`_e@F)JD2q(x#%`SlsKD~U3EK%m-zuy%mknjf7@OzUw|3bq@=30~iHB|oe|uE(v( zV07Lw!E^l8x97o?Q_jKcMp{N{^orH=UhQ?x(O#Zb%neJ-ty0`-HLh7v( z#vsPC(Hn84EL)$MV5W`E>NxLSDcV!B5a9oGW&-<%`=D!S|CoGZ=A7-*0PLZ;FU2(A zu=`U?0}lIMifO=M52Tm|9QOSb(*T&f1My#c4{QCtiH!Tjp7_!6)U5tA&*E)sy`SNM z8EX6+X$U{MpRd%`wvi;_*O~*@o@4Lk*Xdg^dO(szc+^Z~WTYIkVT0WX-TTq{>Q2$U zwKG-N9#Kp$8d3L~^IiG$*Zk@S(+@j4qwl*CEv3lKDUTdYDT_9wOnz&xsJ2GV5(Lq` zlGf>8_q?6G7P=7qDrxK51*zt0m*k8X&(-K66oo13g9tO7c>M%6&f5`Gqtx4BOW{6= zx|k&L%U8X_KWIwzs6-7CH6o}+MMpv;%T~S7`}jcKc;?|i7otdv@cJ=j>Tv|sMe{}} zo=7PgzGp!;40_`?IbfIAB>kO@gyYL8eZ#Cfrl}*X3u=Yohnh9DC>-U{U;rRtr7EjoI_jy?je^;B8yXzp= zm+lfZl%vL*7DJ!z%qNGKq*prRebW7t3Kq-KLZxZxh%2eWsr|k&RnE*^Bdg^+}Y|$-VKCT zLBk5Q7+hAU)2L+gVIA3Ha*WcITfY<(TT6vp^f0;S;)BqVQNP38r~V0*``4wd63=Qb zdAo5!uYyWpY1mxikLV>*yvM1k+=JKokcd5zL0;cAV37-Z(acwL(fvr6t`X)&UwN0? zKOBctjz!rE@jj`to+E=HmVVcY)NNKspxI@9dhF0Ve#fI@WhB5IQFLlX13(`qy zFODU`t@hJj)GWA57SvWdxpmK*>3y=r^FBrX^}p!*-Q)7(c)47E?q=vX-lvx5alB7@ zo$AiG)|i)-0^jo-?sxdn`|$9t01je$2Bw+6jyfnza?F7hXR`a=Fspr(uY zo~3rr;rJ2WQQ)#RAb;X*V%WVZ82)Dim-BHS=lKex!{Ra453lV`1g3sr{~<)x|D9IE zC^Q{jm@<evj%58r+y))|pkf4I4<_*-G7HWv2@!f7Zj=mVIXaZJ z>TshtHyd|nXp#LvcOIj<`Yb9T_b9NJomJgiB%agCEKa58HuMxkpta{z`+idM{rL#F zxR#r=ucQaadQVXQDLpyr#e~B>V8tsb{OZhjhs4xy}7J zMe?(ZE1|B}Np~^h)*=ztUWjYxhj6Cy_}&_tTK^0!aIu$uZm1vdVo;e;}>i*Cca587w{{W%y4i0~chRNQT^}eUf|)>cgOf)wl&NsP^h9 zDQkiJ-je*-@e8A00gbkM=uLb&J*wkE>9Nw6$Q^UI%GM2SB~gu8{yU4P6yqae@e^nA?Qz*;tj z8{gwBc)y#UOL(7yU3hp*`(D)4zC-^ctxB6dBHywOr2)zy_uuTz_tlhpBg1dg&H7aD zIV6(Yi5|G)=8Gv>{aH*}8@CWJ0SgP!vm!RvSEhO_D|??6nMJ<_uH7`&pfK|tewre1 z7FbWx4obNciD%&)wN?4iJnkLn#51n0{tBhhHyvx6;F8x1xo#1#9Jm|8qdZQ4T>jH5 z!kkRKDn%2UC~r6<9MV@D zc$|bthJQkBQVoBe>g!c)vPLmrtJT1+q-u%^LUs z=|4yMe0oQmo~K|b=?n15I8V_5{n)oHVU*}*`_xo73*M}qT)2Cl@9jVu`Fqy^jHWv} zxf+FqLGCh5%GgEkq=j2J8!l_my46!#iV)mFqv-VGa8#Yv0Q|ezvy-vGjp0Y3 z=?sUz2y0#qoVJ6!o6CYq*cpF`&klOE{Q6Oy#ZOi|hkq*6>18hqCH-TH=uOEV;dyq} zHc9=zTPe3nc6 z1o$TAf6)s>X@5r!J~y|b=IVCHeucCZOv@XK2xjz`FnD`vC4z}r3}zj%Q?9B_-fG{F zDvi^$bpQKvPAoG1huSmrx%L*+({_k|1gh7ydInu}w$j~9c7K;{cSkqM@3v?&wHuK( ziT+hWBJb!$35lGe-%CiOhyZBcUr0!7mIkOh*e_E|17NaGdjQ|pjkftlX!t3KK!0pP zokv!7YfC7N)1BxQ^6`hC5VH1MQOWc-grk>q~DeseEmLczlfVGp3mG?oz zKPRtR$DC35dI>hC85@pX6$uD&^d|{P5u?{6Bz0o!Eqa60^?E7O$ksZr5LOvwS`FM> zrrJ{g?l+j3Fm1#cYWfZ4qW%VRM=ALYX6cJHRuY>Tl+rn1;L*dpFH)B1b&AMOeK>*L6-q^EaK{G@$b zgyeSRk}qoD0(kz`?96R?`P?9GA5Ei zD|9f64tZH27Xl5l0U+T4KjOz_89s(yRE8pJTyXD8Dr=asJAkw=z-Ia!<(o=Wa(ymm zc;2BMb#sAnu@**gKk8{y#(3g71U=M?zgt_2VO7B0~S^5EAcF=jXZ&>#_nSAgaE*9zCFNARgOEno)(du<2;JA+qhte2>F-asMjX9r$0&Vm z14((cRu}|gY(>WMyOK|m*H@$-18tJ)JrFb;^-mxic`H|jc=q- zE--cHO?tuI_QT_n!wHR9oh(l11^a7Dsz~)aNP2Nj@6#;m-KXwHA^Uf3aG0{w7!GbB zTJvK0sfh{YV0AMb_^=#l#Cf9EZyM2OCiazwaa{S^xmJhw$nVoO-UIAr zsk^%S_5Y@`)6bdEhC`=_OE1ez;n1lPd?)yun1Z_iWH}<0UyJ-Mt@jV`h}MH9%aUCo z(#K_yew6waZEaqWIeN=>xrl{-`JJ2=`8`c)3)vuRT>~M*uSNi2Ee$ZTdwP^E}+%DXoDn`U*pt1zNa7c5|@j=8o(TXynC&*e826GjS4I_cl* z(scRJB+m8}wJ?lIyX&0w&TZmSWbZdAXJk zeuYUW^u%PEQ`bHpL**Ou+SA~8yR=KRBZ+m*quR4=BA{vGw8pL-?i||=m|9L0y3vZA zkWf~BF;casQ!=+&(a|h9@hj9ujQ0-vpp%{4yC=@?SG5fLQ-&%w;fL^Y_8T1+P`OM0 z?q;9iy?o!%pwC77L9l5a;A}ryM3`4ebbp)~4h!a?_3fnniCwWfm*!|MzaRO9c zbi0-`l=P?C__>Mct}|-5-&hs@aZlpzr0lscSdt^$!vB!}cxwEvIrp6IhLAMCjXtv7 zDSERlxb||FkKFC|6X?ILa^3|3f7-a(5;9DBHdkxnfkeCVrEiijLphn)cn9(dYNw3` z&l(NJjbPi<)t4iJ_F{GNSBjIXUnx$R@|B`257ghm?sImnR)v;SN&CC>H-5vB@ICq+M_0XK+5RI*;!(gA!8m_rgx@ zx)^*pwc#3|&T{|lM!xS78Fofbz(#FEZ4G5|qjhV)C~fVIw2IFnBQ>-qC@#W-$LI0K|X&- z<)Zg^FT&dSyD zUAqFTQ2%GjeyKc{Vixei+1g%=VUmouLMTsCrURPtP~PAJl>KN3(_7hPF1-!qTQB8v zQQW8B0pbz|F)M;e9_bzT--Nc#2@1TD{LpD=SeiG=5aN=w5GBV3!suiM=+wV#^%leR zZb|EF+T76T;=%-j@}=cdfFIwWnhAOoMTKLo!SNL3nD)Iu-n;X@1<&C#V4}Y^*))&a zxU*DaCuufT#=__sK1PI4sRw_)!kGK*QslUWtMYp7Pfv&a1oF|rf85;EJt z)@s|aGAN>^jSKR-fZhhFTRy4VnPijDv2-P3X>C;ER96Y%cX7lD7rzel&r-+_fv3OT zSZDDJ?v;5ZU7P$iypu)i8xc?93rC_*O}l}KR`Es&j5jGW;WDh)zV{;qWW;8-LpIdb&ujJP7rj zLRm29fJm8yvmMPSoa$6be#gbTM|iPV6vn^fBXnb0%=$_gED-aPA~F{ z!hFZ9upnP4({SxxM7nX8R9W;lRqHPiKO$wrpUcU;e){Jhe$^RW`z|HyAKvw)+GY~E z`+^2^tP<>%2G%b#Am2Z{DyGBjsU8vi8+_GylO+~n!|)Lw^>*Qyyub-TXm$j9CZL{x)^^ zb&XB)7_Qw;)i%zjXrn8EuKkoy^nMk*zDF5!p}k&Z`y$j}?eT_G;UuNJJ z8u%Imf6T!DYT(m$&o0k_23|Mtn+*IB1ApDXyZ6X05B()mo=Xh+vkm+@1AoB4Uo`NJ z`Pt=}Z{Wun_+fH{7nPzU7Vfo@dkdafj?s4ZyUI* z%4NxOm;JKw*ud8t_-h8f%l-y`17C08uNn9*?=kor_<93>&A@kAlFeV1X0qfN8}w@o z{7D0EJs_L^UIu=Kf!}E0j~n z{-%NNvn-qcDg%Giz{ek&&1Z#y-)P{nR+}Zy7YzE!VcGOc4E#a^zr(VpH}K01{C)#}&A?|Ko1O2`1}>ME zXUX$QgZ=>nf6c&Wyg!@&as$82!0$2emkqpoWp=*H4Ez!UzuUk!8@OD}o+ZyoAIQd6 z82EJt{*-}FI?mv4;MW=WQwBcig9d*Czs|s)GVn>qXY-dk^0VZ*!l1w2z@IVj?h~^4 zA7|h<8~6(bKJ&zE{-+xF?FRm`f%l%2&Hrozmjk6)@|2URS-704&BE7P{7=rNKia_W zH1I73zWkJI{;xv-vMH@Cyxmy@7LyS*CuzWY8};FPnayfw$DM>5n(?2MoNsp3UbX1Ap4U z=bxX==UM}Q-M|mKAe+w<#ccd8gZ>o*-|-{ad`>g)TMc}(fzP-woB#0!ev^SeYv5Bp zn$7=c1HaC|HyG;xPa5>C7iH(Wmw}&Q;5Qoh;|9LPz<0ekyF4cw_;m*Uh=IRl;Jt&{ z`N~f(XN^b48T2NOrzU4E#a^zr(IM}vNufuCpK*BSV|2ENI_Tdv41|11MP(7?|&@M{eG zI|lxYfy?WDS@!d92K^DA&ZfWBz~3_PWmjhNS!3XTHShyJlg;NQ1ApDXm#og_bAy4u zYT!4uX7gEmRW^RPfj@5Gm8-M)9Bbe=8~BR`-uu~X{^uF^JqG?a1K`?1Ap7VkNZ+KpBX_m{-8lW?Z#~S zOAP#Z17G;%Y(6&|_!a{{{-$g`4;uKiuVm9-V&Kmk_`;jB`P^*a4;lC?20rN@viUDG z@G}hjS_6N;z+W=(@|x`OEHLm>4g6{Yzt_Mw8~ED>-o4f+r-83D@IeE=(ZKIF@MjJD zZ3FLKXO!Q-R~q=Bf!ABI`QK>JKWX4?w`B9#-@peAe1n0%V&F4x&CYkFfnRIjj~RIG zwru_j3|#Kp$QqC82L1I0e!qb~Z{WGxv-6!};0GIcY~a@#_&o;xtbuPa@R?uDF2DS~ zV3s_W8uUX3zQMp>Ht=b8WaqoWz^^p$hYb8p1E2e~?0io)@EZ*L2?LiOLClh8>z&zn zzk#1^;A;&0DFZKkJv-lh4E#I;ztzB>G4PJNvh!VR;1?LU+=`PW&pQnIhYfs_fxl_s z!z~!#%to|-PEt7>;zLSmbW#B6f{1O9SXW)+*_$vlJ{vWf;xx0ZMZQz3j zezSo;Y~br>WS8e9gMR!y+4OrE`0)mQxq+`Y@TU!Yi-FJiZgx2jGw=%y{AL4x#K7ep z_ALE;&7kkSH=F)617Bz0&l`C6ecAkvHt=f={0ReZyFZ)%QUhOQ;13$O{7`q6Jl{6x z=YKDoJ~r?>41BYJZ~H(t|Dz538UugKz+1nc&3~bRUu57L44ezqGUfTILErmeHvJg} ze!GFcXy7w{kj?)@1Hak8HyL>ML)rX~HSp^V{3!#MU(U_a&&m(8@q-O~m4V-H;BOds z@59;oo^0SZ8u*h2-u9zx{`(vFpn-2NaQWr&EP1|S&@cXRHvRPm{;GlR|4-R`ZZPoI z41CEW*?ev^@YfA|=})rx++^Ty7`XhFX_h<>d^8)s%fQP&&8EM=z@IVjeICo^v&O(% zf0j*uhJinB;JZGa&F4A;f6Kso+p_r__w#K0UIU->L^l0-2L8B#@3=9W&t(Swf`RYz zi)=nO82Dce{D@y>^SR5we-UQWm!8bV&oc1G4Sbh>&gOHCfxltkE1t^cbB}>f`BgUk zpn-2P@P$uj^I2oyHyZXc_v>svM;rK^2EN6>mp_xu|8@g^+rSU|O*Wr(2L7gjAN*`K zpPLQ*4Fi`S4bHNkOP|ZeR~z_~20mp|HlO1S{8j^h#lUy{mu&tQ8u$YSo_ju<&w&Ph zwSmjeCuhm?DT98}Z?oxF82EJt{*-}Fdcojt;MW=WQwBcicLsk0zs|s)GI03`>@0as z+MJCaX5d#C_`?SNHv`}6U$gT)&%p0A@D~ky+Kbuzk2UaX4g7HfU%72I|HALH@f8NX z&cI(c@P#jB^IvV?&l>oS|CY_?LIeM?fmdG6=5wNfuQ%{DhCKgf&@cZ(cD{EQ_!a|S z@k%zII}N<$kJ3H1PEXzS+R5Z)Wp9*uXC_@C^q3l7V;s zXLi1a8Tcv#zsJB|G4RS;+4=5o;B^CEXW&m7c<#Tl^WELRPd4yt4g6sPf5X6MzMWm3 z17Bs}4;c8H2EMD;l4;M+GVogs{CNYP(vr=8xq)+qab|fQG4Se)Y`L}g*?bll z_yq>O-oRfr@R_;ne2+8m>ka%D2Huv>=D)?=Xm8Td5@{*-}F>B#1P zoPn<~@D~ky$8p*G&o=P84E(PKzR&n<{+Ai};|4xyLN=e{4E$CDf7QU}m$Uf~8TgM4 zyklZEpSwG<`}+!m{yPRfsglkA0t0`_z~^^n^SREz|7zeXCS~*aj)70=%BH`-z@IYk zx5s76bAC0Of8D_EHt^RBeD36I{%0BZ9R~iAfzO(f&HrQrUt{3U8~CCWcA+Q8p1@ME{h=JTL|&)PPd{z?OX-N29DE}PE-20n9IHvN*;Z2i2#pnuW8 z7f;XTf0Kc~W#B7jWb?V(z&p0jra!~Le{A40W@hslGVo^%{6s@P=kJis{~`l_z`$E( zW%F5L;8z&<;|5-yoy~uRf!|=@n+$x$oNWH58u+yKZ2i2$pf5xQe*=Hmz-R23&F2yW z-(=tmdb0W4VBl{W_=?_aJ{t_Yyi+#)1%^ChgMPDtA3Zml|6>NeaOZ6L4F*1Emu&hQ z4Sf8(Z2DCO{-%MSwQDw?=MB7M^!MevW%Jo!;FaC8>FWmmq=E0gM>d~p4g3uQUp_yZ z&jtgp?3qnpH}EG7`~qV=WcR(Y`JZgy*Bbc42L6VD&+N<2ce#PDGVl!szS+Pl{n`2M zZ{T$UUq3$Eey%gUs{YwVE`;zQ@FEQ}P z47_?kHlLFXe7%9cZQx6nX7j(+z@Inp-uGtnIj}QZo);SQcNzF*1D|qWcD{!h_+*=KIL$Ozk%Oi z;LjL%?}Ti5PB|hw-=huuIs<>wz{^Kw^FPeMR~z_a23}g8&3~zZUuNJB8+gn6viYBA z$aA4Ve~p1}Ht_i?vh%&%z@IVj-lMYl3>o+n20r8HY(8}Z|FMBrkICkjz7@OXS>Ag2Y;F=u_ z!D1KDF~KHu2pEEagkA%LkU;1G0+?P6F}(x`5FmtL-v6IFv%9kAlJ}mzPcvu!d+#~t zp4;o5V8QRU;GbLY3A;th-PeL&Y{8$g;OX6?`M+(k=M0Pgc^3Q`3*Np*wA_6y__Y@N za|_9Q`}T?EGv9(Qwcu;- z8_j2)1z%#pSKlw1&nXuC6$^g7rT(0_e>DHoEcj9jKJ|cTKIdET&n)=n2S)R`(t>|) z!FN6=n$N8kJbQ4o{{t=f_ZEBJXYpS;B$~gr;E!7Hu36E1j7y)iEqKL(-(|r+x8OZ6 zOte17SnxY6_?H%Z^~J@a8^wcy`c@ENB?%bjPzpRwTWr$_VI*MeVb!9Ta)eeBbxu_7W@PYezyhx+=5T|WwhLVE%?P2{22?LJ~NvC3=4j&1;5pT zZ*SSp@S(+jVScne>sj!FE%@0M{2mMbt_2^qAX=Y33%SnfAXSexf@#W<1P3-7W^9v zzUIZzaJTkwSz{0R&G ztp#80@@Rc_wBQRZ?fyv?|4&%(!f&GG?ry=awBR3G@HMZ9=09M;AGF}vMbUh=x8Rpp z@V6~^)2h+sz30kkxyM`Z=PdYYS4Hy~u;5Qy@Kvsk=5ve%f5L)y{WhA9Z^0k6;GMsV z=CifMp4#I7MhpJ21)p$DwA_O&_|+EtZ3{l;+GzfJTkwSz{51>SeqA*Goh|tJ7W^d( zKIZyp{)bucJ1qDQ7JTy?qWPa|!IxO@)ozUDbEE~o$ATwrisrMe1;5*pKQFfU|ImW> z-5f1EJEaRgME&dO);OAQKdo1|d7CigMXg$}o z;JaJ!lPvi47W_F2{+$J1<(_CgH?`bbyQRhd2^Rb=3;u}(U*%8H`s`}K&$8eTTk!8J z`09U-mV2-TUueOfv*6pNqwCM~z0q=aw%}J=@GmX+jQgVbpJl<9Sn!^|MDsb;f4&2EZ)m|Q z7W^&?exSvkpIiJ-eK=a5Q!Mz?7QFqDXg>Q}@Ea}oHx_)xqtX0-X~AEx;9Y-><}=HJ ze={jMf8K8MZ^5TN7A^O93;v)5Pd*;aXG;rymIZ&#f|s6%=D)iIzubbqZNVS3)Ss*U zEn4m@3x2%?|HOh%elnW>krw=R3;vY_U-zkK{>NJIdo1|(7JU7uqxqj@Y2Qz<_`k=3 ze`UcZFOHTw%Yt8N!IxO@(lgQgXIk)ITJVQ0_zxDm@7ZX%Nz1(=cbB5;0pG&sRtx@_ z1)um_v_6Mf@M|sj`xboM^U?hGx8PS;@HZ{^s28I7?{2{_w&0Ih@TM1|`S)4yBQ5x~ z7JR7%Z+|IT?o10l&w}4?!N0ZOtG^sAca{ae!h$cg;1gbn=6|FGzuSU0y&BDDa|?d9 z1%JhYk9jSc|11lBs|Ekog3ow8n*Tft{-6aGJUS&IIZ1oOzqk1c*C1ws>yY{Shv$r{g>m!yPY-E znegVShtrPN4ZnpcG3O_E-|IN}SnEtzJpu={w&V0}MjR zxU8wWDQ?293itaE)*n%Fyo~2oj!rmnk>xG(3c&m?nw*T91%^Qw*HH-b7ld&$#jL0P z3W1`w*X^l;pG z2&hAi8qlNQeB0zW5734t8HPhG^(kUjPJGZb+usGc%ynDUM7;a5a4U}?>=Ukj4PN~j zfc{sA+#o*%b4NJ(Yasm(!ObmCMTo9mjgL$=*{Z&wODkNGrCdt?8(*zz4%trvrnUuD z<|UtMAEbZV{1zl%bGqm*N|%JuqO>Z)i@zTpbCbFUuf@NDABDUi_HE?D%U2ut6yo`K zF}5flFS&R$@+lP(`GnD>;I$T#c`u*TM}y;09*9V@it zTTC)cw%MXEEI$m^$PX*!b9gpHBA?Po%S>@vimIgafABFrpUSuBGGva=XG^;jviWR2 zvtZWx+x_sv5AZS#4lGN|Gt*r4ov6ivINt3pOle`ha2{mdXv_e+*D`?H-vJLX^-Ne0 zr2H}k)qlaNJEoq7%kU;w?+GksG7;IkaQYrTQ0&A>FT+P4^#SYF*}i0Nwp8ybTf+r(9CKMf805pcC;w0sq(IpEAO~eL)Os za-7-t-yQVDC^U2n@h9*#3g1u<1=!$c0{aC26ve;JDQV|CydQz_OY<**&x}`e6>AUu zM?Cyth{sjLJ%2dJta^iq#Y9fV)jOb*#rc=P+0Vl@mx?PSd`~LwqdM}~(DtNa>PWs! z5}JlZ72tUZa-&gw@w^bUHQv+t>f?wpcxrU82tx-VXj z$<7u@)YkWaDmP&TS)BqZ<9hlg6a~qgpl<*z)*iovOp!88EK^RG)3&bTu>mYhX?E5D z@>lS7B~xZxy&>$TPX|9wBOSc;OYkrRMH%y!xvblYDqzZ2e*Fc-=k+hH_&=@JW0Mooqtvq?Q2G|J>e_(MTMfkBzf zCsYdgQR=~bqI@=(mefdaEqHF;i>Y^!QejbjJgTTh8Bn@dETQFvRI)gfT{ms!qE|J2 zfytJgu-PF{>T&256D>2QREmySSC_yb>9^sj+woYkDm>@nDg73rpaFYJMgVD!ryCFe zF!~Jmn0S}u4^Q%k7v>KZPN(1$CpaUnfWd^G>Wo+f+I5o7_Pd$9Qkar)kg1&~pj-LR zp~*AlcSADkdZr&R7QT{(WctRW4;Ew1>-93*7keSZDX}K-VtqN#Xdri_lBj&8pUiY$ z*;QkpbN9-w#D#BU)l7G}YbEtD5~|$%Vbkn#J07YPpM%U1Qb8b3qpRoq4SH680NAQN zXSz~%H4T*RfaR)9P4yc68&+qRgZUs)aZ>1ipi^G-bUT7{Wp>qTz&+zFh7Jv-#D5>I z+2kPQh_G(SvmI5~(X>TE?4&-1h;k2<6&LADLD>L5+=5?j!C$f9g^!~7?`^@)wcxK< z@UD-S?=x>eWuZqQ90nriHoB6> znKw4L-cffQ(w{6$NjNhg=V{1^&AAC7GF~4N-cc)qg%RV4YPt(RAG5a_El!l-iMDzS zNU6RgFBGPDPCxvi4$F^z@S?=5%;*U_?s&DgTLVvx4o7B}nnRtVUPT;OC|D*6LEe4_ zysB|zvFN<*HRSDFCd}JJt9)4VHliMpw<$-2g?T#xK>Ari?4%rsFnOCmJ#Pyxc{>7^ zyd8l{-j2W}Z%5#gw=O$CKETjc z8B7R+r9(^zgJnWY2*K0{a_^{S>4ZELa}EanEb`Q-`DhDWRD1qdc)5xnUdbO{quc!M z8r|+stkE6*j zo`*m6S9I-U6r~;kWjaLcZt0C6XOSm^C-o?t{1yO1>YC0e!&t7J7r@6~O{B#t^C-rx zoQ_w0P9y6L5Z5EYNAHaaKG(Yk0;cpnpqtYoi^K9@WR0Ffv3dq7z=i10pN2O(>I-JI zufG}s<%8Lr>gI7L-l@?S%k-h=<6yL2l3}-*6-k-)`O+18bV-c56ttE0No|8x$zA4+ zLFD{#u%|*xhshb!kC@^daaq`}a~*aKUW5X!%C}-PvxM#J`08FzBO_flPiS>3Yi`qb zLsuf_WxFq7fD#B_PMmM#xArb{eLl80(ZBK25U z|A+0x%iw`LFeS(X=P*@bl?8kS^H@gKE0py>P1au;Wx1iO`-jR3^?a3K@2iFVb7a_i zhlX8V&)1BesP|>|?NX!XMJwp}I%Pdmll63@ti?lRg?b`!^6L3o*k>cdJ~uS%@_N2u z^xPoO^J=5#q80Rfld_(u$$BhO*5f}e>+eR^mVvArjI8TxvX<9vsqw#k;Q#l=|E)Fu zVR?Uxy1i7>?S&z_4Jq$0))Z{)H?m&a3HkGF@L6eoFm5QniMrQ}8%pJ-e}r^fxwA&M zm-}jTM|tNO-B~`oMh_OG>J0Mo0Q#S%E*1hZQ9q9iF(C|A3^5@LRthm84AvH6LKqC) zP$NSK!A$?S6K&Df_0fLAwDYRS%xIlsXEvM|0ZM zJ0UR&@g?k>r_@Bay`Go8w5eAnIU_g3KmdP*DV@&Ic)tr-F*O5K1jmJI;jK>^j+V>Q z>ySRh(7mKjGc+cyJbj^|r;)ybv_2hAnPBc83$~vADV(I%=^ue_<8Dxmv3q8GtxYs> z=bUsGJn}E>O6o1iV=Fu`s@R(JHh7r63+9+Pra(*DL31*lMum120(^jV5-UuJJ8R+l zJ;c>Ou}(D!w&?>4j94o4`vBa)dB)=pAxg2cur+ zeaJx_xKB_n?vVlkoO~9z15~(Q#!5;eh$bF0jsok+&ePt302XD zWrgiZKu_$`sYbCSDhSMAn5V+iz>R&^jPzYU1g|32F(}y#*o4$j9Ww(Wx33kvywNWq zD!Um(TzAQY{TTMGH-{hoxz#R4htbA_+OFX0uMSp&M8!#M0W8*^g@^LR$h&6p-i?(X zWk&ubbPrP1*r%h4*(?kkVCT`aDf>!7AUv=!Atr=iCjY=~Z0IJ0@xMxl2{F|Fs-c?@ z#{akw6Jn@;6}kyw{7(omAq>_XVnP55^TkIdUmOzTi~Ab$MOe2!pw>kE+hxLI+~V12 z;}z!2GF+nQQ7EuIgX6(otwS5HMnOjAPe`(!WIq2Ga#}Irjq;S~=O8YIT)i7|nWTam zEFh7t#phhumI0B^&qN{x`Fvm^dC~4d82*z&ObCNb4lyANHYLP_FxcuLCIqnU+<_io z!Q7{-&ZThRlu3smPHTkWgfP6;3^5@LwpNG$`@KwkqT-~ELAK~)2{ir{D)=7t3p_#wGa48?Oa@pt%nTB(@}Z7pfO;s_Qyo5Z z$joJ#TMu3&KL`Oaz%ct_Fd={qjnf_VIFZy-8{f9w+*5 z(9TuDV8aFmkCMT9WI(jahZ^|NIIRya5+@;`|3R+8o;iWq-&rE#={b)0m z`b5H?51%WBCu$F$<$8+qsf1@9>=)4$Bbor}^9S(qrz57S3OwUgH)^o@U+Fl5RwpV> z>Uem|CaW7aczcZAHl#PA;-m)QO`U*8E>+#6!SCbryAk~o6(_whKAY1cr=j2Hq|$m5 zd=}y$HU*I?Vjg!h609?rZ*RHx1JWRr!3IT{8f$G)`Ql6odnFuvVRGidl^jmM2 z{s~*5zcM>$mmX|vm)O>?3wwSp_GF79Q_c!A{}30EyO3)*O7*vcNHtFcnRH1yGr{Kz z^3g{^DO2YODdSqywy5*4vfwicSY4~t56?0R+cOG8#Yvq3&RH+%=dz~lpp38$UB?J$ zUDm|a2jarB8~A5n)rfzNZ_YZT3CpP=x)&{_@>6(_X`ga?wrlVMxc zJ1~ur)k0n?yMErhbs^xrqwwCUf%jta-iZ+-TIGX1q8@)ZgE-*Lu#LP&&|xoEAB~W% z{so@uelpn~i#RfuH4#SSpQ{JNONCyfBOpzTmhV<1kTJI(2MM)5PdyI}^gH-SxmtKW z&5mDIHa9>D}ldHF0TmTiCo1FBTHLSkS@}Qa)j} zPj?4C8g4$VDs2+*VVE=y+xU1mriD2W(-y`-# zwU^MJjdHNcW$4%^O|#nqx&XR8pvQpj2`Dh8 z_rRem6MQ_uk8JSqE)?HgwdUlY8q3*P4h?;GSDQ?KAHd7t~!UgpPbfy;~hU{R>`3H|`>zlIT9y)X1IZJ)m% z$ZofMIIL+3-h341zR~dNmX93@W&x_xY9j;;6+QJ51YoIke{d;Iqgnlb0m-G3`U|{M z%~B#cjhfa6zz-%I8f39VRDae`>Aj9H{(W&SbmeSK< z^h8vg)cN$ZQ-i0s=;`P5L{yyA1&qOkc+_-EIk!T?f7kN{`+HKaLd9D{6;(slST4Uv z);O*fdsn>*xmf-`9FmLERwlPOK(g30a}?gmoG@=rr!)p|ne>oMfy`3fxgiQ~GYUsA z3Pi<8p)mHSi%k>)JI9-8-k`9rT@?Z)wwD>rbX|#_9kWQ6ffmhSaN&8TF2wgP5?=J^G z%${2izF|p&n*|g47%&Y$tZK*(Ld@x*^-3@E%FxLF1*M|g_2^?kCG`xpew$&d-iljM zP~V_C;bO+_fu-S|0?(NQW&eW+NcDitb>(k{>Zkt+lX|7Bo0KX=YLBoC?d1kGs~NqKY|-e7l`X3NkfMXKKv|{F8jbHC7s#sA zWs!`M)hzR9XovIu+(1^{tH?TrvRqvSgB470Y=a)*I>Gnk#iA2sv$8OgvL?kU=vOcf zZ2s#R$Ui=a!(crQB<*onM!Cluxw`IE;&7aZ)h93x>{>MBK3%0-tzL=AzM~(&tD`nI zPtC%)d4@K0TbUgbL${aNp)m9yJ7EDo%q{G}FU|!CfpiV$&(OqkoH92Ur##j;PB|hL zOo4s?4wQWkZKOLmh;G4!|%7FnS3gdU?)t zyqlm`YsMddUf3;Kc^rDViX#it#0u&4H^XOgnRgtE+KDhLCigFAO`?7i)+eDZoX2CU zI!&LCrhx>E;ZXHoXy}5eW1KsoJIkzcwaDU+IW1Je)^5b{`KY6GxvtR z!TOrNA4>RKBcQaa^n0aVyRCWIZm{ zjKci@&CV@w^O!$0XFmF-;M0&*4HjYQCJ@xjz!4QEnSql*ViBtj7=bvQ-LB@mP{4#_ zb#?<2k4$80lBhVz)TCjOO$w6^FgXh$(SLsrvuk}^97^e>AWefuLG9R2Z2DD6XJdRP zp}$`VO8pZo^#goLi(Be8AF`3Vt5u%^Nr7)n z#i4eMnnaA|!$xS0Z%N-Gy0jKx#k$vGH$G)Y@N z96qtlU&h{yRSL061^osSuQcSBFyV0lb;cN$J%kHE=e(38rYY~HA)ffo67etxjV$$G z=PhlrEvw>S-$2?KKiQ!_q`j#_FyhAi;#DvK2Jch@2GjpV0w9pFam-m2Fq&Po1%ZwK z2J2RjKqA79gS4XutrP}Err)#tJPN)!p;Mbzp=@*>oE&(z&xakj&vWq~@Rm)fR}t|_ zi|-x^v@QPQP+*W6glQJmjUCk^1?8ENNq!2Z9~9sLvmO{X3r!qRh6_#ji4as~arIlM z?_Y$7RQ!N1>U6rXz85HLXD~`x(dWOlGD`X5j!93!a>+l8G_=76>8`(`-?yM}rPa?MTGl|1~5H5)~)) zJ4iRx$R#xun9hi!sDn4z)z&IoOk95z#P#{cxME(6jV0`(Hsc%hjoO?96ePVxK%e2N zZ9y9C&BCU9AA*9^UB!wCN*--H4&jDT-YWHNpRxjo`5oDupDb@qi>!orh4$`5SzQO= z_~)uM;8OVo&7m+3&BWqnC$qGCvA91YbdK83oOf29?09=1k9Aa!r3s{sdIfxkLnn7& z09gN{6ysk?)A8FKps-@5jMG@NJ>3KT*#OIxuK<=33_FPyB1j?LiU#Ryn6lvY?gLIZ z#}n6=k=YBds}YgRC;Eqp+cNJQmaWSfl6#h~LDHd1TS%7JXbmukJ`55=dKT$qKIM1h z(SuPiE4Z_hKJmh+P0U7|*bxQJ#r#L*LDPM6WeA{6t590JQspaAIUXq4ZV6uU;N!+r@HJfR3hrcR($ssAbFR!;nL|ckpZCX2P{v!p;02;YM1* z9r!=O6)oXT`5)m*mT(I#;llP|l0S`kP>hW{Slt?PhDEi3q%x+@YBcRQ7q)4G9FsNu z^CiXI%F9UcV8g=QkQU@qsoiAF!fgF~nohf*^l=saM5HZp>`8cet(BLUWsp%WU`9EM z8D&4ncfA2RR8FAZMCBC84w5#gljZ9vcYqw!Z;|Nz=!YURld=9C@?GGBNy>~m2oGdp z`b9n7%z1LB9r3^zag%(+mCk0!qp`18Hz_DQR#dcc^_JH`BX5d<5-De-CI=xb~_QE}TAr z^YuuI;0!1`d1eHKnofAsj?~-?4TEyeGcRb9olfW`36d!zZ8Cam8ps*2mKB^H&$)Sh7)xauM zg^e=$Rs@lOlAIGR7Lr(2Ov;gnT<;N>>_I&q?iE|-fNn*{$*-Oh&59ubQGbt~jw*Z_? z4KN>I;pT;8U|-ImY>J>OQ@(U?Tf1ZBbz|X-MJ6t1R)W=Wc7Rd;tBt@+4)mZkXAw(! zk_?i(;kr%SVFGk9&I2s7vUn9!yCZ1Ol}>bf@r2qFKs^j6Nk<2E^3>K1ZV8z;Lc5V? z)3}YWsh$qTVPQKEkbfJJXOO5kshg3<)h#S7(n5rFx#u8PIAa;-M#zn`azX@(gI!Q`2-}31ebIC-?#Ln=@IETaE zc=AviLUJFQU01AU76NugSv3`aLD8Ym+tE5dk|sm4(jM@P0Vj;QBPdtx%D@mp`JGcn zICp|xtuEhmZ&(0q^7Z!rLwwlVV&TKu7uv4ItS$P)_3g+uSy?feLTxg4#-7#X~N zj+dw#3`<{Mac-s-5mS#G?qwgrI}aRmUH@Nfy2Jm7RKg6V3O^DlBsL?LO-ST| zm0^iovzr_dGm(qcBNuGqH<251EHjLpiCe{)bbUDgopP|;;!Hr?ek8*Oy0U&U2@u1< zAJ!n4V`)QhPpU4N)J^C+VEjN{tULzM6Wm-%z%_T)p#sJIJK=RvveXbdfc(4QqBfRQ zev_}0vbNS;PlNx9e6`d6NP-`U@sJ$WP z`m$R7(Q>GF{vYc8h)&C?5R}D{lD0pA4l(@)7!<2sW?5$zbP1MqQuPJ>=CmYNa7cv9 zB5o?7c7s-hczi_MWVg6vH`Dd=4}qJ$8=QMf@SQGCK+*=mInxu@e}r35gPq&GEj;2$F6?#E${oHwIq~O)&a4(gx=f>3SpF>`B

dDjbq^TgMu(Wu6BA5y;$T9upa|`^jvxz^PKTF+<&v0DMc#JeooZMUw>c;f_ zFef@qV<9ap;~bZBu(l5KSJ0n#)dTQ2m0fFBJqU6-ix75m&RGBnfj!)A{~RrDSqx39AxJEBy@~^pki5^P4fisfo`=RUs@dsFs{n)-`uHxF{;U8=La7 zh1-{bqpM(1&NyOW0{8Ej`yk9A>eg=FUx2=+gWhr8tu8=B!(qztNG<;oYZY# zRK-k3&C?(~Ev6@;;-qe;r(ZRAI)R>^r6;1|R7H(YV{#(hpQAfbaZ$_x2RGie^G!B+^!g-ozhht3sx%wi`YDuj0Zdg4C$lbY+fQF{NZz(7HO6p-`vM9KC z;(v!98*}~JVLq01+)+eJstPpaH`X`agT7qfU@CTx9pi7Xd}D4;)ch{@6JG$2#8}lTubtNw(suIMh;R54V|#_SE%gtZQ>Q>}yZ^|CYDH z@FrozF^cG6h(tY+=1-{WAQo%dsFnqQ561b7xLi!;im_rwdF&jc>0$|WhNRpXi9TUy zP;8kd8u*C^+;HY!!f31;FtM2yjNAH%8|Fzr5;MmtALE^L7tE^sgM|MHo|RAWaM^-P zf`7Ci7%FwL5~)p@eg+TzKk>+Tqv6BRpMxG>Ygqo493Tt*1s`AH!TiLyz2%ybY6X!A zhTqkT8cNXlP}Tnz0t^xrC-o;&6rjH=XG5n$fB$RvVe9e@-e_I^&DQ`wmgnyc(9NLd z*Q8=<`dh&MfA9!(d(kwurEa%+af3=1P^ItSZ;+@ssXs%dnEtN`%rV6b)N%O79)mZr zj*r^8zMRh{zl^!T*#XEtVQ&JUWCiTho(3T2>bDWF+5a9q3&;@5@b13=zC8T{$>|{F zn!56}h(x=&|B8q8)8>N3MVK5-n?v{@+md+5zU%@nn2P5;bsl12!rzDR9VR?Ci`2p= z>*14a={D&#V0U*rSeY%}g%nw(8dxm>tIqmWTs2ndI;(V@Rk}Uh9&k-}fUCJju#h3w zjBpLk=^~$0<8CliNF(Byb#`JrFbkqd2-G#KCc87P>;?HXQbzigLLdbCmY0N>5WtxK zx5S%&!BX7vGl#LS!YSDmYLsy`C-ibJf;G|0{WV@;J(ZTbFb(eufyXqTLyo3iEHIz7 zeOacC%gElndRXalj-G)DXPiEze{=d28I}G!stXx4#3vy;yEl-!>PmRSr7oAkDK?@> zyD*as`3&R*P#?RE$!_c%Fub_l$GPJTS*HGk+M9i}Wf(2R6d7V}SQvT(#B_|dH&D_* zC`W%rC_fGtosgsv9jCcn&F$I)U`~5&;rdB@RLITPo_iOrf`~zh%qFf`u}A%sQ8xmH zf(M0ziprG?<)_HtDv3JUrU8P;4;am(1aobaKk z=ly&q^uv7VG+0W#-#KNH^8?E8#t2{D5=pJrME5*{Wz`J4WJffWPa=r2oKaaIGP29X z%BKNM$%oDXj=3pyE40_m{Ln3UHXBX#p$LiIYytkZpCc9pqmO zYIJNiIyM_gE$MtqG2asC2*3BjublJdU7DjEbP)@~)A`}L0O9#zx)m?p@R?7C(Za2r z!20*#PF#suW?2zkiZEtOmhz|2)@<@CWggFv^TD%HYz#LNQ+mI7^>*$X23m zX9fnFEGB#4AEQm))#gwr|A>Eu|C{iS3^)Ye7T6+SpX0w7H2*qr$G{=@-URuocqqyz zbFJisY%l$fXp*d8_WhOXIe|-UxNtR?bY6s+BQx(@TX-{ZikmnkaQotdS%>bD0lOoZ z{?`~QHT_unV?CAS#H4?+w@hu4CjC<@q(74b_qL`>xL(nuf4Z$swu3b3AJ*wcy&$J$ zy?j>G^Wg6xq&?2j^HLcqoRpNEc#2Ut`J>6oOb8`%k$KEx1_MX*<1p@Xv23^BktTUu zXQ6Y-*d|HBj_TEjGusR`28QZ3d#G+_JtPh%x_%Kkt#TcF)vBKx_z|z%C?PS&R=pmS zF2Nt>6Vna{7@M-*QFnt6X0bW$bO*@7({1pDy0;y#pzh`3$e-Xb7};aC4j(z=KV|&K z>i*N%Fb8&~oyc)thO?Q}aa5|j40%4-pn|n)c5C~0hHuaBfIL**;;HqUnx|X|)scW0 zYRyiYtt~iRX@YWy9d6g7wUTI=WebPy1iK{G+i3z3s*jYYnsCQcB&#f$+hi9rpXgdI zsQ#%57HkuGB@o6xCvyTI*p1JQNLT+tRBBjEL#4(Ftu$>_`a_;EJscF=lE5jW- zvbyjJ+xLvKKm2S7KWenN%6XFh)MEfiyN7`*X;+>KlL;mhVB*Tv zW8r{ZjI2?L-6@fkscj%+TwYYGz{?;ts@{Z0IQwufOz*EsC!*rykK-q^B_hSS9Bv@k z3c7M-xi#lujeTQ=^7*(Ek9ypjWKR*iJLR>IQ3h`YlkyIvZXtCdsar{n8t%*!GS%4Nd?!Q`R>YdIq#sz{Ms3AX8)-k}^rz=k6udLkQnDQNkob zo|ltnx8d1C7Jn1>lKu%kdhf$Ws*oCin`7`f`a+bq={aBkCea<=PO%SN_D~IU!I!y( zbPIGwgQbolck0lnrJ0+>07{NW_UY)cAWie#wio8Lt8^u}!K6p-R3SeizkEvM8?CeogAdogg)m91sUrXkQM`9= zAgRKL5hIp2_lQPDeGQDL$5igds72bCG>G|d{X2*Y%qLi2!~AgdG+dhTegJP{cC$$v zQBG#^!?Dkwss@o9CNhn;;ii|iktQaTn6vH= zzM22c?5N}XHYTYQ)7Kyd>R~+0y+%d7Hj>P(u7jt>vMvYIp9bT6Tv{Ej@|q#|@EYLi zUig(;fErlhM9Q>uI+<7EA)f9B}7Ssk4syD|EuldY{pu z_T6v3J28K-9sF$z+bli_d}J#&rW&hvp|%>AL+9yI2=UZZ_&FZ{RhrEAyrV< z^L{4!ooVxXcik`6ui|Pw6DRazrjeTDkAWV8j0pN9DTkHEcFY5&Y(Ec~8TIfmjCs%* z!Jiwg(^oNn{t!w|E{#T@87~G+($;_&Efx z#NmpO@3o-IyMU|S0Q@Qmq62g@?LW)9H$b#8p}hg}R#Y`Bs+Mv*#PAdZ`x}A{OFI6h zO_$}fltxY6Grqn?UUGV1#~q-ndL1l~?O~B%mG+w2DlPU5xZxT7{a~@VC4Xb^&UyMp z1gibmK?;3u^uN_6a4W>CNhsFOVREs29AdTjiN=; zPqir+sm<^hBrjn&usJ@3LZ533(0WTe#(VlDXri_PUGS=@y5tL@B(vi*L~?SdtIHx%vw%s((f$s_DAiKSs$#4{fO2)KIyp2D#)V42@iV zQtqpi`}k0~o_-l z(hvh>+uDb?whu|EtU{%mQ8Q^T$`hdj+tFV9tc%Ng<$po}Tmip59kbMpO-QjE|8|I8 zC8HO|E<^Ol8A*dIwhS#S22Q}IP}tIVBIrVMHAmK)32UZOLzIKuho7t%%DQD}j9ZMP z9T+Dv6OIErQf+?bo3V>>Cwvu#RhubmRmxh7cG;X&smEEp%znZvcns2`_#Su_pF&kz z7`Rsy9Ss}Q!v!WlUtp-7!+BRuMu`a+SU4CH$mg&+!!@E9a+p8Fruhbj3|!^IFeHUe z2W@H|uR-syZ=Z8|p!SYZU+xJXm{Ha{!y;&{cfl){!Ywao6mjSX88R(DOM=mZskald zrn?iv#`Lc6-HM$tyWxE``rn;wm*{Ud*HnrdAs$jG$|2@%XS?zdKx&g^GLytGo5%p# zmEpbG9oztNz7M(6*_rk6>rx*}tz~|nLYhmj+ke60V15f{yI9vx-458t)&`drZBDmq}mDBj3+9mFEnF5L*pA z5Mn|Y?7st*O_Q_#kH z4Ts4*@UF}kU*p&X+G$~}zrqJ-;S|skUTFO#T$%PJA7|wb=-rsk1Al?qQstPiMz(s0 z3Fej;BMrUkBlMC-Xk2#m1$6TFg{Ff<#YsI3&+?h!{6C=5O&N( z(wD;#1O`<9fu!0Q%dEqdmOUhocOh>zoN*XWu9Dwe^)Ms?aSdg2J;GG&>m)g&3sS(`ZXXZW78|ms1RR78($4^ili0|>WJXWnf%1pySkNS?b`Zpin;vo**pSpwe zARpDo={3k-O;{Q84+5`2qT-|;MS>1ejxfMpjdo``dIft!Z(-24Hop9W8R)T)sXhds zncihk02_xuqkfn2a46_pYqP%;w!$3!U*I8+-=R1RaAgFHStW~ne1Nq6IZ%B#9`ef^ zD>(T_&|TxPf|H&Nl%2)Cy(l4(mUZ5Ie3|za6X{5}HmB8JS#mIQ)x%>B(uoZvm*GLK zck+EQ!lW8n?xR5BH3zSxWJi5Ha@%;beYbz@@a~EsJ9y0xX!L)xEV$TW=x=C*%F`$sy%Y%sCPsaXLhQ zio7HTLrMj2340=GJp%zJKC$97Kco(T@x&8qGv)i%))Vk+JIu6Z9(h-1{fkUAU8mcb zce}&UG3NDCGWJFw-1PymnXc~9&UEDLM+)S(}>=GSv(#`MhLcIzbLU7nvhbS(K@;~S+Uj;Mo;c(#OT%8 zPtwAF8+nW8p$f>nF{91CaE+BerMxPXsjce2!)$mw5DbE!fZ*yANXM`gx-5l*a2zBm zP6|_JJ-H=qU^m`e$=-14RAI#1!`bU5wrUvNZad5I=E1B&Ysb4cq~|!^YoJ+|u?xLF z^p2@RUD5$PA;=rx z)ATq>(1c^z_bFJ~Bl48F#AMEmrHo%+dR#CB^zX!c00+DWLVxrt??hCQCOCrRWhEC3 zDY4uuBY7a@cc{2cJ zr!KbLB>}ZIFZs8)>{WB&K9JDub-3l@nE6M)!Q8Zk0H~V5iY=dECG{AYmG8lxe}0v> z#X+wQjfOPSH=8Ux+$1N*v~bpK4VD0UIu0U(ei7T4@6w$ z3o!XaN6|k4*;Sp0haBE%H$WkgV$JEF1iX0(#yO7s&d`cExV0O%VPGC^D?EZfOySF( zKo8&8qJ=N>M|>jwiJLrL$FY(uIP*L9Equak+PGhr?fR{VG-Yk!N?lq0KqA9_1MfhL z$;7?#ko@o@=ZZ(Ma!3lm`TlKrZ5t3Jk|ZU-|j4bZu~1H#D?kh!bRRcUAJuRObCNvFm5m*42FTO z!Gti_>meqD!Ip%W5C(fA#DoCG_0r5p*>m$|=q7~m|Mw6R!eC27ObCO$6=Fgd?ClT} z!eH-&m=FegH^hW6*n1%+1h5P;Ao|FUVy`Igws=2u7s7=3AjE_)*oPq|guy-vF(C~0 zafk^44EyC@1SV~z>*{Tgmsg3;kWup7#O2~?Ev_vBfAU| z6(_YAywo#zpdg|S*_xT9FlA?{a}Gn^!;w@^eT<|1sNdhl3u6b_QmQ)O6SV9pUCGdU zaDVB_hTfC(XhZKsdaR-MCcUbm_aQyr(EE~BhTf0#PYk_3=}Cq@fHdX}DEC0pYZ&?< z(rX#|VAAUt`Vi8+hWY&;Xg%##k z{s``71RCRHNT%WRQT=E(?mY;9o~GOw;9vy6WpmP3s(it`XnI!Ie+jz!8J?9dNvb^| zJFM^HvQ7fiplTGIOndSpR{^|QQxX-I$cfuT1h$Vmds6`ZEHZ*7>I-s~DWes(5$- zvQNmwV>##QH}DvCpZ7&j{|uIDqT-~UMS-sVyTQ|b^z=)5A}UVmIhJ~pUz5(+5Ojp( z6(b94gYo`jX~eo#)o&X(?oWPuxzs2_C1>6vp}mCzzls&&futX z(Bk|1A;->5ru47is?Wv)i*U=iru8|%3vm~Nq-~*X)T#d!d&$ARpnaX@Bg`_Y>x^(_ zpBVO+m2(Vw8M8%iCa`QZz^`?aWdGeAka8k`z8M*!58XQ4lIx!fT`COWwi<(|cIf1) zPTFxk9@zE8piO;nR2(z|~tJ6ebv$2JFP^UxTQA2ftw+J&-D20(6k5 zIH{K)goA8-DT8^vV-an1))(>%t55ne5Gsqgs6xtE3p<2=i8L&vONAij_{ZC>%fSiT3HXv#-9pABY|bo@=Yj=t&L8Eo2Fn^OpXuWyVaOYM zoC4l=kar7KI9l`tsId*d78AB5;K$yY`Q2CJ+-#hijkC{dpSY=^#`Ajc)LQ|~55smg z{v1z!SYfy+fB3QQ;rcg>M=-_mET>pR<6t*H@I$35PDo(i;SESIC^H8Z=34Mscrz&f zh+{10tcUlN%i+)9y9GG>UhHzGXB6EL=*WC|0&+f8vGLL{`=grWT=0=7H^q$P#c^5mgSn6{UwRSz6{oSCHQ!g_TVI7o zuD1tZN?#4SIV~9%ORa2?_*?MUE2FQ0r5h#`f@zQ^SDXehoPP^O4aGibmgd9xho3qt z@8)>M22-5%4mVM8VcFAy^TIeABX@TF45fhe8Sbxd<5&&-t?iJ?9JAHNY3N(7#diE0 z|96l&$TF+00aZR7HJjvrX>tb{9rD7MO@O#MM7VQ&!s#vk4Qc<*LwHMbcQ2g~h>IK* zBpwE9)lJaVkU68u_XJ{<|MI0Yg@k>aO(CN!^_n;i(5ESo+$-Y_G@#PZxdXyn{7F<$ zjOhp0Y$HL!K7!|%pwYhn)4e7RFI81E~H0 zR$+xRn|`mO1&NB2dWD{lEHzI@($n?yL{yyAtMHUHO&E50;UnlAGtT?fR4Fs$4U~-e zC3c`s2Wjm zQcK_oq2|!(W`;uf5!og^JZF9AfijNvkygd+hhlG$>50s$+aTg-^0^$TK1fuYZW0aX^gV@HSGSMAfP$cekxjGv*gJQ6G7^; z;v2GeB6MK3z<|TF#jGKQ%u(VpHIsYTy!p4#BG^&Kd^DW(+CfgPY|0|;P`nkcwL*q+ z$8YqJ)6Qz(dJOX#t7EKh3CozAxR$z@t9HzIQXdC-v_BSr{%vH#vv0RkdRV@BW`I@D zFUYqfa{?jX-@{)6^Oyu|W}(}j)tGYF66F_7jaX4DIdko7r!SE#2YEo8sWRpz7q z8^KwmCdzRRFC-Yoh6Ff96r^mv%ZG6gBaj>ul0gj9_a@^WlTg7VnJLW-9y1~SMKc$> zal;9DHy$c6?${5N!9}`z1+rwoBraxIIGmekt2B#}&`pSgg7v#MSRdU1OY!UA7Je7yK>HF zZk@0CTG*;LQOx_8`-31M{&yDtuv?V8F?bfs?>N-Xl`HFVN>h}$N#nes45U}5H+L7}~LO?#Se257F4C{f{BZSUV;Xe<$+AAW?BrOHHMC7oF~6A$-dK ze<1J&0vIm$aCtMdRYKD5IM@otzXRTQP*VLKgfX({i(f4OfZgB5zG(+tD5ruj{zq(+ za4@ihNq8Kzg|Ed67!A~Mnev}IaL?FGWYlbO@ouP4)OMhcS`)Tc+k;w+`QuC-Yny)< zTyVdKr%t6SS*p`OsnhYeijJvL=b4C6(_%hEhPoS(GH&V&cq`366i(PclDvvUT5Z7i zZdi|RQucOK8{+HLjf|#_$&+lj>(j(vMj|NVjQ2iW6f*`z9+7!T)V*<;M?D^TRSQVY;5WKQ!_MU+PhSj4% zdKLeWN!>cCtw1=w9u#6H^+%{tz6~72rT#nHf`4kkSN$Q{{|*-XObdRm1^>u`k9FKg zJ$JC+gBJW=3;wkQS547!e{R9Av*2%8@S+>de!yrUva(&n}q(vs_8YjAs-9o{}~8&61{FPtj)+V z-tfB{;aU~eLJ@%XQgVMb|4ea;wVK7KED-rg0n^im4j&DPV_OjvWnkaLZahbd{qk=F#rhaUe{tkQw`e0>o8Vaq%8Z?hC8zo}q z{4%ARekR(CcAAFmh!EfbtRuvP0LC_BXS@edU$_I5Zl+|p7Gu7XMBw^YyoPv+dxeD0}r>E2>(8TQCx*GN_Z-$rz zLuOC?!_JP>~l%ka*`5XxWP@{ zxaVHpBfDh@zyvjc^rK)(8_*tQ%qd7jQUHQTp$^f~bq6#FbpzwX(Zw0?EAf-+<7bST z5BcbQYeucO4DIV~fq%K+1@vc(Gx~B>OW2reyeuE?^B^3`xKtq=E3FHC_}3aU7n4o^ zJ;YjnMZ|)iAfcs9bj{#|yA@6P$DC0Jhwc;3=SixydWIb>fIG<~=I|Ysx3n`6G^}zG23fSq?=}D|Tiu()>zkbwgfVg0 z&tDmG=Rs~le$W8ffRkc4KVg2g!Bj3hNY8kozw|hhmE#WD1zkSWf1|-ZgC)6`dIF9| zVKJsN=N?Bil~nJd@0anCYra{Js|ky_wjp7k{J#ntmw63{cHHV1NC#&^@wGtDntW1CLN*7<4(nyolQ_#kL8js2-z@hHQC-jW?d(NuR0i(dY z|FQJJzLyz8GL8*yX$47^cY zP}7`?b&XpPV8t0sv7^j~6rJW(%zOyX@o>NQucGb3*0a$r36%&8lTdL|p&dAeJDYa+ zEU-hDiSf#KmD_PKNt;~wg_)kXw2sMA!o1ZpFghl7%9qn1H--jjP9rJ*Im94oTs0tP zI%4f+Kz!jU69r(>)cy7r?p2Av6yMxs0GV>Td|kh>7AS?$(S91(&S z+;u8_#3561O9l}Hr;gWv2Wi`JhEhI^GBI2#N%n;}ZhV~xA|Id5S`A;5@P$@}3jj{3 zkNM6_1=b~V6$l+Qk&P2hDg74e%J80agq%*EsRD&uK;e%ybe2YUn&1s za~_ZX6YxKX|0iK4V*HOoyoY~s;2+D>#&~1(rm=4Dzkz*W!ME_rE*S$4L7XL;STQ88 zWgTfbqM8+@k}4DCHTKx>H)@nKhO${__2BzL$rrmK7vSfaST2G!{T$p3Abo0_3!jE6 z%(Q1L`y3;)Nxq2T@uTy&S5qW~Wq{!?4%~2W_$G9u8^#`3ljcS)y)qtZ(?CD!vo*r- zFQ}!>Y}ry|$gs(;C}jHDU_rfy#-uWVP@>Y!S4%jKFit(dq>c&lD&|$3UqdHz>k8)O zGa0#v8q0EITpIGz9>qdDt=@-({)?cJ_$%P1(hq=`AN}xpw}b=Mye@-b3P~P~oyBOu z@R|N8bV|zQi*jcb_TDA+tH>2nkhp}%k6IYavGeDt^bEWw-Vn8Rmej8y0M>_I$Ey&> zuZid-pyVe@3TRkG({rflzfnoy+JLlMS(UZBL`{CjL{ETv!9YuWhXUe%ivhE8avvI@8+^Z4<=Z&@4u9k}|KKG0L@;c_TbLW+TlMbRz5 z4{y|vTY}2tcaWsM-_+UbYLneLcKQ-(U&6d%bZzq7*)jbSD2ttN{{Ywi=i$MtPHfO~ zJLg7adm1hwp3y(s{bFRXFQhD-LO6{&82~npW?@jLrUnkV1&Ni;5Am?S^phVW(>Sz z;kzGJks3G|u#jJn=^f7yh}wWK=|an--v+0^4|3NqLc{SWWm2VGa;cb}1cvJ$hQ0Mk z{SLfhS)7yah~~Te!cCh={T`_CK;FlD;=5*-xwou{LKoax6Z}*{Ol=LjN!gVAaDy}M z8He^k-B*$|*@coHSb~uWK4l!}jL!X52O=*)-a{1W%ifZpswFm&T78t+jU|bkA8@AdA+Rjx0Lki zDC$^qU>z(!t`w`HcUx0FWXL|Ywb{QlpPU@eG)h&4FNf6Lj5jG0s zFFeJnYc}xOr6!Q5I2nO!HF(;!CXi^Ak7$9c%}fkq)wLTK>{gRPRGdT#8hGaCZ147U zqc>EHDanv+^T#5&F|mFY-{mzSBPBmUB)1!%Krmerx0Kojf()W3!wx}`T^*5Rrfwe7 zbl|BbKXDC`{Sd5cqwhEp`CXR&${RzRT;^Ba85BBx;)H^XO*;GqB)Q_T*Q7j8Qbl1-iRk-HhmQS^|5Z>hu<_=PmW6;czu@#JL;+aVyg0 z7|uz#Mt_R^zr7#_>%Dou2`stpgq7O59CwJE>beba*ryf;qT(cRP$f}joai#%8z4Uj zWE**#D?h_k?QLMQFWE>{MpT@n2vJ9@qcb(Qk0pFFJ-RV>Ek|F~{s;_@9B=Lf|5q`O z%kodK7ZsZdg26xxi)ChC0DowUKOnrw+)8KGfrDcPavIlU=9oGV%&{zau#rLiF;{@O zF*BDegy=YcKD)t$0LC)M(GmZQK2Z2j!|vyN;eK&)4S3>a853Rzgn^u&hL{irTQ9_f z0LFZh!TV~)8>hF`k#${fa{Yh6wSpdhFk^xV@b&rOuZs0rHJ5r6)h`$V^61jdwbKkT zt^CVA^nvN2Od*UOGeS%VVD#TPWnJe9vCq%5hL$%AnOtfb}Pc0)E~Ju%|x-jVqyCeKee#(Y1HgF`&?!5Xz*kD zN_sZ2K(C^Uda`?QJm9|T>08`@w8P0r2oWyM>Js3-x%8-ghB>AdMi=0u(0@a38$E06 zN`w{7uyw=QbUOzC#qt2^u6(Mx0gN7Y@J|CX|1+3lkf=DRFTqQWEr-{W`ul<9Tt?_P zcn@~<-5GgsGEAwW#846mX>F|$!!C&jeHTd3W(oDUYmprOXDw4JY*{L?(&%6VCOY&5oGfEO-k6H*RzbrGXgTjCAkDCM**HY&JmOlK%q5cBF`?&)) zrcQwh{z5#^Jrie7e+gHHXPnEfdXd?NHpdoybt-(yN3pw&5#m^Df4upJMjPg;ZrG4D zPA7NFMPvqviW4u<=;`PD9*$@sTUIw}@IR0K_o9EI;-ofVR{9qnY`{z%W%mA~job(f z%BM&Zy9)9b*Tr=UdL*br)NJsQ{X;=DRI5j5Bd%96N4W!=KoHgm5N8vgxZGiP9qd)Y zl}7Hs#&pLf;U8dz`dkI~g`sA4u7|&%|8OqU2xb+e*y#?*zZEiY{j;H7g|ZAs%?&pi zBT>{R9EG560nJ_E_2Mz{Bk52LIihIvg&s1-S>GAGx5@ss{ZQ&c#wxBZX6&Wz-U32p zy-^6rLjAgBhzS9Vzp217bpzsKE;W|IaS^!41^?x15j)dCyBQP^n2G zr4Wz_`)(IvLKtlO5EB9z+vP3sz8N~MB=@4QGjK;}URD}X+G*Yw1ciB7eFSJn`8z>7 zu~!c05POIFPCBYPP%L%Ac4U(egn-=ecS9ME4s{$$SnZvObxZu{7Pi5p!~YJBhfreb z@2@4TJE}w9q5nz#AEDx)DD&GPog((}&9ZMk*|21?lc-I-h1$j)*cnJT)x=+el{`%l zYB|-QizVyc>N&_lWyM!a_Gh9Gn~-(4TbLhW(zlFPCZI3q4e)730G(7I=x?D{8)t9x zK15T!N`8{B4h_6cXz&^j+{a@cQgxv|hC)2o{!{36E94=!V8tqOWfzk%IW95^A&YZPkAd8dkK zl`zYVO{em!wXlrwwh6qMUMNVPD#XE&trp%qJ#0B?-MNm+b@csVh z+}nL;GJx;eQ)I`>9h^zcHRvPqcr2kMpCt5xxn+x!OGFuC1KcnI8UE;F)8KP*dXuD$~ zyFb9(Cpxb>Kd-gly{quIDmNR8oA5H?`oBq^eU0t1^l|U(>ED&BWDn7Z?0j<}{D(xs zfBE4K;8$91(ti#7l`Wh?c(vtzZTzU%rcYBy(*l3{ar{Vrd6-IQJghT?sa{G(_qAn7 z<5ky?-fm%Q)N+VPkos&LfcFz#ch&aQ%D+f_mL=-l%v{}!)mvL|%}XJe?!tMzopL-I zZ5UL4s5#h|+PtV87f8BVy6jmh#en_#OtT7Rp)_aZQK1Ne^5^|S+3swMp``uf zj=6r)d%n16Ulcg$o&MIPFu`KmsOpzraEeuKlHsNh(z3R`DC*uL>PCUhK2y==Dhkhr zl7DJasXnLBJd`0JTbjI}R?q>@qk>vcco9^;>F9_YbB#l6BvHPes2#kzti=Us9+so_ z4^b~Ys5(a%ro{cWK*{JW< zx1-TxLD;PG4U_q4OyMU@kGn(HrXI0K&l4iD5$Q10cyh^UO?F}`tL!YmS5&XURFQs} zT<9jPUU{bR(^X3P_>`0X5R$Bh)9Wd7mVS9QTF$C{wpss57oZgFeTpOF8mQ!nLwqJn#C7OhuM7M5y^+5U7b&T4SvFZ$yIoTpRUq~Fl#r!On8iB?XJ*r zSSf@#gj{wMyxq=}WcFapI}kz+uM(J+0XBjmnq*$&T8@;*ufYfV;wH@cIz(V~xh@~8 z`&w#x}4RaU<|0vm5GT zc(Yj}910H)Nfv{KRY-;u%rZ%pYB&&DE^y}ZP56>|{H$PE7V#u?*a(lTJyf)|i8B@t zgN}{CkQqSQ-e*O9^P<)E$1A;(`l^SOE^W-p;LUs~gH8Fg%3w1*_09PS1@ahJcjnFu zRifLW@pWh{|FYW2n<(pn%c%f5Jy5t!j#9D(k-N%s)=Rb&l@17Sp}d6JQ>=Y7D@N<; zieb4*)NB}v)_i&@K8e>h4aX5wFP8NdIfEdnL$O zU9IY3)Te6d*6vYb3w59n?vfeCQ!w3cO9h{%Q7=k%kJKaNi|XBaSG6=} z&H8-6-p2OwuoN{ZNkqEmXqfcAAsSwg>)~Z0R3^B(g6UE%oghUcOB_ z^@RY{G`8hS9bCjGY$x~1()N7nJMfb*>O)C=_pI6wEDT1hVNRlNUu6v=pvs%Rj-#Qz zMl*-QPRU^AaM%fgadziKzR8Xxr}(N1jE~WGB#SyH8mo=t3HK8%_0?@aiW}Q8Af==A zzOa?8cfz{VuZHMysa{v}R2r)l#w`f?~5kSZAEHYkcUBER*3@Nl)vhcWASy@_Jz};a`FTM^n-;vAWhRWg|%A%ka z6uO0US`KMYNP7xNPzwq@Ace`2g+#~wrajHmb5VvA#Y88l1$DaUc2cHbY8^2(R&;Hd zl_Qj2(f5#9n4*MEVQ}Dr@FbVQo0P&{VoFd8Dut;acQNeu6Ic$tinZqU=6sCjJN~>gd zXn$X6t)Hf~tEaVFn$}#UB_Z{jXgH(ee6QwYQl6`_Z;BrC`m+I1RDX7dM7h}5L!XYu zp87CH*~`8ijlKECVHzCT?O62=KbX@PU`7@}T8BkZi#kxjf zDkKJquQ8;w>WIdKAE?~sApzBq1L2xFa*#e9je{j5FDoj{Mv{{1;h5@Xw9axQZsaMG z0{9< zMn4q48>jppA`VBaPg_~Su&`7=LTR(fG89(lhh^6_45%ymh&b01wt-;fEL(e+&bGU( zy&c;*XG7=K6^wm$i^DBMw7W}nU*eIFU3?u<#(k8Mm;;~lXF?Xh(E#kI9k->KCpiWP zGlN4kQ{ZW)P493UCare5wut&5#M{Wcu}XjWBjxAKX?_lM`5)%;KU^Pb``hf>(Kv!{ zE4Q2eALrJ}pnfc@{XfWZSOam7$#Q8#{15Moj4I7~u82`OrMpRjT9DuVvnC{(i*uN7 z7Un-tcZ>>ZL17L^gO%`vl=Z%D+$HMT-({+~0{hd^k0sO1Qkfnp=@lDC>C@3TS~9fm zhbq0fWO$s4b1kTbJ4mk8u6_@lpFoGPYzxqIFXXYrEhNW-ZcJNV!{2% z3547BaiS4yuu9iK3q%rcy^c}s^ z32BIeuZLM{x{d1Nia#J5RgB2!#1w};rQCVqV%W+;T-T!P{XC6>?WzT3WAUMc=`T$( zQIh8<$@&>`zSC0IspNFpc4}+dmMU4=_ertwvmL22y^{)#_NbLY{)|Kz^nu&U zuRpp2{9h>Vt7b4w*^e8m4y1rESIK)C%y(2QEXaZNrzyr^8(>%_U|>=S>l?Ge^3#m# z;tv?t4=vEz$K!j*I;{{5YW+RAuudaGc{$&HpCm}=Y_)-qyQ}*`RWQ?qa0at|Qp%3y z)j?f4wlc5?+!fZWZ+z%=h>eRCc2gwMU&y{mvLl|fN9o&SEw#_+No1;bx9Z!_(P1sx zIDw9@Qf!>4Puw`3kBg}?Vj&|6NZy6SdOH1nj-SCSh8dk0R4+FclW6fSom z0s92J9w%#SNz6wfrosy~;@nIa8YMPwvG$I6RzxV}1wAkd%C;E_lPg2%!mhY#GUvf9 ziGHxR!~09E3GX8obE@7tqomC-PoWH1Q=hC)vBU2DYMi8!9#L0jW*qT|y2R3mz`Vk< z1ThUuN0GK8Z)}qVD2<3*IqV6CgE8+{@1oqSENv$y&mvx!OGg1n zd1Yx&iNX5!4as3U-Ko)q#QzQPUB<;kchI1C(=eqnc&Exh<7(M18^@?+D@cW<0`CmC z*o_tV2tLj{)#nq0#?Z=BX*iimIXM>uFWgQWDmrbbusTpo8U&UT9-y#3Ba?^bR!_M+ z4kSqGn1*szXq;yf5T5oiKMUS(Tl^QSj%3p`U71n!J0e)#R?RHI^I51LK=0s6%r3Vc zI-Cx+y=S_tVsB`c>rJ>@nhrDtlaAfcljw#XJydB)SP5Ga(u$@@cy%>vFB=C6e$Pa9 zABXAGLNskbv@RPL=t8TxH;&t5L^fVrK=0=}-dUaLiq;}A{iQg?z;3IF#dcjML5=Cu+N z1(k};fO4K+=5;%1UZ;E>L)@7S8gc;nKr=?OfJ$VkqQrtW* z*L)9B^BpDPsGt@UFvuSYSJQlx=M|w{&pV>&(D|d%d^%0DA8VrI&xWQv!Qc51vpt7i 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℞FEE;i+~j;ta3&cdJ+e;5C3btpq&hFnsZ9rfvt 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⪙;6X*YUCx7w6#Ov{Dq9cvX%5X!s`lhTMf#q|gNl^CjRzHJK93I-yC=7L zhC{Pc9C(8Vl`SHGO4D>ixL)fuY@jwmAEym7TeKoRN9!#ydW);3N#2^dxpOw=uH12L z)pY5o-2F4JFWQkl9in5q(l$w^_ zdJFr`#V;h>m~lEfT5r^bWt_HXL-i)DpY60w`xtdGRH`VQMW@9vtVD)TGs>j((P{e_ zGj>YMp&2_v4H-N2TAh{7V8s#7%hid(xeR2>YV%S~;?bO>(>X~C*uM$;B!-;Cz3dZ8 z>`*v;O~Ik*h07Oc3sR@uT)Ia3{bu5p!gVtWQj!Z&wzz6q3^rOr;&@yXP)~W1y*|Q|utRwg^Uz?qfbu@cg)*np&PG{wp~v{v^K;X8L2acx@y{8+m?{Gchl9hlX-i$=OxeKhua>%;WnMpsQ=Z+&#Q zF4$l+ppBTrP>bjy4OAf3PyU3ni+a{PXdN@7$=DgK3qfi0TC}fd z(HTU2Bq(g<%GiN#LnT{V6Gxe?7Hx=LBo;=ach&TlE)W$4L{566F4%0*#T(3~;)|vO zkpa9RA>lB`9;%FzMWg+S$`g>2uo#}2lXy5MX~Qn8&J6Rh_+zY zjDig(N;v$@)E&&dkVIm))pr2DO|Pl=F%1H*TSW93g%BQ z*tk|(IDJduhNU-`?vxec6%cnmF>?k)V#zohYcd=44^IAa2XsKqBj|!pdPrEI$Q!=NSj~l*d@R*rLJO#xx__`E^!efv({xNW}PIF zWgUQ|617=pvkpLC2eMA#zoYmmH7h+kDSMta>rB=`>4$?^XP8xXl5{N0VTKf;Sjy2#Ac%!|#L zb2Ijey3DzH?F3x}E}A6qTvZF3zOOWTC}uM7)g9Mp%tTBoA!2 ztk9Er(B!HabcQSKn00`C|LBX2X>Y(P@olTuy|*Xy)TO3vMnkW|ncVs*ShmETK9JvNQY`9c4ut z#EwF2DynP7;Zl*Zk`qt#i^|w3xfBv9*{i^al7vIN(b|j+TD{4lA8&{jEvT|C%961o z8ez3mwGnY`E_ZH2IVW^Jx54IVM!%w}8dybft2IboETvYgBcL~0Pl9RMFCvjs= zB925xw(r`GeQ-}iVshuA98ErX1qui%5qgn@omip0xmxPI6mFPSxNhssr5g~OQw!Ig z*4|vPv@m6D;o9k1ByXkCwTh)XW@v;(e||Mf(U>HnjD`p)XT!Z*7loT5vNfiLcpY6c zb1c4L7tEI2$#r-{3bv1~nvfE{S;8+7onzpmQg$v~G3Fc@hofar%-Ei>*_Oz&6tJAL z$d_rlCTlt3^AUjMfe5Z?S!c6TwAs_~%?Tufh~Lhv`*kLJhLi`UXU|81cse^Jdj^ZW zXYdm;MlF&>7MWSr$0Gj8thADm`9L|PD5~pdDPch@wpfkUNUJGS#{_J`Z3po>R3D01 z8=^;mHb=*ywb3D#5=g`sz0qJ14VH5Fsg@ddFD;T3u~grWau6wiTOn}j+L!7IB2pq- zyn1q8QCARQxF|LwJw!Jmf8!1o8=Z;{p^TxZD|q$HOdOb(HY0c0K6YSdKYhGO7fH$9 z`Ta%l5xeLqN%>+rf*i8O$P)cTeWb>xFT1JvpcX6)sb(IRqYRuw`x~J9$Vz5#dmsIZEn5V9zk#WVYx-wXxy2hr9T}ck!j|CauQ^P2c>pOLAAQ zyFO#?we)?t(@s^XM@vThETa!d&j6**X2?6WiMMzb%TF|Rw zqc`E^P?K4-QYwydC*<7PVdqyGa3=_*@g1FIyp{FYtyEB!ROz7iNTf(6GXj;=2-08> z`uk!14Z$MhY0?gs&%+uk8k!cRF5j>)U8pwRYRNbq65*=#W+Ok^q12$U21_WhA*m3Z z5eG~rtpjUT2dxgN7A0HkC|At{Z+#4Uj7VnD(ZXfIU?*Y%T{hG$#K1BfsaIgJQt-go zj6T}zs_n~yi8+dnz{#cJqX%J?Iv4nYWoNc5i=Eq56ARBka6m}I-4o|xy~L6yle_^n z7Ihd~VmTO6yGV=}ggW7zNQ7LqeWWoZo8O>~>7;C|69tcECX(~8U!rZPR>n?O%^SlF zqS*p%>TGqCYshNGA|P|g*V!-=s}ZF=89Qt>!gmv?P7*i1FRGV_Ugt!X@*umBdzN|I zQ}U7*NI+jTEF8jxK4!sz6*pI|C?0r{TI0q6j7>=?PQijT?BK#x2ed2> z7Ops2IAcZOS`2LMIl?-z3yKD;!rzF+wbyAeI3=3Tug;uR?Cl{F4CLeISBDt%=TApu zu7sQ=Pndv?XwgMsiI2`%J3cgyzBE(XWX4s1)8J6@iE!ok# zC@t$S5*&8yOzb1ILC=$g-m~~NF+0^&o3&T!mX;VuJI#V`_B3|PG_bHE6C^YCbwc)h z#AI}HkvpX!canZM&ax*dYmyQznSdHcH%b@9qOJ)8V;0;zLea5hV`v6#oY^RMWkb>F z4MlQ<|GSd=+wvo0sDbr^p|D^!5sp11&f)c;8HQ78M=X*w~rn>=-Gy+KwrTwCou7H!}7{V^~~k z(g&Myr-a&K%8R3MMBu7`sb7(CEb(|KsHh*55& zIxLT2^8z7yaxhAI9tm)0BdO{|hDaN&T1=#bp|M4&vqtesx?dL=O99Jf*ls9>yGKth;X?yQbq^QCsBRrPyyDi`wIlv}h2&FwfUCb> z-{IXuF%e=gjYfyTQtv5=&((GjijVyN6Ft(l|KD^)arBXv`G2qbe;xgQ2&z(0?KqU( zbWG?X;Z};Z7%tS0jM8Dgj}5{Hvte3v0$2})^)p>H?lh!MxyjYEy_B(FWQOMXke}pk zS%nF|>q}TSGIzh!E$mE2bkAi*QVK&xWPz!^qJvn3!4$_Arb(QiNq%ue` zLSxJm3?bSGX(qn|^$C#$+lI?&tUNd)U9_b?dQ+S>=G=y&yRg)ijI@ojTQx&`S^9=? z81$y~sAci`5SIY->|BQFbQX+~qhHN>NyvgqWk^ygG+r-dM%3Bsgl;^0{z)V!H}jAv$E*IF*Acjvdh@X%%pCe z8LI`*i_6%Bf$Sm*bks1Kjh-6o_OU6xl3iQmdIO8{CacsVh%&Ut?4mg;3V9tyj-(=? zi^o>wl(^PpjaW%he8m0Y?Tf{qsD zSD2c?a8R(pmUM;c!gbm(T|6$VZC#EFby&1muM>u8a4cSM)im~$?uQr;)psX3PeRi~ z>U;eEFWlQ8QzK=~PE2oMI;&AmNieV@kGz?KMI^Tvdc%OF(X7Ml{djFFuc#R zk9p~JPiF^n|=&asC4YrQ}eFx zJeWIY2d&7<+i(I)wsO;#=ANFGyFDd0`9N;^;@sJD=}T$-*CrPBPo27&zO;0`a33hM zVtH$~Qumm8OZz^N zH$>I)=55VixSXu0khy2pUE7>+ZPR*GEqCeq+?1tP)0SWalhsJ7*Y#A~`u1Ksx*%`u zdX%k7m12edT{AKRlM?3ml09_X;HVph(LMY?oq3FZ;s%Ae3;DKHaeZ*R#I44N7?_bB z3FQ}A$DH4&$1I3E$6UIk(k-?O$8yGSJ6l_W;ED{ve14_ggb`E_>q2o$!VPT0-+yo=3T0e|HV&XTn=)Nqeh0RV=^`!yUP^>Zv z$HGfCM$3M3s7N*rxXp&b)1$G%)1c2-&n9T1OB$C{ivta5IFwOe2W=$ABTzn!0vjUP zP9$5M!KkcZ7#og=mQK`{jr!nsR!_Db!o=1M#Yrgep?XV9{mljkl!_R+AwVgW%z8B#8}Q%OL|Z*;uZK6S-=> zD^7*0cwPG1wQN+Kep>iWx%Uiw)lQnEd8d%5hxja-x!{=Bq zupcAn6;%e4fs68Y?afIzn|}stoX@fWcdQvr+9|C#!0r4-cXN&Y=v2Fn?z|7;VNQ#mF*U=`;R~j!C2hl@C z=0&5WQMf@#OE%0liDDjuMOT(wvxRv`g2p36RpboLT4+WeWo8lGW&#VQR7`|D8ehu| zMwl0nqCphaVPA6t1`=Hv^0km7-~CWS3kKEfum*$QUXmpPn04Ihug zo}E%&!%|7pu}&0>QFL^H%HqK^5gtD%qC@RUIgYIdR;KURCX~{oEqjbXsut#Vu#ASS zoMw~w(ke#GDX|K$d8Kp=m#48+lkB+%RwyjG#vD}|D;$2uS8SQKv>-C;w5ujZGg4=v zX&fw?pC52?1)<$F;i^w>QOu~c} zD_E?p!#sZ!7TsYY$zo*d$l|5RC9K%NPi%&YO;xcKl~}5S%#IDb%LC=e^2=x`EZ4+* z78|`USr{!A{+JAyyu!?rH-2Rc+F8(`MV3)k`L!J_p?Sx3u@^Qst4}&?C~9pmAGnJ_R*O_ za3^FFMiPr{v7L1Ll#aqd9;F}DVYjJA7u(_1IC~B%S8Cd*UC|RfY;dD!or|<$IdN~{ z2HZ)CrhQ-VkG96j0a_c+N{E~is}Wx6`&Nk2YS3a978e4GRoI#rRx)~e$2n`Ww3rMJ z?T{>s7NRicXF7uO7d^()L~2BXHd^*HY2hXod!d%iypa^3bBJdgBBQW^iS;#+JLp;8 z(N*&tU0f{jxSBRMZ~lU7TTZe|*qE+q-pa)M-6^>#XN!MnBdx$NOIP@OvizWpNgrQ3C!qA*Msij|x(czUL26b!3em~*hl zl(4u19zO&<2_$G(4vMquQi><{xzqVlK61ISS`!wbRHy5tKhvH{g3g;Bv!C&r;Vn>=W1Iku7 zV&!>AJnCR&J|aDn^865X2h+tE&@;dtNH6&aF5*B;0kSKOIL%@_TV}|DHe0-16l|pl zauyjegoWo#Y_|~hFv>B&HeK$jdD@TpMFhMc+KfiV@R)5qE1Ix43TXX@``{5bTDDUZ z4A{4<>bCETB7ppTQ+aK()K|2!uSt^@sQv|7f5SS1(gS!d>{lInOwCIy(8L{+ea({F zVlgx=vB=j+`niPE8{3MHwG~AV;V}+ZP21A?-X}5Raz3&KmR0Cwk~BM_to5s!rbSCs zrJ6}hC8S)md4c9eIj#qwl0%>D+hKA=SxDz3_cqoD!#a`n(ovF7^N>e)|XhI z$%Z%vdTVnRrCytzoVR8VYpza3=KsguyG2QLoq3*p+z&HTvudq*nANMg++7vLxJt+t zQMP5v7g4s+#U)v`jD;mtNkvsfW(E-CC8&%HaAvt@xJpPMfn;64AOSKGpc_aaDM1L$ zIHBjEXZ4^pv!=0@B07# zU$-9Mcvl5oXWjJ(p8aYh9m9cE!hJ3P+e1YEBZbW?7SDGXGjev%NJ)7-_~#aGUuFSp z8%uEj;o5P?Z5rgfn?OX%3Dn6B%he0ob|`2c1hL6U0PfZ72l*nj!oJ2pwL<*P?z3f( zEv?C@jvUUJ#8St4U6R(TN_%)(yw5liuPH~H%Uv~TWo1G|1;!8o>4nJRH3PNqr;~xI z`^Xhql4HR;)V`76f3&>(rQV`4>jCeSx5b?bbX6|(>Ahj@F6ls*gboD{s84w`jCb|e z4oY}7&+gycb6@=+?5j$HH!(K8qJgc@lV1^pdGb+Fyvv+A238~%H~;SH`$A=rqaw0U-E>B?YZc*t-^ z#QU+LOvevnMq*F~xquM;zFCKH!~bY}X|V3TQvLGp{!WGe3qXsWM^qNw-&|_;!Hsc( z$Slp^jrqB;e*QnUzrMOSs`+~dzEeqm1TFEM%A;Z@xUW9Gyz;1ndt1x1+ZHD$4)MrY z=}%Yf;VdU#;6#UcFVDV_hM(tJDVwho4fee}`_^KlaH?J7g4`aCVBwobJ+Ck70nUrS z?Z)!#>x)f=FS7fzkEKT|5Ib<5qqOTI%d_t;mf|j`YQJcg2Io;NDIYE@&^1N#%+a?# z?ODI~z3)X{2(HXuX?lN~SMuAO^R>mv=k(W@|LLkWyhjr2+@WKVmuG*@%oKHO(5%dl z>DuU{wmI1{=->eeD<}2|MiR)lzC2sJ7<&X~)zxX3-;#=Dh&v116m}{xy7x4{jm7gR z)`B8s;DVAR%2WF7QB3N@ZovigE5`IO!e53L{$$(o?0dXQD^(5plM(%kq(Z|)Es2~L z3=~nl_(;pMKV1qmSTzG=bjhz(R@H~rScwxwsd#C8Y5W*UKwyXCY<_X(iC;`Vb!_H| z^)q{)ARS5Jle1r76<>kXv&5!vx!YWY+ew5l{6MmTrbXpc2j;5612yM=JUdKU_&`AuL>RkKDcY&vvd!&4ne zhBE5~SqP#%n=SvKEXZYh6Bjm6N3hFs8dMWJ%WIq7`hf)mUc0bi$Au01RZzfLysD*M z0#%_%;Odi*ihl@n<8xU>S*@@I)#V>BxwjdiS; z#4)yU;JW}!V=-WbU{9##kyAIZbw6Toi^?X(3+?1;_U#|l*Y=Z6wD6~qUl7p?{1>%x z)k%#R>b?RvnQ-Ya0ow7}gaW6|gs^6)Hr~SHBP2^0$#!pJgfP^wgEizkcYoQ}s^Y_N6_OS6ir|C*6?QnOORxOGV?vZ z9{lxw0qMsqQD2e~4?I$DfcQrstb~h3p*s^3g$YAA$k*=i^+a2N2xHc9svHhgXy>Ot zQV9@P`FJnElMaF;z8O{e+iUTVA3`Du8WSv({}q-dm0U|a0%%nPh5J)9&_vA2sUysb zxOmLk1Nw%7q^>Rr$>;8Qh4gNdm@&4<0;|Hb%%jh@NWp zx6@k=vrZ8DMZqz%Y0LEfckr-TA^zbUO%|aC~R{(TH{anu2R;lVBDLfQ4z<52F%?cR3q>Z|yaHn(bJkcqNjP%03#1K(Y5+1#Hc2tsNL_LTmOMe~bZ)&rZJ_|HF z9JB?r=AR=^hN8$JFFCYQ5mnU?;hw8P2+0wJ71L+GlaFx`RXTp<)cX_}jUe7ERR5(8 zb3;}}kWY|8j1H1_g_g?1S2e35GAcic-_GnmJ$-sd(fa5#H+mgkv_M?ZwD3lS!HC-|z+8l@$Ke<@} zR@3e$VUqNlSs4WbqLo07C z_~!WZM^MsX24G#};Dt}K9AfR^J#*LrR}XEyw&6{7@$4^8L~ez>r>!UvgW{Q;R2+5~ z3g4gKP*~^BLXBaC(AvcKV68$CJ;XQ8w-6r?nkT&q5-4WWWBU%7p};n^H$yr-?$+Xa zn6UToz^5AuSO7hYgLjn|j$2XjxBTUNV@Xlfn=O#*dusJasSdNPfW(p|;x3a3uw-ei zrA%iqA`KKPkh@GnEQ7eW{3#Sb=M!Oa1XnnNsknH0|CRO61`4~KPhC26%r(B-1DB7! zI;XC`jne2V>o?@59)5={>juE(Bk%J4G~?kHn3eBlfb{zVWZ3EyI7^vN)Ym4KJMiH! z-+7)*=)fo=`}tVV`zZJ^(S+fk1$sPkFAq-b?W+U95>Q={bE)@e>9>RxCQeQ!vbSa@ zwvI&}IPg&G6K!yBsBQ|=nP3buGOQ!bVM%6Y-<6=;Lp0~GDNt$&yLNM~;g#VvMk*`_ zcJf2ZYK>L{#zq_l3>p#_12?tNKH-%}_fX^)%JOKjP|I)x=j{^O*Vm z%~!X*sca%(p=-~dxVr7+Z>iINvXtPg21x<35$hQfAztLm>qvB3 zPE>%8g74uRDu82pku#is4;S@5{K@w;L z3x!uf>`@a7%d>x%-RsPBMI2Sms2Sh@1PlW^QnhmL3M6Fw6KoiHJWue}2N1s4`H@En zpfS1`vJpr-h}1a_Eg>BZZY{<<8-n_2g53eccb^7>uInt-Ilf@zcY7d&P!R?g>ct_Af7< zd_sd-e3aADSj8i|$Mr$I3WU?c=ze~7vUJPN6lJ&kQi7y~`+fIWf;4{1ewglh@8K|< z*O1J-{+!?Gr87s;orXbQdVKnWcS9sGPD0_V*V2ur(Lqmzd$%%`c;nCP0(l`@@7d4Y zA6U)A2$-YgTEE`Ec0BN&!g58N&SJX8Z3>xjWodJ;Jpk5wHOodnLx(e7Id^9205u>- z0tKoHIW&aG1W~YF48mc7Ak`KccrBeUcfq9JalBvx9Xmmf7nX1vVWAPCtj~ED!v6^x z7AjzZec=NQau)}N!nLv|KNohFxONH{LFzPCS>T#L6J}^&-NBCiiC1J)D-Vm7XV79- z;k*2}z}+S89)o>Y;5!~g0NfeAfQw)rv-xxl+ZY`j83Q6y)Yie@*X;q%VGr7cb>@8$ zldPTE@`Jl>2p%GCLzF`KRd7J9Kt|h8@p!+TYW8@Tj1n3$(2XkSo)eG7x6lvD8)Bbj z6cz}EL@h>yl2k^(;!T|bC}f1Rx9C?5CBKfL%ES31>U(Aw`#s5*6r;20u?u0pN1{hF z0Rt}EkK`^s^%iu26>ZW}nD@PFWvbcsxGW;1(dfGmx;ESPjVlu01?Vg8Sw>PvucR8&$}0bUj3Y6F+5Ho`0BvST&704O}uP{c>m zn(;I2(($VCnw*F>%yp3Bs$5vLmDTLuea^*o_^$#fmd~7*v;>+^@xT+M1|KH!tdJWk3}&RxIdN8~hY2UEQfCMJqQ(K;^V&qn zj+}_KG=BMO&z+{G$Byn8JUbL*iWHY8#8oXrl{uy6{g8|%iY;Z+5>a8b@&oaeHY(>% z*9O?aksBJIH7a02`4xRgC)bg*r0bk~n&V@(E$U7?^Vl28G4>EcE~#8u5U zDy{cX%#99lx=IWk(NO4r3!?^A#5V|<+Nd$NmSiwt1%|MlptVq7(_AAcVfv?NEyI$rIw{77)-N zz#RLLvYkpSbaHURHwgjS^F%I0W`^ehy4%6r#j`)z*3CjG@^5jWh3sng(36}a?lc3C z18Q{axU#O`94+$dB(?KUwS~#e@9+9fGcbDj{(Ik^DtNrs3AS@i2zYfX)ls(j{D(oh z=_t)-N1anOTmQK`oW)kfxkgX!T$)8@a>IYb+8D^)?jdHQ2$dfm;gmzekR+bl*J9uL z3MkhBDaAfsqZ$Z_UnLyozLNV*I_4{>0fVzHQ;lIEUD}%vdqx^Y z5ZAe*p)e`?%2I3r;3Nv$s#FOw6$7v$4g-fflQd9h#X#ETu3}4tA$EAWn&4O*onx*& zp2iRg8mh|*_<*}o9~DK5l}(qTCZ&p7?+{a!VafPVO>Id!20!z7pFSlv|+02}~MIl_qwzYW6jz z+n-rJj^2xEC&6V&nmV2h9@-XQnr85htz<8MY$h9e#&{ zeLQ|8c;PtB%e(hodgXN1^e6x?y3Bg(Jdky9g_0W@QjJ!nrM3Yi{QBCw>1JQ6w#rJi zh!B9s42h<=quYu|$>^_$2ZA#-NfT_DmC?<`Z*<6Ikq`+QX6k20##T)ogce1f?IR6# z=_nSGN@wMug=)W$a2f%wBvz7CxzXY!&@Y7x;kzZFyNE?LQOJd19)By=VBV;y~vxwYc;pZ{2g1v?j_mt zjE>^i;z@lK3SiDpW)CkRKSs$i06felCS?`1mMdW5 zst)?VI%3X#Ka>Z6t>Nup% z1IR04KiQ+nSaPAZa&+nyAcMeRLenCoTA|w%E1RY%LTE?997B_G z!W(18>1I{5rn+u&Ga61!rxa*18OmV*Z>rhYXK6VVKy*~`_y0E(Ew0qE{7rbJDW`n z_h?Rq(`PNH@VJJ}J2NTMs|nuVvXFZVd9cWmqqzUNRRU25Te0P)q#+i~iwXHQG_V4< z-ph&vUP`I;pjvy_<9D(dX-ow?Sb4Bgdn!ypr%OZpbY#}t{Pe|JBvzB4`iT!Lrp>p3 z9;?jlC{Q2EfD@%lWR(hggQ8PiOilYP; zs%o}3>#!t|!#!N)(739LAF5ZyehiA!YZOa057p1hGc`vjd?J~p79(~?d?y7P1)e8! z%sabU#Rz(jz;_R-sG@J5aMq7yp#oYRn()V)D_O9i*qOwyg_4Qk7JFYwU8?mJ8?F$B zW{Kue-(v6?%D8CshB)tdyj0GqRL#~D7QdW|#7YG6PYd4`y7xk55h;cm_5m)F#aum% zYQ}LMT^(TIdpxx;V&FM?x!f{K_A7{>I{02JKF4I{h+RnI4FG@~&Aaj+nkGL=ab&*nJ?k3Q7v=c0;yg2(JVY zLTfrg9yO#(+}uRLaYDi*Q+pN~{Hz$NtyCu;g)c_cYBcru0kBKyya++l5McVkcGcHL z0ug@;G(y#EWO~bn%WqG*O1kpO=II^JOiyk~Q4REmGljwvkp_+&M1GR^IzQeu{q(+c zk~a(@2y$gFZK7xdeURwM^v5qsYYpmphu^VNU%Ik?=k%7Xmv*0~&vQ~=uCgGO=zYDH zFx9VY+|2b{+dF^e<+ou z3SjY5q*_4Gf{`9nk^mUR+VOK|$gZoqv_^mekV-sC@RAZF7-~gX92>R=7PhF5tj%Mx zms@H2-^uOl%d5xyUq#_#}4C`1mBA%Z4{(2z^iAaW}VGz=Ax)dZqa z;#7v>A@Npr+^%$tZc0QOoeEP*DNG-?GYur6gWRtMv2Ua_Of24SE@hqc<;XqPmg);y#_M zbgF9kSe^YQ(cjv`JBSmZfI}fe$1_7EVvJhdC+i%lCQ9Aq7;*Z{k?Ad)Ja&~*@1czo zNq2EeLN$JL`r|DEPl+q?NxOFBV>*g#8CVuV3t=3~aD&h3@ z!o(C<%TLn!sXG^b_4s?Udv=P*9FE6A`=@KqZNK{RuHSqx={)C~XMg!zPZp@X*(3Fd zbp+p$NhQ^e-ge!tm_7et)6+y|owG33S0k42m{|*)$f1_IT{k|=-;5KdnTThx*THZUcTi!JfT%q#wK$oXqWB)0NQ9k4n$79@!2-^E%gW(K~sqmM| zSBt5RNXW&HrBQVX?X5Wbbl2@_q{;IibgsZ^_E<&4=W!G1|l%IGCuXN^D z>u2`8I5vzD)1jKC^j8hgl(wzIf*KSMmeHcme3iNSr$J^wx`~wz_Q)>;xN3 zXRlZ)wa=DYHFaRMG9!3yv`5Hmj}NhV62C1v!ys9|mK+@(5w+#xPA;SE|XNzpbQXO~vXb{M&j%%C?RE zRva3FyaEO?h;(;@t=(YlPI&!B+x5O0`%eBTucaT=9bXScQMOn4Chok5;LCHXdV8k4 z!!ER%o)kI!i-*W(sBO2dKxte*#Wlh%rU6|KCi4bOhAq<^k!b}>f*2H{Qf77H;HD+< z&_k?8&~bu*DRc!Pas`rBPNBV^k{rIqS^zq*5~7wX>NpQ0qCLaR5QnDTfAeSXI9WEz zhls(rtdcgo9aR$P4z0&7nAf%o8^C@&W}5EVORt=|{5nJB8ZrBecn%D*tE1Pr=l(sM}F?GDZE=>{+tY)?NKD3Z9%_t)qZA=7$ z-NFkGQrcdGxGPtP+S=9~IT0|oU8^Z#hN{`F?EF4NsJa`IM{s&ed^E^zk+|d;4E$o5 z4dFbLuQ)DI%qO@GC638*%q@I5A{V|K>3#2=HnAkF1??}%|6`P%Ej7N7K;w!9%9f`9 zsGogkBDg3$iC{OVoa8?yeuo-s{9oCv606Exk5E3XbmoF(%^`v=*l)(%t^85g0a2D# zvoCv(H~qI-C{;M z)#k@)`wC}v2$pJgQ+X;y{LxD+01fHb&2cMZ&4M7s*!6V52cG-H>Wy^eOy2FicBMlj zLlc|X$DV^3oL--iApGSmk)->(_jw$r5{RwGdFd1D8fUjayWi2yxQD5R^7!%tMj0)q zaj5MZO<;^Pn?(yrmRU9X(fMCm>8#l5plf#fC|1Ie?t?^jo;{-<3wx%T-QwGzU@FMi z2<2^D{rw3Q+&Y&rZv<=H*KW}51@1@{kL1n0!+~cWbLT%f{GNNun|t3jPjhdUtyeXu zU$D90L1XndvLD|q(u&wsd%oV@m3vE0b_@ZBz_KPDZC}m4>kX=rdpXLUKVrZ)280#h zvNy!SO?SgS0NxaDMwY`U4zHAE*!spg;h|WWY$|FkyRK}KaQ%j*$#S>Ryg9Cl($ogX zPcr}kT!1}1wheED6j+F|mQ)=Hvk0peq$%(1ZLv^exGgRJe1A9+7Z~r6a&PZ%`mHC( zEKe<6B)CHLCkNpRuQRnseJ1#I(=<<9GG$a5BzMvP=Kc$iAfptn4#} z^$HEWJ#sjNV{To%-_AVR?r5ZjQ@1*K82C8c zM+Hb#EFVj^B7OIZj(dG6Nte=HRu)1{H}i|fXVxF;ywmP`eEm68ZoJ25xWy|kz07Ey zLlas{xAzh$y^b4my{x-BoyCM2Q$-Z2IYiV9yu%(4TZ19)*oy-f<4ZKS#fYVX{YtG3 zgUI5=GhUE`q|@b4SE&1+BgzQMn_mi}S+!W99?TJ8=gwdm97(nSU84SN){|>Du37VH zFc=f*E-XM{nOa~m;k{T{L@W(FMr~Fl^jS9&g3$_XvFeQ;@ke^JDD3E51*3XkHixI` ztaeIaOPUf3;4pX#ElKD% zTq?>cDID!qwVlz^q^x1$8NQ`5bwq6fts+j(V_35&RtkVv!OL6;Vxj6Om_$4<7&Jtp zWX<6P4T+UYT{n-17xRcZj>Ih8otZr7j;)x=OR3^%OrBDe;od2|@=B?22Y`61*`XjF z-5GS+3eO z3~FSO`vSZr=_ymVpfeurL)F zC99>F=8Zw%?0<`y*e)(=p$h>M4#`utkZjINEn}wSbyETtlCl%EVY)jJ9YaPXW^2N| zu{uaL5Muk>9{709od%lAP(1^(M4@`8f%7sVH?An{t*Py$>W9Y0@wgSm|a>}|j6%J^ZsY7~qjyd~ZK6l=U^nVM6?uCLc;_<&jydn0e zv5@fjGdCB5vZbOPD=|5)m_*S%DwOEFYgkCdfH`JPx^M+7=B#e9&@fKh`BQmcoK2mp z-@+q6I2A@N-mPLN7IjvmpwL{W4DeLD8yXCl|7W3W(JZE?`D9x)`yg{ec0S5+S+KC0 zVH%v>M@RTd)0@&H8r2dLdF4LQt-_e1kaKQmMy;1>XDFYkjN{>^gt&Um3p?6JA`t0r z7*MG}Ih!nSi>1Wqw+L1q_7aL9xLG~JwF0e5{JLW;=431J03tZ6X%bgi1bpt>f3>37 zyfN^NsUW|0V^z3$cw;IA3&6vorszN7s#q8V*S!Njm$U!V=F(sh-DwOH1y=W)KJ7@{ z@+${UF3&#wz(Cvn#ZMctz|-!*!h7%fxx6~^S{6G@b;}mNEzq;y{AnY*St6qF>z{!C z5J!IMTt!;-Z3b3 zUISBJ9^AYR>o@y@Ugl!51gXtb;8!u3xRfY=BKjCj+G^#FaXfjW_rM8>wV9xulrs(s zJf13KLE!3CJo2Zat9|@biutIr+aI}KI9D^#<7O*-&33x$Q6;NO>!) z_6j_>z%n#Eb#Q85W2FVsyf%|7ksW@8-k!k#tYw=kQ^x02STgnQSP%q z)e~-jWdcWNTt0GC+xU`?wCJL34iTdLX-2|77ik;$gWiNKY6I553QwMj7iCz@o zk@W@6Vf88S^%z1xn>Jn8_>STECdq7;qfEMzDmY_P!*U#FWguipv64dfuB#h?!ks8k zz<9@EagaMN@$7pvKHOiZ@^l$yRi4%pF{gFOmV1II#xSV4323(<-axnpG7{c+VkQ;P z&0ue_YLjij5H&wJ$wnyRZAU21z%mUhH5R%Pso?FQU3qnuinqSO#6Y}SGY^Ff!$hk^ zs5MxKix4C?V$%VdC%%z&5FUe5_}JY2Gr08bl#A?R4$#>#;OqN@bLir;fUrYx1tJzw z=!FiB>SbFf*n|y(ODYO*g6!`O&-4md;nF>K_Rj-wXi!$gvl}aeJJvyRJGhJ}u43-Y zOR*Jh@b>dUP1@7?AhE2IMr1`M^AUOH|2BhP!TT?O1&~fa4Fvh#ax6MfAK3Q|RYh*} zx8q2hw;!+aS&1XjX$Oce(KDJ#8L!>?49tk9GFK#*KHLrI6PfK$W_5Vm^r;=n0L4Ui zM+p~4dP2)XvXy!7*r^BSB1sGkH{lslQCG(mTnPr|5`L4B@vk%2T9@8?O(cwG9^-p- zoh!YRdGEM$KTJ0tSr4!0=DT?lxd9)!eE%0Gdk`l2B)P`r2IEsC!o;UP*Qs8kLIrw{ zQgo`sBLpR#=1^PQsS>4Fy)G?M6n^B#q%t+vyoJ2jXcO$8ReI+^u#)ptu_sbW=8d7KX(CGmD0aGH?<#()-97OWPUb0(~6{ql=|U z*a_Vni8^xXEj1=-Svrnj_jT|i&Nm}=nd0+$1w`V(BdAa!WmFOi(#k z3lx83tEZk{t&EaE+H|MB%@==zdsM+e9ww$*NXzN{PZB3ek;yHUTMKZ``@#N z5^1{(GW6C+zvV7M(vBFi76creq0C%%VXUG^m7e@q8-g3skHJDs244pUA`5^1Cl854 zUSD8ZEI&0$GhNj2Jk`pBhT$PGT3{Q)ybS(PHT!j;}L`6e)>QzOq|afYl4CfyLXE;_~%Q{!hKIQ%~{?@go>WkHE}6iyHgzAw14 zu26;D-`g!vW0jZ z?|QWg-b#VZknb%?+R0}q-zE~-$Rm>9Lc2KitUvW1i`j7grS%za4==7{%gs|+Z1Zzn ztcCwqW~_xEyK){vf;7Rw(n1702%5a;U|kP!;e1c-kVV#XXdkW8mU+nwOAD?iUEy$J z9K;Rk^SZeT|73}3pJmy^63FBos+a~NVHNGJs@WfTfwDVaJqwhxFL+I{yEt>z6lb>< zYJokx2KMn&>VUJabe88XQN8U-;z{W9o|U=TpAiqDIu=h`poSFdVvdV!5eNW}2N_^K zuawOe>vXGQ_1IL6i*alWl*#v=yNEUWvY)MZMKKU1V5hwAU>fC` zT}9XtYcc4&icKP8>SwPc%x;~levggJo*r$0He_R~iUi9N|42cTKVH%uDsdxTthlTt zVF|0*7f7$n?A%MoWnAPG(he?t3`1C+hNGsBZA+ehC(?f5+(`RDrn0#T;sL;-Q*UL} zyLGQWlsIBFj#9zqmE^59OUfz>Eo{t+cj)|=bg21Z$(_$Ak&NY7U`Mn47894k~{_LZ4~nx(*pSBACCfqAd~=3PkZo+#ni z3T9&$(EW@4pmPA-Rdw5%Xw%=IL9p;ouM66~rrv_r0nebC-F^NuV%Z~Y24TN57KKDl zQ=+j1jAN}I8Uu^{70GeoUPCUqmZ@fc5E1GL;_FL}c8;UN?48d$K+&PztSVoGmybTB z7}Fp5j|pJyzq9v_zOAgINnIT zvW%71S6@lFAgznlTeMol@&Xz|=#C%^SY>@vr zX}i4XBjL`og}%yWUpUc&Sf+rItY!-XKa3v5QHUf!>~7SsOKYnEWw=(?Eyej@B6O6` zM_f^HI@Hnk`xdu;2gwJQAH8^O#e6913_C5=OOq$uVi`gr%tD(@dd*y6ZQXMA7&4)V z4#N+|ROag7z=Q!yq$n)ts$;ga;Bq9E{;DiO1ok!2mWxPYg+xi~#_`Z7yGpn*KUACl z2VW1rNB?)}Slc`;Yg{h~3viVG`q3op_&P#r{+TOSmvH(%AZY&Z(JryZuLao5KYz3+ z&-m@fYjmOd$nxx8KI(cAlRU^Ye$H_*Ur=`|?QLXN)Qbo#j^TS3X58-QAB}R#g+;^0 zki=>%&*po|B$zlMVqE^NenKlWsVsK%8YA|dpm^BKOYXKXk=8igEGTfmr_J+4p zhuwL?pV^(iIR*uBY-M8g_1o85Eb!%>vzsZaCn^}4X3rT2%$5{FXRV3;i8?K@&uwh3 zJG;f^he%qSQ}|lcC{t}V2NX_oPX-wN;_mPguOxQX4X68t;Uoa{;hk8bI_vKlsWGKZ zw`z3rJ8CO|b}j{P_=Ci=2!Ac?LcKdcb%k!;H8KcsI31eA0D-;FFk?KS2%{RT(?C%Axv+ML~at3J^EMi0C7Ck?> zWMpNn4=My}T=pqBz#7(cdMvGimbXI7^MFuvEJ4vW)*=b4?88@#69|N7?~$H^I(sNp z)Xn#F3cM(j2G=lkU~^qbOd;QgBaL)r={9WP=67LPvs4S$**)x*d8e5h8C@&tT^=)5 z(-ogsm#Sv%@2ja}zRazXJ472}+A5`w#zZIT)o#ii>CAbj!uXc$u(XYA{A#u{vxlto zXhOAqW5JCnacuTD7^-<=^_u@a%EfAPv2pqxm3u}d6l7%{&dvGeKqX(LA<3?UZdV0R z()w(vN>|d>Qro4l3PM#^o(o~?q|^f(o3)sz}zRPG$QeUi;g4pV9hs@DcsY(&^`Gcs8lXT!gchHsy zZmh}k$Fb-@CVlc4pC{ve13g(W^m4<7)jp=(gy^k=>S$)Hx26p=3Ij?ylW|N~60(8Na%RU)fU9VXnXMmO{&)`@ znU~M}VtUJ~Gh1J{bl~mFZy!`7K?f=vxMSzVGkY98b9w!i%cm#9flf-qfw$jZ_o%lu z{-6=(#9E-w7@_JBx|W>vP-_rVbZu*_y#{v1K1`S9*jnOO3jf`8pW#ag0!jze+ADYf z!hj;IGLo1(>LcwjNX9ry2LPf_knj!=mQx4EFajwBihemngesQaf0Kv8sUZ~2vFy*a6w+I)r=@Q33gcM$acLGSD{6KW zxNabrMtaO+s;$5+_Y+2UB1P^~2C=;bdkJ_}lGQ^x#lffdUDyO&A>@ef^S?~%^pksx zcyJ%c%Sie}lGYIQFKv3l{;W8zJnPV#-%e}4HT*Mj;pU$@j-JP`cEaMgJe+}l$T;y zH^+sHfKX`XE=>ddU z8*a9t5yP=_pGcjatbGq%J9%~AW^eJ@XeWUbQ)8g$4_34LAf3~;dHfXEI(Pdne)uZj z@R{e2U3q**htC%W0#Ius@oyYTn{9~(V{6%9?i9KYa@qR$DB}72B%{V*dfd+g$vJEe ztbs}Pt$`X1dg;?snL0JvTw6c4HMtUex0X=p)JNKq?Rmz$7ds9nK2X>4(ct2<_R-pb zOWG~%N4!GIT8(_WvcP9*!7Y^q_JsNnA8`TgCVoV%v4~iWQ=(r)Yy%93CelH~_G3HP z7Lm_^+B`RP=ly^?VFu8t?mVg=7pbcjXlNLCeM?Ur`St#J23cHiBZZ4`_Yv{L_Viaj z-@Cty7iF9Ejkp(8l@Z)^iUjt*gEy(y<#RH}OaF`6_xG|-4ayPvM_SQ2&g0eh*^=fw z3Q{ur!ZWIBj~h0iNEXhqG;fB)E%z!{ixEUy6vK?_=j38~3XF{{Si`#Uu(kPPo=N+@ zJWbM%@X0Dg7T%%WpufabyhQL$Ex5bpeS`n1!{>|w!Xi0%l~@2zfAR#rrPBXq4rs>% zLRN{fJsI>c^>1(Q;(m0XAtLeKr@qE(aLaR5cPqu=o4y7 zdGV0QCXL+~ooB$KnMa=$2Fjz)`U`#BBs48cs>cugE!5=dIe(}ux})6~8mKH`}XZmbGY#vMk@fBLfGHf0z3u$_1`s1I=j#bT(K zW`NQf+o63KOey^a0x10D(f?9;)eDbb{P2BTw&{Ho2fyhQgL3k|6i=~;zMn!-lLz<< z2S1~OzwyY_0ooi6sJh5`_&oAXHBw$UbfB^}C+G9gXR- zza1Ns>$ee{RE4B-`JZ}@n8~H*_RVbFnG)^J`tM)DOhO|%ZKYeMw;r5%;R8QU1QM|O ze|YNBM{j$&-A{_&Y$e&IlkN-zn@-hl_d7UdG!lJNABks>_o*6F!}+E^Mf@M@26^%y z-Yvi`5l|vWBI_r{hzqy6&PZb4S91OCQ6f` zr?d3bTb7Gj(@<-8_5!y$&eXClB3U}|P(txKpo^bhZ9s{k5SkPUlhhA8%bry<`yc|Q zULWIi^b=eGQ0I*M8jZg_1)CSWt7m$w$7ec3vClxDj07*Osp)Y4XuUSJhHq7|UgBJ= zW<%Y{_zRnUVcgkI6lnA<5=vX)jfXC5q|5MDt4a@tsdsSb;8J4GpLypLi)J47{HrIo zU;V{i(8NXd{O4%svUhg>OV^&9RID@}b7J;+0;krWrAVM3>w2=g0;mqWdd{9d7$$!; zN&S$uuZ$7@R$~SK4Iyy$ai91>2oY$_>aRpZd1PMvjVPZ<*iONHqR|A?+JspOuQ_~4 zd`92^&+f0!&cB?%#sc5%AW5?E7A5novYSkbnw@y;RpP>etPa*gVsMxN`P9qIgDhu= z%A6wRQf9zUhapiqx$o~;sufQyqMluSiURdLWN+Ib66z1AQEwtM?GXS=sj z0&qFVkvp}5*d;Yj3+XAXL$(AYT*Mx@4OuI`2*R6!U96oQl1s!7)pxlN!-nI~|2#cfxHlo-%u7wU2V=UR>ySLv+8}Qb}xf-wJ_x>n6VF%ooKL66wBW0d+*05dDdy8J797j;Jkl0t37S ztfHvwij{?*yVghHH^{Q?&cF zZwi*t3hT~`)q&N6N-#2k%2L>xCX8o$beNt-NGsC5DOSV>Eu;Jzar2?_QN(L4lj@}$< z6`3L%rrg44RRaG@97$RYwUN1PTKZ|M!}23#{Mbc|Flgn}5vt}#8-g|Ri;d2rDRcqs zZC@=5i;cPgf08wgsgrSuf-%bW>@9b`Xl=~~QyVpa$jF~oj@&x~Du*=OSEGdRDwviOsODASG zZ3rNqoJlBK8x1nUvWghJkEuGlyT87=vW~UfFITK(`4#%%shJV0xqm_~ndsxDjx&kF zHCb*}sEn1iZhVk-G!xqIu`}M7WUg}GLF}TE?<%glVXX_}{8>|j5(v({3jMr=Xkh=R z)dgS%S{rw_;uF-Z5CT#3cY3 z&zlvy%2~`XRuxyWP5 z(orm6HHI5ufm`B&cugJL3)F9+$Fy=|CSv7KcKeWvuIzeu=B-z{T}R|>=(cd=RBD=@ zeIdGq8)(SDjsO!=JSucIzxR<^pSpHq*UT62LHI@zlDA%ONeoI%N-Vnj zX#HMuV^Eyh_uj>H-3=`$;;h|LR0P2^DpEo6?ER~Vmf#U|2*ZNo2n=$SWa=ovoV)HF zUPI3)!^4CLa|*+Jt_UEktpO2GY(XUY<|Mio86n&E-95Z!>UG40b%Tl1j@ZPSQ!cW} zyfX@9m8C|ey+znPcLT4X3LczI7>PiRh|j1updr|JWo;YwtSGev7--KSxBj+UY$b=$ zC6|k;OGmKNz|i#Q{VkUIjr98z1ktGQX~VW(o!Iyjsq}*+m4f%@2%3{yyV`eOGd_5= zQF9ZqhJiDb|J)6)KXgLLcLWge2q9{|6V^|U^_i6$` zU4$KAwCb9|*i>8ZlNm#=0g@KEm|TDN6%FQx?H*mj$GlydK-?k(d)GjBPeij!gIY(_0@?nD_Mam{57R>02%#Kx1Fph$xvf zqQ@k=KNv%3nlG{9$~Hd9#FxOzEx8PM^-jg0>+ke zZUDQV(kfCC*y*0kI+H|d)Tj0-PW+%vJfel0Grvzhxgx}}X%JAWYM6@grJxpNR~23Z z??mfR4Fx<7WG*J;h&HSd`cwU(yC0(zi6}AV60Z-0k9Z!fvCuI6k%%Ab#nyQ53lYSOqd2`|BX7L3-=jnPih(V<76c#B*bGbC~2v&znh;?NB8P(U3|ES@kicwUCk~@Ib%b*)7 zthNn^IW=n8(t8SHxp^fks0cGk5wL2u^p4uOeQOoL60e4yRHBMKcy^zH;#S=< z=yr}fj|3;QX$XfNvXECm^kM|D-ReaCZeNDeE}?{HbSK+wWGv!#@FYhYeIQ2-;;Tbs z)vGmbTHm)_e*27~+7`D$Fck$>_kh#yyiBtyNuAq}QxZnzF-o8vleOceB)!giGn}{h zeq)x!fWe#6y>%bVq?ik6JtNEYX!raOGPn__!`N`V{w3l0DhoOveL-j!$w4tL9=K#- zw`wtI-@ThyeBTgsnr6C$o59oToI@radz-+t8#gwCv>zdI9Wqf6>tdY5sqP*imnNL6 zm^hvIu(H%erEp%aD|2g#h(~T$e|cQ`;TR#Z02J+V%3K22F5Pz#-kc~i-io2^E-CSS z$WgEUqQIG&3e-+?k9h6LlL!s#oI_*2{m&O1sBb)|#FgIgc+WSinzXh#KzKyOvb1mB zB_bj)xN&v#nijo~xYL=F2EoN@_SffM@-1h3_oTLRMaG7#3usH#^7>f!GhoN49c9Tu ziLoNwpMsO}y&uOAj_q3ulzLfO*NT~XpH{4-VnXND+BjW+K{(f=BSH?Z2I|zExag3? zaFItj6^2ATjtp2pGJI+dVWZRT8NA_`!a(aVR#2e>0Qu|HmDNhMwH7t|H}0$i@@WeJ zg(z9t+9Cb?Ashft0zbaA@#OUB_0tDWu#H0$``PW`!@-jaFP_;3VWy34Yyl643m6ae z^u7^U4{_y21FKoNA|1E|JR}Il5OJCEU@3LW&rw^W?6s|C`M9TUscZt9m z_pfR~Q9ax)#fMTpJB5Y9WypG1kr~bsABURsj~f)<)@mG}b7yG(eqf@$7EcS4=Pmvq zR(JNP!6tO?BQ>0>IC=j{p475HOHGIAHUTIj64G|yF;i3 z6fjUc-vMLxI9wcdw&OP(1%+Kl& zq#bC0!w|)Otvn_1W+$|j*KeuOyb={5;E}}1rW;O=R zEwy}tKKb-wLWf_PqqPZa5(zYZ4nZ?HwIj8Ob?O{OB6P$eXf5Jyl|dlPgJ-v}S=YqX z*^W-FFHAYL7ANChwnulL;>37+*~1DM6BO$xuZQ0+#@L;iTA3CbN~M2MVo`-V_y zBQ_ya&h+6A>3CI#fIVt~fOp@!$h{V9)?!G{^0$nyp62q)AMi-^ctm?hC`bVYw1>*o zsPNL;wDc|Dk)d($N>pwr@Yg$VcTY%bJoC}T4-a;S@1}P?jTUl5Q4jpSXPF-5$`8GuvG;y7J41`9T>VqO2}XJ5IS;jjR!;77Nnb zF60WXrHBt2WOW@PX+1a9a(GM2b6%nvnnX|$CgKjF8mopvk+cO#e5QDZBAu8MJ%X~M zc5W3eb4Y^J@?i9+KpvRDyb{|aq(qeDKv&fJ+bW(@)(fQyIfH;%1!FnENjNnJo5V2T z%9I9~Fc^vX{JMmqd8{g)SrvBmpOM4GiIHwl@sM6TKPM+0s{GNZ!$cC5v`8QmM1P$O z%%c8AHG3#!K@k6(i&dRJi$FB2T_VRTN!Tc4sY~!E;Yor6&;9U%iiweG_TP3Wj3TsT z`pk9_%AzthQib>O1=Zp`p^#yhu^yHO-uv78SbdiGbrn#?q-=jY8t$PTXEu<_d^_V2tVbhn=$-E}f12~k33g+bP|8-noA^u~+*VmVa zDD_f)7FHNZ4_{zf7ZL&r`4XdR+JciEqqr}Aa{N)Hw%vJ{|JA8n1GiY zdM6qPsDy&kZ^wjqIsZXf0xL;^00$UTiM2P!KHpxcwobjQI3Z_0^uaQQn8hSvvAfAkB$TItAa zd63zK*h08Oyk*C}Dps-QZBM3L-u7ydV&n1~+k9+|%GiY?v!R%!PU#f|VM_4^cO>$t zs9(NXxnKEcb-i}te%Z^aR)zutkwX5djRaIWCyflJg=MT2swgC5LTG~BlZPhkr4*bC zmixSn7aCHR6bi63wxYEPTodB>ySTwf{vwm(3#6(!#x!y!3WXUgpc>{{aUyH7+RaIS zi!oW02P7BXu7NiEd6MX|?F-o+iR*~cDM)T#iyBXT&L4{RWgw!KXMW^YU59 zi?IAzCohHK(jYPA6evDj%D|zXN?|RZ09Qt4)T4RK1+bJ_DX)&9In=6;x#iBkCvQ@CpDW79i6unY0=$}gWoNqC4fCtCY~ z2e(52YxhR^3Pxqp&suT;9E}FqV_AX~ZY@!Lg~>){3Rg*5LS98)XrB_oPOs zJh#+-Z^RQb;yv4NtHwqM7^7U80|RIGkkmAYKx+(;l&U=j2`w$WodC)9Y?*_=6?Xd3 z)ceqz^{-Nr4rVq(1YqQg00ZVCfw#%{;uI`n;s-VHt;#~C{$}1J2<{Q3f`2Fu1m49c z_yQvD#KYuok&>7XS~W7!ww5i`>}N}PX8>jh)DY~(KChv~V-0`4sbtynJJ+({77Cg8 z6qWv%AYmDZ5v~}lsu0n_8?j0639(wAEfp)FB2Y<@1P?;j(KA`P5M()6cFPiy8nh*s z`mgB-g`!%EpiEjx6Sr37*KhoK|Lwot|LYG?Nl=VybaM%k+mXDIYBv1+CjH)8#Ia3z_;wF!6T+dI37X7}apI?vfw5-Iyw8%-m3@p+X4$gEGUrhOO%t03CP5G7o8ALTw6&(zPweWBto@5`KmcF z`}h9l_4ak`hMwOSWDOX>t48 z^&oC|yS~s_&Rk3RWU*|#rS%q;cMpu$n@Vp6WS6)LKCm#;`#34aZXgtX>WW|vjA;ky z2!)XNM<<=M3?=9-awMw#5iy@Na2I*sCot`Liv&4GV)BcA(GGpjH^>_zO4o((8d=)m z{20RP7D7K07_bd7XoA7EAd@<}Yqw3EmSwBGVO$GC!*Yjg77fiI3FP{x&dv%5kCr;Z zi>dl}7KF(Q0-+BacmG2_~!s z?$E^!nn@mE5s*v{3HkGr(7a4Jr)75c_>UuF;BbbmoYWXoLGh5ccixd+6DoZ%>6^f0~{ zl*Wk9!aY{AJ;gWTwRJg?Aie?bSfD4>gXti#E3afsctn?+sO9u>!@d3q1V>o3mZSM0O?+3%>s;x+!qw_5@B-ZU= zhHO+0ZbLa(+Eu{k_f7ik@bng#mfmoY8A0mG?NJvoJvoUL6ogX8^*fyU!_!C4Onza^0 zyCswzh4<=xcx9tu%3(@~fQ=8vaajs3a1n{)Gi`=7i1 z(oHi4t*FXF+$pbUL2}g#(70ETRJO)cvm6%^Bu!4n75h0|a zBhyWDEALjb|315~M#h;0rntPwJRqo6Ix-KGk8r{Pg;x&ZUtbYwoNgg~2L4{nw@4C(CAZ49xG=&P> z+o^6v&OE2ErVnsA!h*s8KP?$~fpt*9b+^pe*p5?Hi43-#n}2PC{jlrx{`48wjI0rv zq2_ALu1fY`+3ac&8*!t_i3uaDN1=hGK0fZlaK&Lgl?9ri1vnl+)KG2Qic0Vq_R%== zX8LqMb0}mNHzDRw0i+XZ#E5qgTcp594y568IIIE!ou(zian|4){p+$lq98;9)JXd` zMeSzUP~EW*Hfm#yxxpJ9ZMMk=pwyizgC!;KjjmyYg^eL@{(-{HoBB3&P6zvzh*9Hh zdp)cPI7U@!Ur=(Z6B8s`AC!O-AR6)c^T0n^1SfBJJMbSC*)ujidtnoJ8OprgaP^wQ zW|Tao3H@hR^jWQla5gGLqf88{O?gp@Er>k?NQ_Y_zP$CbXx8kZ4uyvgOC?w&L_~zg z)#>?B5G|lt2E1b55G@h?0$hBgHVP7&C_(ej`6s+EObTSqzA zG9rLxa2Am1em$Yw+~@*UZl*Yba|g>TinUEt^#kJbSNOtg@d0-E@t zmLNsg!n0^4W3aUnWai`zC4o=>MGC!i->T}LI^<-EJWL5{Lg<8&uK**NIxQqXbLjen zZ1(5NLL^zjY^X^xhp1zedO`XU%C}b&%K8<5mK}?>O(BA6w#5Bs>N6<#?+7L%%c3M# zafZ=_xbWkbiyu7&lv?udt3E_L)PGR@Y%KPdpIa!l)j7*zX0lD=Df*%A$;DlAM0?iq z>ydKTSHcj8$Xmc00f{`6gG3~XrAIM8`A6~`tgYmk(%B<;dn)Gm z$=!tj7n{G`M{BB_DI~gNaoQzvxJ&oVEI?-NgS>~-=i^5ycW8J+5PuYeXb~54hk@nC zYGz&DdBYERPr=U&g&TP?(6e~}uBi(WU{I3Sg46vN}hz#Z;Fi%RHIg2jjr=Q2-D#-Me}A zlk`Vmx^-o`;P9?;tsR}I!Ricpa1C6gEM1er$5Mlv-unxs@P284i*nflszA&&p4luG#MZQ095j$b-)%#C8VoptOt6I(Y)iO|X^ zn8v09dKU;Q;JDcPI4M9FfqqI1))OVS@#gDiTlGQEi%?&^4VT0YPBLwYV2d&v#f>2K zHcs}@jMxD4GSIpiydL#~1}rvllA#z(R^n`_iIbvvy>e&^odFzsHQ1x04Upp)w3fju zh+}n*ErngMClkq2-kT}dpq+g9CTqW&WNj$kP1P?XsPgtq&cEGFt&IR&ia4E6j+YyR zv?I3%*I|o~gG~U6a&F_uIPQNzmi7Y2eKR~avlXm9&9(JsGKp!~P+8pGi32Ii8YF5! zM!$n6J5i<-IIz9+4eF+nx#!+`u>JDHP9SpRLWTE~5f(0_f+)LZ8c)GMkA!DG~oV3G6Rast3> z>?W{8c!dx7&9=DNVQ!ZFR5YbL&R%O%^Ez6&ZJ!uWQ~gT_&HL*+cY`gl@t9_<9(mfEs#t^Xz^=rtfYgDrn}#%WpctVIdv6 za4GZHBGsylEceb_z_8K+{z=n}f|&s&=CXF5(9Lav8Tr%*O+MN(7-*;cP|bdLexHS= z-b1I$E%BCOfu>BZiNKu1u5d{7j|F>x&=(&$jYF4t+0;2ytLgCfqn8G!=26;mb7tN?Kv&>BCnj z@7;QAX75wePac@weR%rh``%n-ddD-1nHqCp}!?0K;|gCsIa;9WeDijc-TBOom*#w3`<@FM-?Q+8?Fk|dWgWt{ut)|;2=WuJ+RhMj*YuV*DRV1rl&{Th z-g}j;@#4;Mr2N`5lWIr~QQ-0YgxIn< zAe1wRF@A&O&-y7~&zP`hUtrhvx2g6(nB$$(C!C#1^C9Frgr4k(&6&I5qD?4lga;q^ zVXv-xMwwl0j;^HFidqm2@b-vswP+q^ zxU$%mg(P^~SQYMo-P99^ObynRmtH0o8Dj3mmU}1|uaLfY>aiYo<%dqMKP`ya&ex{5 z?oO$AOkzEmw(!<)H)-pJyXn9!ciu;8%%_{MvfbV{5vC@;izgnZxnJjvG+MfqH)HzT zVajdYN!T3iE{HRXlqHO_7-=NW!=vff!S;aogj18UvriGWpl67s$J=2-DRm?)F`{ZK zsjR#ynH^nO)f@nQUhAITYW6>6j-W>GE;9kNNca0G;OGVE4i`v|1Uz)*F0DyGKsVpX^|!{r7{wgtBVzro6c9mD7`3GUH3 zo=hww#FCi{9)gidPhkhueQX3ML*p*9SZXbB=w5 zx=Rr)p}_OGo;qCDJP)C>cnRotCcnlzlKa$sZzVA`b(r*lRr+%p;c^cy6~$FGJCl`l z(A%~s&^+DIpu#sLe7FzTs}bTGJ?_wtn_hnq^4mxT;E8GY05)6oDdcOU)sLa+@@e4c zm@+S?vER&G_36G1o7Yi4G#`w-I2AEIj|QD{T7PrwS;g;Xjc`B}t1s{evHQ@BZ13r- zM^5CgPT6!vq!+p>PNrnFOTZ`q+2plq_VrCP>&Qxx@UrWWiUBL)3fj zG)`c!cawljT^v0-t|c7u+rr4MBb(yT#jZK1W+#f$BM1-43OB2K9rs48=dTe;W^c4u z6d^c1T@u6{%dWfNa;udU(&oeKWFHhV*J$R={&f87Jrmi23pGKC`N{Bj;M_3 z6&N&?)hr6Wa?i-WF57iukRK5Nv+4+0-a=HGY}9g;{fa!TvmOS(bA<`OAZ%7{{qmRN z50!;q7b6Fioh^{-e;Ew6E|*B*u=lr!YH$7Nh2%{x9l}>VHT~4{WK~2+;Y=6&$hS5; z2Qac={mXvi=O<=t>w>j5aTTnf6hQ-h!_*BqQo(HRR4+Hss2f zticN(7^<(ubHO_Y%P$|yjUC&V%*4XAd>X`WnmW+G>gHcX21n0O=MZU<6^#e zL8vx&C@sOg|HSl82qoSY<>|(Q7dGv`upS z0P`)RSuc2{(GeAr9xwDa$2N;Am5%cZXHRUsxu@plnfPtt*FovuEDA6I@Q+U>^_$$- zMofnT&=%K;0P|#dFzVL1e`{eN3rEPeT?l)stxYP@*$@vWoj1^QLJ3+#L`l)PA66IE zC7~8um3C45UjyFDO*XnLbC%=!gYYvg)oSI(91Eu^#a*bwxtAeKsxb>?zOd*HMQuu| zNGYhv5HPjek#I-R--c_UmxGPILCcwItwLiG=;*n9VqV>3@cj?P8fIy&r*)+FDJ=T$ zy3^tiT4$UI?SuG@Y~K)Y8^;Y`8wQL@^w$ZYvaCahcA|y_TY<>|uiYxV@>EsjA+Q~C z=Z83Az|@A%kc~_goi3^#h=VmQ80dv5$|r`Q#zkD>%#mERkZ`krU8;hq7rZU

IX1!bWj?u#;Ct##U!!C&uBiFTyfpyk|czz$WAALZd4WE9OS%8B`< zYP&N*bjRW>L_r2B_Zk@k^R{RiEQ(X7A#oMWf~Dn!$@U}JZoqH&%VKqUWl05)vB&S? z3%DZkU1QX)qtG@;m;=qN6CXpk#qwW(*l_9%;ivnfXiu3?4?GX?xF8P|&#Pv&B(F)` zv;3@+Pu|F<5Z6=uj@$)Qi$1)ThG-Wda`MWR&`5b zLZr5TWTuuxq}37yG09A@Ue%9?WPaEXa5Su9E11-rAgLAXcJ|oS%)Bg*LwgI?HG?ZF zU;FZxZyor?H*Z_i-+${j7V+2D7WJ(dSh1-8Yb$Q8f3v>gTYb0I3N2W*jX>l|`+} zs zroXXoZ%8R?^o=B$Ya!i`$t87oLj&EgE^gRTH!Me3Q*PMF^Sc!P?^qWL7DoqO!5{#% z!5v>-Ks(>GI7N0mtP>9NSPe%;DSLc(16tk)Fbi0xC#Psbv65P*mvZ@%Lu;>?~k0 ze-A9?_&QQH@#Uw7{QdL{_6Q2kqN@ zn6Eri8>Bhb8M5bkhXycGXlbY}4o2!aW7PHB(U6$WzP?nybAaHqK$!fs`b*`Vw#J4C z^av0+P={Kvv6fOv#ZJF-SG~2$`I|^A3=w%{_1UZU{m+^` zEK||Z{B*1Su*%I)J`mzZc9&`b2wL>6MhlF*3NZy*8I9}4gKv74FpFV{fg1KfI+qVz zP?Mn3UJQ$9Z{(-Gnd~!aOv$AXZD`Dbov)`1A-ZX zwDqMo-}D}xX){3gqg8&J?*u<}=Ey!Fgg<^`ddCZ)QIwrWM^4`zPQ|11=m`~ehvWCe z95-B_XsjXYzlWP&(-h);jBW@3f@^~;r_r@+8-lulAt&EG)ojT_j-gXIh|;ikQsp5! zW(xic`%LyhyC>9+7*t9j;Nl+oL1_;$m2G18+BX`5TmS)M7_eznk3@v=Akr(?A?p2& z)J=7QkEZ?P>ED&3Q?CFnBgtSlq_L=O9))9xy3Y0}@$Ho)heg}M$aH`r3q9PhrkWlo zE$l#b(PqN|qh-SZlM&H_(iM78-3y!-KAWTa{x zg((|9vc!Ng1p!j5+%K$b{P#KGjFmP}_e&DLeuT{K?2`wt zZJ}i4)K31eM8Ugn2(LeTsKDX@<=S=*R8}{Vc6RXpcWvp1;+7@_W!NXtcksx=YK^Hi zH89GDi4nSFs-#6rga(bax)7!7S`%vZa_$uJV1UYiu=}Y|{eIf@VambQ`HVB&rB%U6 zS_~xqoquCkFB{P(#Z}Foq0+fq5R`~95dl(QVYi?9!f zIua>CZYWhVRVu4*cN)q$2BNjZ{`y*nilg4E)OMqH;_VB$PVA(^I1jE`!0~XQW9JBwr5gHKQ8+KOA~32=Ia)2pd!>k;)(7^WBhHO7jsluJi_7=S8F zN0BhCn*GH?YW%!{XAn;MCiD+`PD?Hh=pd-Pb_VMdYiWdj(GZPE?+ws8)s_Ss72`K8 ziN8Rx+aA+$Lc_HvFj`FqC_b=kRitA%cjv=u2Z~XwtCh_G*s1I+e6p$I-bo=G4TE`nBU(!I zJZK|dDbIH}ZQ+%tFPL+2Me(YA;fZNR#jzdBDOL?tvt8c6MtTrc=7m8ZWT9EY4hGdK zm~6l`sWBp2>^R@4_TCI+Ag|YLLUW|+OA7SBIF)Q}ClxISLkdcl+omKV@BX6qZ55sc z?TCb6lF*<9hZ0*3$TU!;(4}S+M`?`^fFcBSZY7X{@C=Tb^BG&AGdEV4L|Wf>PHJpW zxt|^gAfX%3e2Vo`8;to!E`%)u^$zlYtsc(BUUVgT`OvSXA3Hwt!pWHfTT?3ocsX5$ zmVPa8cYD^H#ujtB;h%@XiMA@cNf7RROGG`h}Aoikdq09H;<6rJ@z-8mf7~ zpV!7D3jn85V<~63vxPJ+vLH+OnOQBNPM11w0J9o4)H%fZ1E6ton^d$zEshm zUK5|KqTJ|1e1uSJBVyOF#>#58s-Q=41R`5M{OqiA%m>Y}0ZDldIB}`FpE|&s!8T0n zkWm085)oMt*oI36Xyue6dw}a(R8UA#U)O6sjjjyE(ESVic@Sy^*!pxFmSAfvU7qmUp&VY#wI^KJsH6}@JY$h_77DvgV^)=X;J zXd*1c=8F`^F+VYT^*VY7SgpiXAf!fpBJe2RAg<>QY4Bso-b~yls=7!cRZs(jL0lOi zra@Ct?tm6heRXJq1MGF%`O^sLsmG_@pHOLZubu$FLzxKw-Pux1Y9oJ(f_tPfI*5c= znfe9D?-^oFtJxPWzqY|$Tp*mu_9Pm@pE)!C9~F;svFNc6XWo~w`NzwgJKy3N2)Jk; z@^Mfbm&PpwMJTJ4`}ISDv2x%?u??j_tYT2eNtb3G(!j%6^dOQ&JmO~Z=j^qtffNDu zm)lY;?9FjpUbJ&f+kqh%45z!dE>UE3few{`uwa7RMMo(bBP(t(gsj=)39mZe`paA5uKJ4KhCAs{RTOs%{RhtOUSmAzNMS_) zXu(Xq_k%3t!kk!}0LgGSO;j5X)(?}&%8qc;e{lW)i!ySN+lNx)3azwHwt)2OaIO`R zE3am%qVH=HltKT)6@@qLCW1NH&g5v8fo=}c@M<=l(dWo_oyl@l5xbjNr>{AM@74+s zX!JnzvO2R297M|ovv-3``Y#b5@QXnHVpTmdDw3eOFQfZg)OZV){`0`tegm z!JwUfI6SSqPkUgumWmgl8oFpm#m9RImpGVK&u({erP7_dWZ@dR?I#}h2}@(?ZaCjA z*?rH(I^v_HVIV#JK|OCERj{~t|K=uQqj^U_v(vg0Q|gon`NEOPY9tDNL~uILHvbQM z?;RJ#wZ@GzVvAU?M2!VkY@lQ%)~mq+q67s+4K`xTN^^k)rGpg&QHo$eEC_4Fhy}%t ziW&vIwiL-#;|)fQQWQ;M6iuw}_c>=~b{2{E=KkLI^ZO^c_sH(-%$YN1PI=1r`98#Y zc}g#fa2V$J%ElnBfIEa}(BUoNc|-6MaH7!hRswvz03t{fKaAGS$DeAv$ai!P0GUw!~&rqbn3oOIf@B5YPuo z37Vc6i!u^E!Y~0&KPb?^>dQ-`Z1h0;pb|)xiz|)zUg2)T>nF-n#afS!=f~(W8VTac z>9iikfDP6CV#se#h^YX zqL^&0&3GhUEA~JQfrxx7wP{E&H6dvQ%iEkxwDA;;mq%me@I2(s_*H-2bGu z8c$*rmtW%{-xv+dV!eqy8d_ANT}D15^jNKp5|Zo4suv54f0N}MY`0=QPz1xvx)S(sLQ>{OUM(h3@M&K1eKJ+_=naM!)c(R;$`3g#s!nr8s@DIg)4T{>DWT z{k)=4a+_<69|a*mRqWdP8T;Sl#IK2U_+1bK_@l8LX->z&ktn5%!vr=ch$L`9!DwCfAS9AWX8hxb}exc7AXa~iL z!XrtBR4H}sUwR~Z7)7UX#%F4T#G87c=6a>{Ec00B|OPA}QOg;S6R2 z@bU(s8ZaI5b>dM~6iH7|-)Pb?BP~0VS%2XLxGF=JNgzkHhaFczYCoT;5$t>s>xjF^LOZ*JOWHM`mM&3X9&J7B z-1st8+iiGqAiBf=e*AzxK9dJ)yGHT+5)AS$_ZV6wiz)x%9wI36FW&->A#ZcF-hvYw z(z8owNnD~>=D`9>FCR2)wRN$`M~jytoATKC5+_QHF-W%wnvHpIfMBDJ9(G1E{s6mF znt!$3j?5pp#E7-FuZNv9v1)xlG6~RqjZl=cCL&A|rkOw%LP>Gi+_B+HxdX^v10xu5 zlVIZ_M+mIZ_(HB`toW40(@VY%$3jq-7ps7b7<}6L63{LfSy%(_oY)AQQ^nDBNM0_} z9J1=lmn|yWeV8X6WA(|=+6I<3mT!~J=4K0CnRt(~Bdf?1|bFI*Xb$qif;flJTP10$dJ^)IC&W06~W+AkDHP z1`b78Q&o_u;T03>nLn|IuxJhXmC>_uI#EjEM>XPd z#*pUAZ$c`Yariopus$ow)9_{zOX0{sBnN{+4%aoi0`?0UNXUC3lZUY0;Er@TmzM_Y zhhjhRMAbg9?84*ARYfVR9eoGWgLng$PLw=FQad2~vEBl?%S25;IQ0v=H%&wC>OptF z%!4Rvq8n4rMlmNBV=E(5v6x>J6;LPI$kmWq$*QLMaNin}a+}CUC^^)T6I4lqDN>Lj z5f*ic9LLTlpVEy)H+@5ylUc;#WUY?h{&p-P8HpIHS3x4SQb4{@Z3ywH))rH*BG(dD00O)jF9C0`i~%)=l|peABpEn9YXbAJ z9$-vG(@lB8Yq~>?l^{V7hZB^5H{6d0g{N;QB z)JiaSF{S_=dn7qz0Zs=3`eB!ZXGirBq+Pm<`csll4LP%E@X8k&rYRP9v2Lu)tSVp| z;3n!mQQn#fqJYJVwp^-&77y&j%zLdCy3irMDVAq016TlipV8(^hV$-plDwJ8=NWC9 zblzZl&ihGEz!#%18@9&<7H{x7eVn!`jxjh!W4`E^V#5;t0n$yyW@E#5BeL0&=@bo6 z?o=W+fKz3D;3AGu#m+#~@8Wt*G!xW*NHN^k3RjdR>m97L)Kck0abf3feK;5uJqQD_ zCwQl+8tOi(Au3<`Kzn85K9sf0#jS= z8ysxBFIfZ8m9!clZ#uz)-ZJYWG^Yy#Axhb>$1+S=pkMHi(yXL5;92F)n2xg*)2PNI z0^~>J&42>QFs!7f?jr;cr2!UG1H%VL>EoH2ORDBk;A0c0zu=6d`^h7h`PpQDE^>&4 z6=#EeM#*spAR7b~m~}Z>5M554P8%G(OY(a`9OZ#hU}m9b#cwpc`Iy5;%9bw4pNes> zmKcM`E6k-$Be9UXt9a`6%H3Po`{r{)IVNfNFbq~e71RYQU#v6ADFwBVLnQ z@EnQTaR4t9Kx&9&Tvj6{a8ZK8i)TsV;W*$#Ym6wI_+|_uU(r4;s)vtl*zj*7az06bt@&Cvm&Tx`h8I>(zBZpkI=eB(nl^f@oegnfTa+EFc+-u z$LSv|-gsXhQ!7cF5Go>ZYG1)1Vlb(NP&t%(6A4@Z+N0E*OfWKD3H=ca6dXmC8c^(j zM2^OHt<|apA8CNm7?IXMEQi#6Otau`iC&T@%*Z2*{j69R*HVf^0+i-3J^5SLXEGf!5RM3(+)Fk< z2HIiEw9#rjYm6u)ARE0u>jUM|OvX3r7o%f5SvrQixJ(CPFq4B4M4PWApohMbWIj=Uo^NTlHncbcv@Yln}wx7Xio z()`^||J^wJyPy8Jh7?PHrfIr;!pxogUlEfe*g<=MDqDfT^t2^l zKS$DA)!Qymk=A@9jia%JF@@;oE=8Lh27w#VE8;#BsLlsvK(9t9!8N8(5-+dW5W@t zW~0fafsT4>yC=QvS9lzDNLsE40b|%K#LOe2UIM=(K%Na~#)XckKyoJtzHh6SVV$xl z=ueD|m*DY8^>}apA~**gq>GU#{48QaPu#*tF_?eB;CB%G;U4ggAe9&6xG+E)!E<^< zQ>yQHL=Dm})bYjfVn94$?OBd+7H@*XEK9hQJfzlUtE371*(heCXKJuCipai7cnLuC zhz`9Lgg#5pi`YV}w-SSftFn&2js5DdX4P-YA9FH(m??L`FqrDVdANaVYS zBjJZAT`$4>8APR4JU{I7@DSh>768Diq~I3Pj|*|9w>L`rwkC51U-W^DF;PYZ@Iepg zF9u>1q6@+25#Wv4p+lGea3(s0xA-IbxSZy1JWElBi6>el>D7Tdo93umWe*PR*+7$q zMzAz00BsINUI0pMipAH8?3BosqCw77Yi8s`64_uF$j0AY6f0#Is#TfQm47@C&V;BatN# zRaPeK<6$smNl1}lsIn}6TSe|Js#3+%%c`vIvLqMQsEXpIWM{CMptHSi=hE zrLtt*YN-}HfP&Kit^qVP20i}qWDpjb4&q`5pRzr@F}TA3ScAo%*rfO?Lo5mGRaVM8 z6<$Hsuu?h%dxs+e$7^B_jg+hqMn($8rWPwI_m;*3z4fq2svaC9h*-xB2xceWCEFis8oc`C3s-BFjcWZ)rpra%ZZAOdh6PfQ1$-qB1fMgy_Z| z8lEhI{5y)}RtgTpYD#s8YxjPv-T(<2WiGmuYCN}SEvDt1R(M553Tv`w%CpRuO<0w8 zQ~353!T5elVsVweYS| z;J{tMeL;6^!z1fdKw?*Y5vTC_nUB>(M<5@V#C?NDzDR@|(VI~F#7xUhA9;gGMvh&gePd?PF*x&h7$%^-6q-)|%tl}a zLf0v`2B!g`z#>WD*9rlS5LU(ju7pR24~ImTnG}fr5#yg?A?PHrGZ}s+0(*$kgYwbv zgHliUXyI?gwh}0g1UceUip?PiHC$-JMi6pY10`$^1!=QQ5NI9Xbr6q9t{(I?x|)CH z1BiN?cQ!@0IJ>hnh>Z3Pf*>ML;LgH}!@q-3aWXU{^(AbT5F2fr8Pn zTsQuwcMBb8WfhaxV0hy*LAfzmFdPv8J>iW!GvYiUag2o>;8aH5Weuhy0NxBqV@STD zUv=8}+Q8*url1i3>|}&8AqvJTe?~-uv7iM+H>d?QV)aFORE&)pYy4Yiq2z@h`ZaL3 zP*;MmGP#co1W6tA5t*L^>meP%^1^ya>NiiyxQ4}FgSbXydGX@pc8t(O+&`co21m_i zaz#ge*wQw?3vUQI8Mh8@H6j$5ier0J63$HWvn?imgY>bFkYcl^sb%@Gsee z67tGZcF}klL%;~m;K{ZCUI%R{YYvwcredckOV6e|Fr+RjD_@<70 z1zQGtsnF|b1Yjb`Q_4U?N{xZ41yUw219>S$k)l$dGAK}!uEYex{v+*iY9U^*XFR1W zxKin`3_4Z0JAwvD zwkr|IluoDd)kH@F4NJBxT*{t58qZH6Bat%l{f>=pMwUuXO7vCWQwi1h`Z7)#I*&GA zlA6@QGDc8EYLK+2K^a<~QI>kBEP2iCn(T^{^ZoYXjkNm_FXNiqi+6x&#VA70XpyM| zo1VU~d~tl4eh-HY^;*mh62RLHhVH5JwosRoZU1n9 zfb7Bbip^Ouq@f~7BN}qJw0^QtC5>l<7V9v3F)PGL!6;*yEQH}quRI8Zcs_Ul8iFJW zsD;x|r?96VV%95>=tL#qLJ8Ob6BhP)!k3Z(3RW#rn_z}IKp|g50U67zQhq4l&cziD-a&A-!mi!+xN+Q2HO^4?nDF!ml{C20&GXYr8rS+U?i2q#KJ>9NFGU5 z3z2Rb+UHfLvoVQbVHFKlwXs7odP&4Uf@~6-1;Ix#{INGn@&tiYN$LP;x;DTU#wwm3 zHbevFj6j)plA}a`JRNCAD&IVNFRytMymcU4p2zo~d7LoSd!GAjFSr|qs@`XMmIu9_ z>9V`sgD(__dHIXgkV>~TUr`Zun(2bm|4>Wr9z`u&TbVA5`im7IN&{-8q9V54O#jQh zLw%&Eg=?gL{kZ~}0;{NqZv}t7n^BRXmjCr-p%&#+u~qr6_syS-oWJ_cxe~5;DlX(r z7o7j z?$Dsvbp9W$48#5hD+2_>@}-9`?@5##^cF*d(lo*K)yhTj1{2UEcThZqV@V1KfyG(n zrz_eP_MeF|u>jY9ILoz#vf5ma*{8z0L z%!~|y=}p_67q{J!Q6kho2tGZ3K=v6>6<#{YWFZ=v|96{(BlRH(EO^H(R$gJgAj=4| zHAND+9H5VXYQ0DhBrBq9vw*k(o398xO|9Lcfpdu48j{EVHH*gh|IZc;iP_7uc#l1^ zd3LmiG+69N z@JDngKMig=wJ_q_P2cW;*t`g0bN-(U<9w2r#jqCmO)%*54dOboZ41_}=m#?QlDI3n zEsX7G(Bw&~RtsMUPJmhq#FOv>#bD|@iSR8mmy@({E&{0y&~U{@&?m7K<%rPE z%w?9F1Wb^!oWqzwl_%1WmW9V-m+e|ymcOKI>4vhSM~Ht-pHR6g9~v|+ky^=bLjx&O zKwLFi$_+ggt3O9e-`32^r3svrt$h3HxAm2(VnYE4qWQEg%Q=oVmSrCj+qf(N@!V)# z#f~J^$3a9pS)+N3VS$==NSG8A8XiQyq5X73n4+Gv=& zD8SCBd1~PtAFGVdj9eXJyE(0c9RH1R3v2>6(27CdKrWGuT%=foBgHp>*}4K%<2bE9 zc|}=`Zk#=WR6MQ9YQ#jh3FAiFs3tk^zoXc9c=*FYe7&(0&Jy|2VFaMK@i*HfIc0R> zI}!aiz(pJu=N-k?NE~9~cxOuj4hM#TmK`&YnU0C7%b3;%JA*fv7s>LBw+&@krwxI% z-&4cW5nw$ef*IJKPzg3%yoo3{2H^I8+iav+2=GEJtpa@w41aLPf(Z7&!pP^u(yM#ZHU{yB zp-v~H9ZWF{6GmJV^bvhdWMu!j&%t#_UNOF0ij9KA3R560eJ=&9 zCJeI>SHl`d&;;>xGUl-rQ3-Ci9kU9ju$(JdY_nU2)86C)<2fZnhOW2uGf)t@Sb}cH ztgV@aB4%sZu57GDBGw%#%U?(IWjF`~sUe2|{0 z;+Zob2Oz{%bw4TR!J1`=t*_dKT9@b_#N?Ct5`IDP1#pIy+L|O3@gYaHea5gNUO}<# zfxunBCkT@j<*ujY_VfnWdug$iS-Tj?7nvr*g2P~_)WH=E~($@Ynh!MDk!fM~RWt;QNpm^RfyKAwW8 zEOgQde4)ZuaoUgvh~^BY1T}@v6OvxNBiT9yAqm0}YSe}=K6n_ zF|Y`d1(dH;hRelvVWOTrIIN3S&c z#rpssBezB9G7eH}L@=U)r9sBlQmqfkiQbVg%|b@*R{6z}iVbU|GeiN8%YWp#%gnVV zL8nV)(iZ*|q_()EZ1)cN5?LDR?gkIq?4ms65-=7w0E(vDVS<3k777hZwgM*>NMmNg zm4nH`pMy&ukN}8X25D4gVRs;eO^*rQ-iYDT01L}pT;fhFK0IwJR6SOAYuK4_o+pP- z)ZD~EdceUWooY2PC>%fy41I`QIL`V;s*&a$)rhPZYGJr|)R=lPnRkcL8XdFyPC;V% zhJxEM07NLFX%TnG_H}7l1G|U_2j-;pRVlmfLnm4tBXMeXn}!@g#qqP1OC0h0u=NZL z!}{WfmZ>L(%>?Q@Gz`E5dEzUc0aM!#0tkC#qJo$tli$^xyO<7a+Hrpapj?>XeAZB& zkHwfVG~;D=2b-v5LBxbTrWSg+dWS;D@OK@5_lIE=ss0`xjhZz2f8HOBJtUxr)@!=Z)I&BN zsGJ?A3uYc%MQ2}{dN?~udar-jbfJ+4gZR8pCz^X`L7q+030KCZ3ytY)v2LmusdQw$ zfqpf3L zWRY)(s>CV4W72NzCRUUmQ@ME~3@8M?K`q4R!|Hvbx;uxnVe)uOjp6n%JODg_+$M&+ zYb+}jQa3_oC03tJFoIy=4-K1577TPpG(^~sjg1{Z&VT_31VF&;%k_mr?m@aC*@VIZ z&eV7$wXlE<9GJ4ge3+a-mq9tCt(opXL02;Y@d%^{Eb4uH5^D~DX#=u@3YJ!dy+ZLL z-W@amD5c&K1-pD-OK7#x&veJs9o>$N8w&Hz^Zo__<9RN@$ zG;+Xx2p6Xs!NRK`x|7zx47uPkA-XMwoRMxKKdoArU{8RTU_3#@CY0t!ybp3}7@;>|V@vJ{oT?PGe@}0-lbDBDL5w zP)bm>=-x3%RuUuM4^Wy|=`yYsOA2p{Ag>q(d<;bdR3(D-4Z7%o%=<|IpYDyL^lq7j zEW2q&ylA>kL=HDO;y|elFETtUgt@f)d-nrr12AiC7YbUW)|H04xJ0qgf+jFha}FA)aN9&@_jkGOlOf7N}?{TC7Q_LG!&(PNFlk; zk!lY7Cp<6=Dn8Z#iU-5IQ(P{5FHD5$CG6+&FAtl0$&(1EFNyFz9*sq6vu5L;+8VDa&;~svfUZJlEMbkn(-v#1MaE zz7v0hMjh`F>8+O6cFQMWtmr$eh7pjSL7Ti-lLeizO z<4Ihd<`v^^h7-kiMS<4oTkggzH=L5Rr95*x4``)_VGaxVNs!ySa??if8D!=B^EzWG z?`$}>Swoy1Vw;e+VRn#zn3trnN1xKm*jJUG7F#tNgS795tALvgfKvkt0<&*mQNwOC z3nponq9*+GaSU04(SmXkZU+n~<`apsfvt+}jSW$b(UyBbS%Y{!t0Tl83CFbv*?99> z-Z2O&WDS?A#O{x$LwG8{xiFVR2h9X)K8Y1*deO0Hzy{H3VA;@2VjN^6*a-31@lxOmkhHFaauFXSDk8_);mD#B!ek~ z(G;q153Dy6A$UM`W#NiUzEKW$emj`+*nMyo5Unt*!$(|Hh?|JE6OwQKtTJgfyit=} z2l57j+!s|S$b9VseKm*;f@BpG;7boI`(j4oWc&m{3~K>go)jm;JlKAKi;EHzkp&~= zBV9;F9qOn+)flm#Nr*sLBNh?JRoQhQ9+BAW$=n5yAH@!4=Jan@l&8UoBOWELey5UrhB08x2#DXYX&1E;(6X!6<`4$w_; z9Rz<;Bqj{NpsJI?MsXG4q7fVnNHp?I&Iu#-Vad|vWdK#PZb2s$ZS#Y~C;5ihh(uO< zl2H+H=i>u67F7=qH{?SA1mtPS@d7|wGkY2+Orwx2XdA)TVQ6N8Bw-1}8>63UsY~iD z5^1$;-{AlR!$l+EZ0n(!3B)ZA*pPDFP>vYNr9;6@+Q4u!VTSb3_|S!9HfR1Z(AAR3 zTY7XnS$Gh|H-(b(hj%3g+K+;>4nzjnIiW=G7*{xxq>WgNhvLRQL`x_~Pr zmZ6@IFl9Gk0AsO}Oo_OSXiQYAjINM6gH8tt1j`46?D68kS0i-2m8W@9o8l;Y5Om>dgc;I}ou;`DECx zW^B~l#e;d7^9x9i-M3@K%%Sjq@y$vps+SeO{JF!Z1+gm?W>JP1!3i#Y-Ab*;{%1bEw#W6;HGlqmgtmkf!y((?MbRmyomSUbkA#opRboA*8 z4MeIsPW2!?kE#|e$E)(I^f}~AlRK2DF@Jvfy*>M@;+9rzkgntXSL;QHoJJ#RCBnXc za9dSsGNKAt0@i#yX>v0Bee{fYbkeSX1ETcTTNjb;^2KZ7vHo1<7W+l}O&!u42Y0iC1$Fhq1RV6zjQi&*ZJ zmq|+-U8ALSp2Ay$=Y#<*!4wZwAb}8>3L!6XURdJD^{5F)d>L(yA&}N!FX8(kyH;A| zC^tF6G3tJsA!4%*Llb0C6$;W}hDNM43LS0?C0{Wv+>0O$26j|N$>X#G@MlmibAv~- z;M+q+#z91OfWm}ak#D+7$Xf{xa87+JhHNN3ln0dlPdSYa4m z5;YyX=1_v+!4w@cXh?0289XAxa9&DATT}nat@+yoNLhJb<^vLM#T0UuUJ-?#-_ zs&KZ7E>$rFJO#zj>G%y+R~9ELlS${JPbqP*$WaPcEpCk$!5q6}SfC%I*2oXeJyMK_ z8ZIhgjmMk$_83tWkQW*8xNsPwUd14xaF~5{n5Z5~35F8Iw7!YV1ujS0>f`CRz~zB z8zvo5cWEi0Rpfjp>!qST4Xp{vE5&(N%Vi>gJf4t9=z#z=u*buL>`$&`G>aO@AD{cQ zA#6oyX7j|j#S{Ys?_CJZX0_1TO$-v%dNJ!aH)yMc_JG84yBidFS^bA;p48^H${%I- z0R7Tl;U7Q%roUvgjfQM2Si)pWnvTL&3$qGd2zzmGBEW5JnXk);A7BP%eXl*9v{$lR(HIyn=C7PJQmu0&8+$+SsnlsikdMJ9CAh~nc9 z+uhjqr%ayg?5IGw+Bhp67EqTBxy6b0ShN$es5c;#Ez$3^kYiBdx$$VQWyA0$nd1;^ zN-)>8Y?#;L*`Ot(hE+^Tm23cJ0Ii`GR8Eqy3;YD&14gr8T;kDQWDZjc3+)52!GcJP zd>JBF1hxkXDbrBTa}zNZeCGb}3DEdryJlvkU~jDF2*Bh9FZp`K#q!IMb0td#FfmD` zH{vfnc|0+H6>yT={T%G;E6NHM%kB}Fpu}HcpV_sna&tVHm*msr$m5KIu$tT{NV%Jd zq}MTUs=zc=b|QmDCc8=Q9$pQ|DqzJai(ksW(h!$jC)`yd-e)7-hn-omt`NvA(N+Xz z3*}8LIE-$*OaDw~SI}8G)IN$2cvpTG%Mm3~6>}E-YrKn1nT9rue>P7mI2PKpRm0 zJ!gRxnqGY<@ob3Jkw3XOgpD#NKe!4uSQs71vOvsw+<+jPQ+VQR23Cc26=PwIK;gcm z7aHa|W{1=$N;-v=k3fGQYT_0E7`=mGw}lvl)qn;$0=3oK=I7VX19 zxk?7ZC(}dC{JCmjCuKnzF-VpY@G;L8 zfiI|v;?HJn3GE_d#TNU5w+3$YJ$hb#hhK+IxozNJo2+9(RBJY6=4v zlNuSAuf7nbc_U~MBZ>43aT_AE;yTC(lzr^c~t1V*Oc>fin#vz>&O+QKK2%sW$hPY$M0Y-X^!2w1IJ@Xhy0boUviSxhR$5R&J zT&9YUz$->!DK>f%gdsnR$wdF;RyBNWN<{}Efl_S}gW9?3Q%gG2OG(6zP_!n{;6GEi zzu-USVkMJZF+9Mf#Ju-J`ZbM-+EV^b#HnLJIVjb`r4Z()lbvaST1I7qyrDDUio;e& zjFtX?`4SVDHh`GKgwaYy8%A15YY-Rz#K;;eMs+KC;UEjjzca%e-*3FVtkuF$z$(fz z4WTlkQ!D2%wtUWnVF7(-4D!u93bvbjW1$->AGZz5g1LdCD%$bUD! z)I%iEIi=SX<%tLh${Yw=sbMo$Ss55@^K6LF761z!rC5S9MLv(98hofSX(7s5nB)lQ zUu5CYVQ=w={Z|yRu?rI+mK9`hF9@3xMKTk_EWi{(%q60`gKV>~-vk868#DTAQceCI z+MJ|73Yt(H_QSb`1JL@J*zgQ|iwc4t#oR)@ACIU(_JgTm?8Ha7fTA`UtGomeGBZ4t?@EJp%1;SPV zd7#4N!EgZ)ENox!5sAyTpDF|fJaLrKS}k4?h2C*9<~zbKD2%z6Y{ zQQ#Ly&N5nSQR5sVcBG?NX34t1R#AK=wknU|?-%O~m>NiX{XHuwNK>02Hx>ASW*bAe-m4 zf}Jl+hdRPtf`a_vH-SH$DMFA%BeX=nMY(^pz919|mBcOuwv0{@F#w2CfEQKchYEo1 zfs6@zo8by5=cq^=q|ms;WexN=<=I=xmmM#QKSYEwvU;RkvkHzvj^PRpm}1L!ZZdpb zLW&gNI(K)h6|rPY52Aw{s{?UoI{efWekZ9!d__ZqOL^{QTGv?hH7cgCJ2>`J*OVR4 zknbQiAwLQ2HB`S~Qq(N4902=h5O-lF~7Cs0A~E<60(Cbb`Ly969E?^4Gp>!*JpsE0ZalKi)vQULC;wX zls1Wr%v^uLE2CfK2)U0mVY5TuhhND{HP(BkcOXeDYzra-HUxd~z0q>&Eqau3iU@K8 z+J-crD2K2RBC3^49GtzLY^Ai&il8(;AV_I3K+?p>Hg-?0&S*jOJR9;*6s!tJQR>C@ zA&PZlqa5BfG=sN^g4Ki+VFJi~K%|Bt#sZ0<-v9?Eg4U>Fr6Qu!L;@ZcfHbFuHb5_v z@NMF=lcpxN0}f*#2E6ekUK(gbD$X8-R>1CI@N0^FMA2ta6SQz2Q)eg?7tZe_+anM| z#vyD{Bfx3{!H?q0@V+SCOl$~EDpn1e!Dkg&U6i|kcxNpAYT<(LA6Mx&7Irz>3o%*% zyCJJ-;hXx6NSAwiaTdElVl5|?Er|z1Ic6ha-VDKPH54UDOX5B(XeyLLRZnV7P9~Dh zDU~K6K`A}+uM_@<fkkK|dg{zxFMg0s80+SZpy0P#uuo<$0Tdh2zoi z*zXk8@r{nSbt$vPayjv8Tj;Z#-HwmRt_|#=eUa_ydQ5c}(m;+5>6R#;Qw*DJk3=>IO$q zS<3ZWGW#N7hs5&6ZfXHk~k$Cb8#ZiZHrb&yCe*c1ZbAFM{qcYIeCW? znw+Wbu*gY~-i+)0Z5t-J1n6NXucTTCd;_E{V^0jXz%#KcAex{}M*E?(0b%4~^D)9~ z<9WPiGZUXUT*xUg)?VDzV3`Ai-7`!^uNZCz-3u=y3|KqEHYVMNrid4Icm6ssgQTEh zj*k{~2}So{Z=fh+qqN>2_gDsQ_VQ&(7?*z)wJmt^Kws7UoE0F~G2Du+`z+P16cAi< z_xSHo*}_C6xY`iai}jqMcMW~TB4#<>+ORoDn+T5Zk&8_OVGF`!d%o^N4N+79#TVnq zGYp#nt?6WR63tHds>D%PNC}??kc04#oUiIS5^v;m6ug{K~)R3_ACnl@v)1_2o!0a zZ3s(f2q+RDPb<_Rwa}A%GHE2F@I?^|rR-T0S=^UW`U|qL_TcB1L0Mpm2+rkthsZ5n z5MQ>25zG#l$npTmX@C?46rdvDN#V)`X$A)Uq9{*r0`AdU#i{FQ9dje)4>BoG;o>r6 zq!2Lf))1yBU?h>#l6b-4BoRKOI+)5E6fEWB;XX$$XS2~XlVp1=meT6Qg?qKYnAu1k zC6z-dbVE;;dedM8A(0&5elDqFB^l%%NLY(NPm)#8*WhHOcYzZ^=@Xs`27D5vA#@vw z(x4+36|g^*B5QMqD!G#ZajyIVp&GHm(3+Cpy}dw3EhFY{S>}{@!67H|1P}`I#Bkn$ zoJx;!-#`)&?Gc!|GEGoKR0t$UEwP3gi;;K*?g*9-FuVq$?`IwrE`pJd7&BUW2S$RQ zTA23jCdfDx@(N4C8+6P#D8{NA>H#`bL3i`2qEV7%!r3@;8~P$-$L(^O3#w8y@5y_f{+rxH6b`-*N=$uJG}v0FtYi8AtpGA%nP%z^HA~# zDbIvKSU|v@^q|MyOiWBxpae`r002^DOz;*34*AmrM5=iQ+o*IQptTCn&IHF7*Vu;iQ`^%2 zY>=TS00b%CLqI2nVHaSdatoV@0XxP!it(!rnK^KvroU(Z0Ur$N+t1tfAA`EQd9yG` zEjn-M?ucfqgGTLWfPe6xo4q6b-|Jn6m?lrI#&r1OYRu2V_c2%B`97w8%kN{BTYMjL zA0=eS_c5_3@hC4wejoGmnD1l8P53@0rsMON-zQIxE&1bKY{LdsvF|miitW{+D%RAd zDmKZsDt6mIe7CELJv^i;cC9&t3@*70b3 z9T$}Fqw${ej>cy%JsQ6)>1g~e6!WyB@g_Tt#(%!+XnfD2qw#gWN?P*!f%yrqQI;Q^ zpRlT6eu8j(e!|{U^Ann1o}V!H;rxV0)$ZvI4ag9v0181V!}$7#4T%G5?4Om zkQDiPLsGlCnMt$W$xMoFoSF2)yO~MNJ7p%dMyasOOd8>unY46zX41M(@w-oE(x6PU zp74iR@^ztcvVXnC$pI)1T^lEVX4N>kvRC6|r+UT7 zT{{*h_qQlcex)u>p5|Pfykksp@=lb?QkJ2I-oe&X?AgP+l6t< zkHp0-ZQ}eltzW(Dw0?E3i~7~VCH?BNSMb{{ z{pt^I>sRlu(yxxauU{RH^5eor=`Z3MrH3wSl>SL(qx4_18>K%*vH!eL`jA77(!W01 zC_V7&M(GQ`X_UU@N1Rj9D81?jtMrw(trvY&-L;W5dm} zR?RTaT8(1qX`VIA+dM1J-#qKn+2&bIGR(6&ti`cx^Q<#laeTaO*78ZVS=m!`W>%drj|G}~P*27};zc|I}f8Um(e~q$ydy0P5 z&J?|{H$}hqV2Zx^xfK1}vK0NJyD9pfKd0z5uT%81>nzu=s*iI0xc=JR3Sx-u9gn`V#XK`f1%x==-Qo=*SC14ye(S}NXZ>@#*woSd<9&XkOuKZM{| zXvWUOc^NxTrey5=HZ5c4ytTV`uI=_b&!PYGyom#z=V`{F%zB;|;`cnyWWn>i7ptD< zonP}j?<*AN%;$M0_dL(@Jor2>eR{oJ*E`?=KGZ_C9>l^uX;GO%J4*H#;z`TeAbxQ3AR* zJ8(_i>_EeRG&?ZfvDtw~C`BJNJ5VyF*@1_eW(PJ$njd)hXyhTgue%gv&zM-y-rTF8 z1IqU1UIm9*dKGkQ=T&gU!mA*=msdfX-d+X$KkzDuAL&)F`Xl`A>Qyjyl2?H~dt-s! z!!HZ=SASVx(d1;o{H`Ypnp&MK$h1CLVEg{bf`KS8z43kG$%0)TCksw|ax;&yEYfwB{VVdcziH8nkI~CiV5Ue;(RVcJ|r9va>HyE*vU5`=qe! ztmBtuXD6L1JG-Ey?Ci%^@%e|cvtEzO&W1fLJKMW%`Pp@q?aqBz)$UyL$L-F2|3|xX zgG}0=>s7z~xs_(^&!wZ}G;M!wxI_DMgGRSMXEvezxpouVpS#?z=eg<5J3Qzu zXFbpT;@k7w_<)}0CZT*5)bm{C+@9yYS=sa4kE?o~tGgNJ?C5!}pXG}4zt^cg|9SK3 z^ZQye zZShq%pB7*B)3*5P=kOL^U8;WPn_=NG-xT)pxU^<({w0^BFE6btsw(;LOjSwqZ>mbZ z|5sJXpdYGAdflojSy^6Hl8%ydx2j}#$NMFNy4^1^d;fk(JN5mN@k0{68!;l`yCb6$ zzB`6;aZJK@zfMm0ZlYhpcZ0$bzMHi$;k!MF3Ey=|P57?Q%7pL6=O%ntC-TF8Essq5 z*QltM|GNKt_~nS}+vg|+=<&z|;|y-=FD*tzeQY``849nuYW{b+3+gjN+!yK*AZ8OEh4X^b&I^x);jWv^M{dFejO2c zrOuehD=o)HURmH?@9N#_JFX6S&*b|m>mJuO9$R*8*vVzr-aWtU+KQXYuB}1Q-(GgD z^w(wAhCEqzt@lg(RV7|)W|er&!aDJqEU^&N;l6xRoW}|RH^f_Q>9Z=PnF(Vb*l7A?x|AMwo|1&P%i8` zRa)qs_yKgtVhm#a6NCSJYKbjsBmcQjXT zEb+X0echlV>@8;7^c{l&rCGX~y z?s+#G_shFkZI^fRVf>|=OH(f0+_Cb~%_HfTZd&cUbW^|k(oOBLOE=q{#Bcw+bhFWg zOE=T+UAo!j{-v8;QQDTicdHYM_WFCb+<$xTR{4|nZiW8--mNDu-n-SxwB4=D2JLQz zTDH5j#Jb(B44Zbhz8c)_){xahZvFU=hqrnPi+&n@Z`DuzH-+CGTRr>EjNfP9S>15X z9bNM|cSg3GbLT7doI61S@O|{0I}2Us-1+t6Id@LF&$)93rLkttozeknPSf4$+b_~C&uiysd8Z1KYnW-fj>0A;xM;)mBG7C-!E z!QzMWRxN(Gd)wlN$G0zjc;^U?pIZFT&Hu*3jnCTr*5adQzcv1C%A=0eQy%qxIpxun zdQ%@YXfyRuYP+eA@+_x5>SI6k(PET1l-^ELA02a^`e^LfsgKeUoT^8sJ5_tEb*k3x zajLdIg1_gTs^?yGsy_FPQ?>sUr|O0`ovI&KJ5`^0;#7SaWqjhRr%`KOJ@wCg_4Hcy ztEY26fAzF&{;Q`Yr(Qk1jB@AntEY>uzIr;Q^3~I6cX6)p`su3F)MwW=q(1u*Wp`%k zGgVINvp!o>pV=NweO7WR_1Uzm_nOSA(v*CZFJ{$ic_1TKOk6w)V^3jWFMUP%s zl|Fhg{Q9F8M}EfV>PIiO|NiL3*=LVlykqwGMgO*sUlhIf_(d^_+177gR+W~%TzRMT z<=Nj#UtX&&eL3cN=}T>$>n|HMzW%bP&Gna0I$wV|-17QMCzPrl*I!0iUw?TvYT@hX zzR!fU|9B>t+dUJmIX@Hp#y%5%cY7wRn)pmujZ!x0nP9&X$JRd+8h!puXutWHP`Id9 zoqqAX>SSg1s`GMRuR6;Q^{Uh1aIZS~g}v$=LJ>~j`|VzJ)K$Ie47=Z}j`xdRb*>Hd zHT}%V*L1O~uj$IMzNYr!zNWuL<5-NZ>HNjMre;fgO&g>9w8hudWSg()(w)AhVI50M z>vt|OU2R!n`VXrT(_tvfQ2MD$Obh#zn6~~1zqyo{e(`aM>7mIbrVqSJOn(m^Quj5= z@{l2QSA`9!E6g2IckjX>b(^moQg`mIA$1?^9a6XFp&@lOXNT0CeF5iuGo?b=LFcYE=yLvQgB@RAZE)`L)dtsoxZ1$)=G6w1s;@TC zqijVP^ZaUqPi`bP+P-sbqr(GRnt3|4GzpN>;Zto4&E7S(Uz} z*?p8#Ct8}_ENW>s>z^&n+OHXD)&XUE#z?b6>qeS&(~mT}k~7jQd(TL-HU~zU^*=Py zEdIhsv(;bY_wPoUjV&E%wr;$)*~7>bv!#nt%yz`5m>pS~VrG?{Vy6E*#Y~%@V%Bay zemjz4*64VOS^D)9vo1GM%(|jP{@$-i7w4Hxet2E4snD!`Q*-nBO@C@zzv-_Z;;%#f zrXxP8-*lmS{ie$%*KfKUrBPu0rZ*$%H;s+1-*nKDvrWH#(AfOOuZ_)H2~Er&ywk+| zbc-hDu05KV|DwishbHE)M>a8^?b^iLeryx-Q7Fk%o0vy?^fmu5ps)FFL4D1?5ASP! zc2QsRe=qK9J}0BEc{qyGdVDYJYreU-uX*L=zUF^i>1*D1+#p)L2u zgtk0@vN$fZrA2CJ%Z2MhTQ=Sm+S2A^Xv-m|aO_-Y%Zf{(Ee|DkXgw^gL+k0QJGAb* zuS4s8D5nl~XzhBUL+e*X9a`VGhVom7)_G1}zkjcd=7ZNk+j+mw8CvP~D~lWn@9Odo%;&Cl*9+k6vrvW@xIb=sc)p-$T$ zeyr2>?$bJLPnwvvy=!jT_IV4_w$80h+g5cjZM(F)Y1>dc)3y#nOxun`*>~KmZRcXM zwk2oH+O{nP+qmtNA|7m>^z{l^H`Lx?5aD*4Xf@va(s2?ib>U-OaI-+vfZc^mK{;5oK{$R zxvj7apRmI6>L)8KvotF#Lw#3Rw$`n%j9a|IGJOetOI~3)ZuJUFla`yi>eS@*T^X5A;OHS6w<;xmm^*Z-#*tm1g#Acm) zzT3NV&&{@-d*-0DYgTB}5v9t!(8lY%LYwgRg*I2a720I=EVK!=EwpJppwK4HrO+mQ z9DZ{zv>7+O(58!(`TOfD*7lBDVq?2C#m4sFavR&1**3P`S8Z%t|6pSqchkmp-A^{Q zR^>Lfy-~VW+Su;AZ)01({`T^YZhd#9y7gUW7uIitOIW`Nu3`ODK4Ja#M&j?nuzo^%Sid2khxNO# zC9K~?l#h0V_4~XytlyVs!}`5AF|2>brwjUjJZo?NwRam1h|CBcX!%9(z`k392ikv$ zaxHk^#2?fNUxEjYs2?)Wx=F~uO_m`8H~h2D;7pXB=lTpDc%jeW zEtmQXo^++p;7+&u49+O;Gx$JdpTYHB_8HvDr0?K?_4*F}x=G)`4=%+F{@t_3hrPFZ zfB0)tQ@ic$P3?|anA)8iXli%iLsPp=!|~b8)b57~rgqkoOzl4QFtxM%#MG`E$}C?~ zyJ;qlcGFRMAs1kq){b`jRgQL(dN|tU^mMd4Xya)2qaFT^bhIn})Y0y;#?dY{(9teZ zuODW)TR*ICzJ8efIh3FD!zSL*4=cT|AGZA${jfZgo4@OajcB%Mn04z-!#4HWG;H9> z_lB<>HPj&+<*w6Ehs&P~b@0&)b$C2;s6)8#P>0pJp$;8_@jZE{L;cl59ol3Jb#UD> z)M1*_dWS`m);p}2yxw8+43uT-9X?1}?{F%0y~FXG^$rcUu6JmLl5}jngXyXD4xRtG z-r;cOmkypgzjO%B`_f_f8I&7eI&`l7(xK#!FCC`WIq6VU@1(&=|j)P;v<_?a%T01xne$T-%x3`0%s;`6N-Qf<7>mBji7zfA1u?~*!20A!y z4svkJLHWMX=26p{ZXOlcYV)XH+iV_nxa;OoqpdfO3hBLhR4B^n4>phL?6P^(y-zle zdOm&gsPDrzk8=IjF{e4xQ=J=nr#koYOLZQsOLfj&oa(GfNOiuuI@NjoTKtxs>YVs_ zs`I<2Qk^#!r8?)J1pIW#Iko(fbJpEU&X=EEa{l?%CFjPkFFD7VmN?JpSmJDAQR3VH z#kEg~^Q!?R&H;8M&foX389n9F1((j(F1XaWdBLUStqU$+HoWN4x#dNdzVBXiDeQRB zB~f+JB?Tqs!;3CmhF^4f$LXR=$Jal(*d1!-y8mc1SBvkOxz4}W%(dyy&0I5oY36GC zsF~|Pl$dIKf6v@?S7&qA6PD(#Wqr(DpPT27eSwnLJa_E7ALNeB=$AXT-iNtk4-U&6 zyU;av>{GYgvEIJ9V?+J$TVU>3bwuviB~d%Zooae}TvgM1<38x4b*mbtb$jNZbvx^U z5~_6@9jSGj6|HrEmiAwIYaB_xlZfmh4M?f<%EknEGJywWjSHoKFbNZ zqm~oa9JieC&u=X!{C3T9!iaxcPH;qNT5dVv7n3d%=9_kz@ZBF9C&Vt8Jh8}ivU~KT z$?kgZ$?ki6CcBT1n(Y45{K@V=uAJ;{l|I?MH%igk$?iLLOm^>*KiS>>z-0HX`!Bj5 zb`P9<|B&01mq*;DG&|)sCFP9Ul!NEprc{)=O$oZ`Hl;QtZpQ!BOor~ZP{ZEpXmR~Gi4dS+Swsdtk5 zPYqbne`@2X8B;&`O*?hH-+`$;6PtVdu21tg-zM8*U#D!3yYFXv{BE1=;Wr@LqnA^* z$4{fPJCZqIN*2?ohQY+6AiWd%sLd0vTXs*p zejW0}tINkvyuO|F#OqYh6R#PuPrS78PrL$AW+puGy0_tp*Oxg@yezGkd%qVE;8V0D zz^5c3z(=nS@aeM;e-8)v#C#LrbF4JLXUxq29~YFfWdS~xuLFFBo9cYx1~%}m|NU%V z)vCeTGi~o_%WUsyAAfL9d&2&nwuknf)+6km)-Up&R)^vfeNX$Z`S-ME7T?qUoO(}N zy!M{9Fz$%|r^}A`U&%V+KOyIczdK5otw;Pj6&~^5`Rx(^<0U9nNBl3=J?ekG-ckRA zR!9A(L|ygozVfmE{#B3tr>uMIKLceOO6lgu{^`3O`wuw$*#F}%AN!v<{n-EN*~k7( zuHf7sAN$|jZ>jt3kfmf7dK6>Tla}xXZ4w0*BhnlOucTWk6u@Q zkzRM+p>d$Y<%FOQuO|d)9wY?K{y8CNbKRvuZtpD(a!@S|y3uE8(B1w^gMLQ&Y2eZz zKbNIJ!`+t#J)SjuPP@-@f;*yAZO#ey+L;p^zAGpAYC%qL*0CJq+0F@WeJ&?B?nX{< z`cL?+GADT4uQ|c%nx{o%q2#tmi}+Wkw21!Q(jt1;q(!9LrbP_wlNQl&2#$?Qi)b)8 zEu!_bviYv5TDUXBXLbnO$T*lvBxek*?`>k+0U-Mc&wra@H;~@0ML; z;ZJsvKEK&Tnyg+BIXdfgRNpUNM``!Jj*2|=I_h5G>!=-Hy^flB>2=gcrLUu={Pa3% z^xfA{SD(L*y7l69R5?nE{!gQ)I6sY^f%5a{r_qmGo>uK~H?bGNV;&3ef zX>?-B)98~~Pouxx^fcP}-n;WUwsV~q(a&|>>w&KG9u0Dx_ZTJC&UIe)4A*&0d|c-p z_j8@6Tj@G)-YOhh=Q^+Z=dSZsc2dv(zOQ=z4V1wC>iHo9)$?!Jspo$;K|TNBMD=`+ zARL>mp5G`^J>PzrdcIq-dcKp8IDbY_?tIhs$L5F3b6zmVs%k;fpsEFb45?bMVOZ6I ze~hhKuc|@ym1RFhJ`LHo*cUH@|4hpS+hbH zK3g2RaLkg>g)S)d(?SkkBzpHV*OBbbDu z{A4Sbbi?;qC|7z5CT=LJP(H!&_fWD?QcVSugr7}J>N*Q1AATg5EI>Jl66_?H9699dC$yzU%Tt``t&(~1e;`hlYYfwD!edu@-lb3Gjzi}oebMdzjB?6xZpcJ4C{y)Th z2VfM{{`DQOi>Qd8*cL=Uz)(d&9uRs5>0-epSzyU#H|)*=0Ywt36e)uADoRm00#en0 zy#y6|4+$;Ueah3ne&_DlA%&EkJ2QUIcbMIs`#X2$&hMOCW_E-3t$X46pxk4ChSv{e z;e16?CK=M^&^Ft(Nz;&fH%5m;xcSIU^^AK2sqqX6K#NrKpEg=#Qy1;=#eADb-=gTLWF?kzy{z~e6}B$3}hY`Vi7PHr~_23j_V3c2ePUm z{#GHn0qMXlAQ$)z`(6TS-zLN$;N_k;KEMZ5x)*uWLldt6*8zvRX`%`c05ZBme}Et8 zwh8)aq=~-3I^a)WRbyQDJ8><5?s)wx(5i_h&fxu%*yaFdq1k;vlOJ$Sz!u;Pu;xb` z4=@y1_>&Mf1K;BH{n!RZ3-LLw`ADGEDCiRJpTTx{st`?q5Apt;F+wyPE5tBt%K{fK z!uh_3+#0Nj1FePlp^gwW>I(57@D@A#w|=66ku2EGIy z`wd_1k?upxd6V0t#%Qv*~LQC#kN1N5l9C<0m^!Dt!E=&as9TB5aNRdLR4xf z#C^b0;A@~-BOyG%I^Z-gqA`3H*a7?wq#TEScOv&+5MmFuld!!R*tG-oY!~7r&=aqJ z*aiOwssjCXLqB6Qk&bq~B3p<%D&V@{e}{h7#LPZIyaLqi3w~_B?=8fw*bV@C;PphH z3b3V@5ZSkB*r#9yI_ zPvB1*usw7&JQ?^I&*A+<;C)~*uH(T} z=ndO@fn%dJF%s|Z0D9r|rN9#4rBToj5C^z%ZO4M=owY)|iuU{mxVsgO1IPkyjEA;? zCx8)n-?TOI19%PZgV-LO506F;jrtk>fVR8oX>d=(u>gI52EgeFXlHDn!8RRu9jGx0 zIS+h;&-Vjup22wlFRy`qfHHV}7?}Dj#tOg;9A5`)FT?f?Y`b7PG=zS*DUKceVwb0d zmt&q1Z;fcV{EreJFw887!tnb&+=s(GOn@U93Xiw^|dgV!LvsCXN7Q@OnPb2uK9>V*fPYJ|Gv^ zpNxKMIgWpV^gm7fbcrUKJ&*hW_v64JU<=-dfq(G&G`2N13h^G%Yhvk&@{Hc)<)jf!8i|?3Cy}3Z3H|3{06)N)Iyp2ftP_NfS+pM{9n|>7~rAZ z=<|VG;F3M?ZhY1Q+oyo)d!a{cw_%$EtbPbS3;g~dJQv$Z*mec30X};G*9bU(*Tb-_ z2mJSbXl;%rh60O$Msqb>a80~}*KcFH2p9r*p43D`;2*qRi0w>xy1xwk?t2_tJ579$ zfO@x~zXE!0M;`{HZ`H(mz>WB9$rfl8=nm}ItO@){M{y_iErd_wPX>wBe_%}U4!q}W zXdOtvYxkSb$r~6qV*4l1@h#*9@EuSOWj5inI%%3ng%=#gc?@WQvGKL&b1G`$CTu5G zfChoq*I>*62z)*WXjVxRpJV?Y*e(JZ%|%-v500bXo;5{?H-QVG=~lp3lQE9O`#!+W zlfVz`0`9=)!+@uO=SOPdWLOimu}uPM;B|toi8a7byj}-n<8?LQ+Ys^`sPr1<8Lwh& z01UAgKy%=pE1*~4C|-Yv?ZxGB zow4-;gZpS=Yj5NZP!q2Ow$pkce}IvAeGhOLuPXwd-U~kfc0rfB&cN@1c;FG>tz3+m zvF(fPY+%i4O?ZJg;A@}?KAS&Hh?Vov20#-)1Kysei3PwNz#mU)VlcM)Qy3QmmjOpn zX8OZuU*HwsCLm`J`a$3_ARZVE40R))fwS1Z9NX64V}5W3V;*2PFen##1dg7@TnXp` zTm-~n-${JF2KZqQ_5lrmiZ3D-cpuof7v2Gs+Xr3l$MwfH37Cr4i++P{flq+S|3!Zf z%m;e?j<&}38f?2m3z^u?0j|XBQSh*%IK~s((Y`z2{lK?C;}Q(1_P zz+=Ep;O}eUO_hYW6L<};X9M>ES7YC2`0Qz55w!OQ(Elv-3tam@TqEEEpy8hwvjRQ- z(!`J0Zo>A8|HByYa-9Ec%&~zxf#JYgv*1a98>kEX{)C1KF-O35CNKa<`WW6l75VWG zeE4sS#eg4xzyCtc0qy<|<1lP*2fq6g{TAL=!Tt}hJ^B;I8St4zU=#2-kU1D03RJ;s zH@1_3=D^Qr|H{}t2TYoSd;o?4tARM+YT#px7xw_a0%!5Q5`5qbY!3q0zXN{;Rsc`F zjd36F5%3+}-}WxJ03Gv&@3DOjXn@zXJ?N8xFA`Bdj^}!8TLD9X7l0>#(b#`4umX4$ zXwej7D&Rxlk-Ok`K!v;E8Ne^VgTM>T(7wPefVc za280{;G+Uw0=$FQ*Wt6fuUtcllwGQf(9;DZ-p4u|cQ z3ow5LPN5w};ZFbEXzp3&8g0W|(W@z^K z^6*|4a;_?_5%5Yicn{F@RY=iA=Z0`qB)?e8_yG930@ezF_-o)F z*xm{Jd^Plr_m^S+YuGLrD^Lgey63R=l7cby&p6(n(ANW>0`4Dh4S@Wc~^dWVY<9L9XzyaU~z_kMNAs`(%25bkeU5WW4;QmAtliI^$X2MUl!8^C& zys;et48iLiTd;Pp8P^iqEAYN2UjM!ceK>GGKD!skJQ>&v47?sb3>*S(1AfG3v#?!Q z1^xxZ0q+2b128`CkM;zv$Lp8-!ZZ3oquAB~zUhO$4Dav8{?*u?0ph>FoT@L@AAlSC zVLbp?4m=2~?vK6$Z~>kHXh$Fmub;(s0M2Xs4CEzH6|cS1p&8&~pds+*G#oEb9{bw? zj{xspP)1Y+`T%o)^<~P4Tg#RaIoSGudce={h0pNWGT>pL3w(V@GR6;p+lMg?ussQV z5O5)|X*kwAfXnc?z;?YC+5+Af0?iJEb^sl?2Pgyd$LBW#vw=5<;XHs_fH}b5wQ%f9 zh4^I&v;yn^eqW3_fmEOw@aH1*ANYJ9wvPfWfC+CwyKiDYwr>OL@OltX3HbSSAszJ?*RNC*awW-kNNsO^a37Jl>}%-!7>=M9FJV*4=A za1i<^VDv+pxB)ouAjW;z=HjzX4{PFC;NlY)AAgQ=DHxXmRY$=zdZ zu?*U}^*4Cu`|w)eYM?u?;0Syk7zlg_e3OZ>B`^fI9mstT4K)wz1Hfe9t|ze`0PF|0 z&V|Nub7+@El+z@Fh^?DrgEg0?Y%- zUyU&(aLaD=$#LKYIsuOWkKO@3pfYf*F6LjrI3Nq}w*Zw;=8wCPgVk`pRpCiMb-cdK zg|Xu;XbWtg#I`e_0lV(YPZH~a}-^MsLgtiT0 zTrmQD6Sm8N@9^0iV4@Cf05!rGqhtFzwxfV@k6`{k7VUy@f<^q%PUObBS$M#oj z#{mBUb^&jFf$_(e7;|9z@SfVKeM#p{2t zZ9Wm>LTo1iPyY!mr$dLpeZb9W&;&3Vcm{YM_y_m~`?dpDOhDfOJT?Mj)f9|7fY*Tw z@xC>17HASgAA#)|Y-@+07i>eoE$CM+odb`$7yB@8I?xt=5BvkPYKL^f_Rluxzks`e zJwV&`n2!OkV1F7g_GMf*peOL&OBn9}&*JqOZ2vfjYX`goq~iUpKzHDUTQCp18Et`W zB^SovH$qc4;C=@XxC!2feRF}0_`E#cX9AVmlo76Yk%<4=V-nyK9??exL{H%s2_gyq z4#g+(f3-?0GzbC1L`YPRy|6Csi?wh_q>9P06;8wvhsBoI3VU$GDdNl63J(!Mv&sl<&bC#A7U%aY^!=5w{B~cT*Sz<&tfgAi_0&HiB)D<(^!f!$NaGrWrnSYr6}|3 z-B^k;yTrvYoECGdUMxkKSt+p;WnOKJt*FeZ6R{L!PF1-ihSOq3jYiSdt>Ia+r%c4Z zez;gqSX%(|Tn{=x9lfU;?`5wkb4>1UkN0l4n@5a7IcbCILDShfjggsO+DWI2YcI9! z=wya>w2O`^NVkiQO4)B09o1C!GMn0tiu;dUbW~-EU366LQM>4S z%UgD)vV?P+=go#OtzR@7##DX{VYS*|<-&szoCo7Lxw7F#9~Ht}Mcyfp{SwzU62%87 zjA3DHg^jHL+I)~MPMQsp8UKs9Am;mD=7N~*m*CE;iH2aVS27pGOs{1wh3(Y@RM!$~BvhMxOx?oiP<=mIBZ&^MDp)!a z_CM{ckx;F}tdUT?TS3yiI05!TZ#4od4>G0nVif!(2-;d9FjQRT8e52TQPU10sphWM ziKytXbt0;Ir*$GK`zz~2RQGKaEnhV%yp44ts(h4nA}akkJBVao{HApxD*lXhBC7tj zYfBiB_J!I#=z6y2V#W_8){B8AEb*BW`m?kCz=bQBA1#AqWadE3!>8Y znG2$-J}?(V1$}ESh-x`wE{Mv|Dw)a%_IZ`f1u^4mn+sxgcSBIaw#eKe$lx&MS+eiS z|AdU(7s7&G5c4p3aD0~GVT3g^A7*6yEGyx<*sLBdRq(!QIQ3Arvf{Z@8Ld>qsgd!j z;Z)0B)o|+O57lrgsL6GTO-C*1>fy3)S*#jPePybKQ)$;A&bp~P!(Ivgir~unh9a{e_|$t z8UKr!5N3IqDkiQz`-=)@LYU2U%!Dw5J0qmFOiOvkNCyh`6m8Ih_#?M|1 zOKioBOioe>)5Rm^!(>L!G#kdOUTrpvnfP~4qgOvTB} zcuG9~H>$3!idA^kU_+&MS|`Cbu&k0urH-*iLanZ`Mnbi|W{re;&9X*9#g?sR=@L`3 zE^8!IZBJ_?)a_)eBvQHStdUT=8P-Us-s2$Y*A6Ra@)m6n&oOYO z7f00FfedmTdY&$}(V9&IVkY4kveS~zGVR3l+rzCSozz9jM ziWhbmV+8jG2pShhzyVcqh$N7+>Bs${qyq15OYd>MPsC(F$}iz{v`vl2l{8(QfT}v6PC$hnw?ZJ*c743^RiN@ZsuNI!(?L+HJr;xc6UXwVc_80C zc)HzW-jm-s7G2P7tQ6(wnf~bsH z=7OSXFc(AxoHiRIv;N99rkb3Yj^BVXlY7kW-UzB|%uVEDXmVA@hg_FGNZKaySc-ft zf7;uFA2ZNJ5&{~V2{5vJnOdMO-ct#b*?w_b(}&88Z(}}?SwGr*AT$3t^MTC%9P@!x zK$Ui;8;2?wY(9`mSgjH$)sSO8kczmqz3FqLDn=l%wvpugAwvF!z5F7~`9E^M6~!CI zUffW`|5UO^lhso^k+S%kmGWVC74P)kuF8IS%c|W>YaCFlQJ6*-?G_u-XdLdnGD6Npp*l$WM z#Qdz@wZvm$Hu_2~#N69lav^5g>5>aEuWsp9;xRFcrj%TWIdinMLNY_jbuY0x=0m5F z3-Rhdi9%J1yTBpwHg;Dlez%bUWqZU>Oc(K`7n4~quC!vzgF~eiV_i~@;R3wc>OE_8k-3)vgb9mKwX?x36vRjWpC4m%A9LvK9E@$HXq2mTxC9x znfj*rK<4hR<^!3{cl0scs?6`fDuFWN7nu*F1`e4Iq$(=*#Y6ToS;$)7d!71D;> zH!`wEuG1B~i!Og+Y6u|juk(x69YEL1J~~5Dx)ZdzSZP14RO4a0X{ps;?53rXZ|-OF zC8N&owVReMFx_ridcbI4mfQz;LIb_7Le}fgMEBfeu+GqUT(EpXD~9%e1pjL|;j> zPDCfkuueqp_|rNO-QuBvmK&S?u-XnHIUdQfPDBs5@qWvvM%C-35fvPv$S*L;(TV)3 zV5(?`^MfrD zkUxSf|5OL3aCr;<4}kh1XQ&P5?VjLp6}sq|=x7zvb?bW^tb(39c!+~l&~Y~ob+8Kh z?JvU|tb%U)pWzNxL9gwRetDw(T_d8mJblG762dkjR&Pj2w3OekVAnvyo z9HYi#o-F?;z5LO5>6{^PAcV&TODkl!-p8>Q*2S4v3ri=uNRR0-=qaw)3ez2$$5xm+ z9~fIU;wiDW!#l#E?B z7ro2KtjyAi=;F?iC9=pYdZMHv%$*xXmB7M`*-%mu=1Kk0C9p6%HkVX{IZ->c1QupO zPDw?0{U?tpfrV@SmByA(gx7j{Nkw>tJ3fN%uot|HJ#d%Z_;LPzk^6`8PtoLkdF3sH zG%*)qWJIoNs4mJss#L4YpgUATnOS{RLYZ-?Dxu88RVty((05cqnYq8HgfgRV9;a|| znCUImLZ$EdRYIwZ`6{7Q%vT7lQZW7Vf5qj($M8%`@w*Krbd9ALzRgv7F`41}ODo1~ z{;jlP%-jLvOF0E*>6+4tF(ZF3tr)Yfd0HuzGSgO+R*YHocj?7s2K7uYrBY_g!qSQ{ zGp?L~CwIF>?^B$AL$cs)iI8{z#T&+6+{m01l`vgQF&`!~Yl+z~X4*?;!C7GF3%!V;j8=DPd=6cPBF_UMT50ja_!)zEc{XMf`%>17bR=4O>9wg-F@>?A8 zNhOcyi`j}#l%IqLw9Et;+3!*d)J0>JK&gOs<^!pLhs+031p)Jc)WKBqfmFh3^MTaD z4)cLj!@K4KsfTQpK&gno%?DBw6(^g{RjQ&H0rydq94JqdPvluJDIOcDsw; zsS96mJ7tzWTJ%n4;*6qqGTT-Zy^|TWt>~T1nwN{-$;|k$=$*X!r;FanEBse+JLOfp zd`gkc$18P9(K~rHnqp@Y`QyU@k%Vg^zoXBmhvi@`?-@#YjSBbFoe zluG+uC6o%gb-KdEp|U!tgi=uxR6?nwEoz}sK}S_WshmGmLaCT`GcfTf{Hv1%zc**B z*M=g!T^M~`q6i_ZnfWk7IZLgC>*96waH*glRKuyFTV^VrJC)Q=HJoaCLNz=(;!+K# zs!pqhQ(1REq1bd(SE_orRM<|{aH=d!^grm6?2nD=x-3U*g3 zez&2VGqDuI(^<1iWs^$yzO-V@_&IY*VPj@Do?A*WX7JI{iZN4DpDcxq8Ch{&DaDw1 zpOsdO88&r(DQvuR(&(vDiZNp{ODo3A*t7umVdSMR=)3v-w#P#Jz1EV87#T7;)}p$2 zHnyTNQ$CEPD6^&Fq8N^q8Ph$MqRg5Ju@q(Iyb()LX3y`j6lDh8yEul^ViwJht!Sjz zkEJNH>B1#38~`(_Gm19sf$!%Hfzu=a^4om{=cM`XI2eDFUF=d1 zml=9QHJn-dn`$^S`I@DQO~>rMTQ!^+KTtKCDtJUSoXS|Q8cwymt{yHGbVfCts=8vC z;)SEqx*)u9{yApB8+ZMoJ^pzt`L`2{-*=SXnjMC~<|=`P+7?!2&Cf5EmuAT zYOa+!0aZ6roq)P~Nu7Yo`%RsI+N-)kxe=+phtvtEztvUHDw_Np;XSpDxuWPB(+efnq?}X)XZ*`P%7p#gmx`C{pIg^d+>xcpNy3E4h#PhYyLlz z{4)sq*hy%p?S{3E5aUnBIzcRz>bIYmI$mZ!F;)J){lrlZSZDjiqeC>XpP2s9(|%&Q z%XIsR={+wwK`fo=wEe{NtqSXH&kDNQ{U9D_&4hYGz{xoI0M?&Eg;t>EgMP4c^oHXd z{x_=8#qZ8nBi*q228SDs-uRHy)zB#yJ6#QZ^Fybrp^IMmoWs|Kp4!;yYUr@3PFF*} zebM=9r2BsFbT#zi>d!lz0(9o_sHRs*)@jVk+GEWl00(XxS^tnv&`N#F-|I__{LKyd z8|iMmABs;C#U9X>X!vThh7n~(VO(U+aAgl<}Go1@J|PaWlKC3M!K&Q?Nyt+3tE z=Az4vcD53F?H5j0A|1E-4o91dzB|g0Hl(wt30UCBI`Lf7hZd5W_!x zALiRZBpqR;bs~DeHtR%G{Tm=E@i7MZcWSA6`TVR8`Zs>(<}-x0h)wT>Lk*>$v`V3i zzpPP6bzi#2!iiAV*IS{WqH9{ApqB5lLO~UGv_e7s4zNN&VLid59erz)96M6R5hu--u1l?^m$WZ0S>cP4=rW!1j_>)>NH7NEfoio)}UM-lq zyGbpWimRslQ5!A`v|Gn`TK1K!3k7aRo@{FX$) zefd`ohKPmfA}xo#jnCDd{d(y>DY%(qVer zNlBNPYbPb0=7^n?bel3C*w~hIoIZ9^(sdTvODUb_Gdn5iJ{3N+u`TI9Iw)(GY#U+t zkNgc@dH-W8iZ_hCxZxxpsf6L4hWRk*2sa)zd5~0nd$VCwcF1fP)w|Ga7!|tDY#3FT zWj2gTyX7O3ElD+XFdrrr6EGV_Rm?UU#>_v6uo?wZxh>W_wUkI0yjBS)F> zk>92HN{CkZ)89<6k>%5@ljvfLRT8O$53P|<8^2p4p;~VF+ET+(KV7YnP*J)y5^C&8 zYa~?N>()r9!~a<&k;<&{jiswYtv0bnLiG*;3GQcyq0?b_@>PCUORfyb?`g^YC;zXs z<<0WOAqbK;7i6e)hkCFsK2{Bu>MZ-M(qU7Tjnsmv#<6O_RN;$i!BpRGYQa=p&F_>N zjA|RD7EG1Bpc*XIm8}*`RaMSXI%leB41$YMQ~plQgS*!hkNno-{^DyaKFCnh$Lhhl z_*FGns;T_3VjHTY!={>Qss&R`z0`uKrWCbcs%ef|Fx9kOEtqP`Rtu(@F3VQBRQ#>k znrgvRQ!BM#s>zRFO!JHCW{gicTr8Mx6A;$SC{VCVGd?XU%uv)~E8)7>qaH3*^|5L= zb@jJuIF(f=N3rRst+uM+R9Av(IQ2D7HJl3Ds2Wa<9aRsPeb%q4;ndmH#}zLemDT{^ zb$dl-Yx1{20{R?PX z6qcr;+k%Vg9kCiB`@_PzZ#q);1s&~#lU2~^!oN9q7IeVs|8=kmI^*lk zRv{g;|L+c-1)cN@C##^tF8t%%l0nf9YuqvBa}RlcnXKkn{1ie-{#jh0;f@`x5n%1X z3W0RC3F-v&t!LB;=t@V_3FtY0s1wjpZvCI~Wu#xks}s--Qq&2k_4!r^q>^7$C!kKh zRVSbdtNba%10{(m{~shN{6hh4G1>`YOe0r0!?P1cKqE2!k-wUhC|aO`L?dP$D1xXA9KDUy3R+=S44NJ_kWHz9bIgm^A*wUesI1bx}xWA z$D5As`R2b-k#yPH|8e|`=*EvYUlCoqlF&r2l1#PW{Ig(5Iy#@e>jw9hPf+t)^CLk! zuwdcB_e=9nYYUbvp4M>a+M0v(y70&M;-MNhv?~}121)qUb<(8%N(MoXWn?ZL-cgYndLO&o?X$i%z}U8 zxbR#v^$N|nXQvWwINwq`Xz(nFbsFhpN3GJ(vCdkhp)=JiZ?TE#Km)DP&}q`G($G;h zSf!zJoVH3shq&!Zi%rZYzj|1uq2i}lrJ=G9fu>KvAxOc&O8$LCJ>X^heo*0AZ8nHY zoD!=N8*Xs*RgPAmi}p@dARQ#=Tm|%&=bWp6u5-${3g|~SUG3OKrc?ECt^#`4B9NiVP>KV6Ra2ItQ-> zdw`x!RzbIa+{r5F?C&^P1zo(%^$uPOI(ARETz?iAH9|-(V($8QcjWO?sn$*F`+O zL*o@)@H(~7leqc!^hU1p+iGrvwonT-GJJ|v3SDfqMj;jOxfKd3LfmAbEvS&Ytx!-g z9xD`7&;lzIRMajj6jaz5D-={*wVN$m5w1NwV1 zE`Rr$)Bn70wjTurOw0;};W!smvx!O<4eX(k4&%0iiq1064k|jz8+K69NiMzBhGwUO z++zn7ox^Jf6&>SgJE-Us-`GPX9inD+8=9TY;I@N`j_?7fT9+i}Hj$^+Wj^~c9`OqK ztU6s`1jZM_nOrl+Mbdg1N(a}jxg05~!79hU?BcGlg3EKyZ#UT_)WNl8!>EFr&4y6}x0?;40vebNWBxZaA11TEo!Kzves{BB%>0KD zhV|&;CyMeebl!I#^Oqco&=RMq#fKV-SZ9?&7av-qkV?6zwuKX+YMNQ0pn@K^LP0gX zXN7{wy0MOhwxG)Hw?aY1?Xp5a^<7@q!ijJscdr!+s`5!I6jW%LJ4zXV8S6lD4JiL? zuRQ{r=ND|@Wu)Q)4RubnMxcufD+E%Rf2tEibs4AJ22|xNbpmSgOLYP&vQ|CiQ=lGw z>I78dE9wN);tlncPk~D8t4=^2E>S0-3NLM-iH;?UDImIGjHu)3gkhLN$tM#Eme2dW zj}9Q~S#W2;FM7x?ZN*Avs5Q-gQeEt}n^da$n7yP_dfkS$wkg#=*;Z_Tkt`SxVr8g{438e$7kLeQ2q|0TnjCzpd3(?c#pMo3PVwU+C`;{EAF!8 zsHEaSB%k zw9-L7wVRf1a!pg4+m_BUz;0T)%sjhk={WD$O-uK=pqb5WODF1YH!WRhj{UUKpiC==)U;1ko@}!-q$bA3$JX6FZSjSE6EFEqcohbty9!!3}>jN3$As7njZL#6V!CT zYONf&jP$>UouH=sEpmdI-gm?aYC2!dcn8{=zBj@dYB}zE&IxLI-giz=)A84pS&hb(}8MEWXMrk)`81N$D7~;H63riGt|=Y{_6xa9WSn(18q&mO9S=Yu@1`EcW*356 zsRkP^_J7t%bWyLp#UqiDe|82E&VmoHorUzuQB$;&jpo4V5qW(Jw&<~Z3mH5=?d#aRO<)UiKyDk z23T%vs<)$cBC2?%bt0EgKX2Yn6 z&&-BV3$-3Hd2XD~`OStg|Cg8zW9DBx2>pnhZW-S(?}Ixu@+(2|ySMUJopjL$$s|*~ z9p1^mP7oAb5OlZMAVUSC)Pr^LtZJ}S#5-!i)Wu(F!Boec4=XhoH8NN&m`Yio7EHao ztQJhw{H7L6?KE*KH5e5%Of5L7Beh_v=`#ekC@c)wbI9HD&ppatY?OZ^Qr-!bzjKm` zFWbpqWOYX;SZ+~%FrK2fMqwzeiCt8>7-SEXRN-VhsHn+xc2H5FU)e!Ly@2x($2#8CWCs-e2L)uU9aRCEuOP%3zaN@!HEDxp+pogoV6N=51_p;X|0 zl~5|K)=-55royJEg-S(zq7q64)flF5z*NjCgu04Le`7ZGB?{Flt&pLLv#}S}MFnq+ z%rf)q##WfQ-afX%%x-^dg_+OOV=K%IelE7c%-L6CE6gnYIkv*g%d3XR)Xp5y)sC$& zbFX7;g_&)kk_s38D{Qk+_`J!IVdjMk8`<}<`5;}ml1$blv++T5LCngv=7N}=<$b0O zk6AjzToAMMpt&Gs?N!O94v*RUn7JTkakkkY>8pMGrVfu;z0+I}v-^$!{%T2aHd*lR zmW)KvVh1V(iyE0d-)x93wwVi&S^c(|5a#p=Ga=0At5ZyzKJ)obGa=082hD^qmnWGC zVJ7c26T&<`Z7xJ+aitL^T8uf|)=UU9cr-$a?dauAOJ8Kn?2W8gJ&D4_`g7sJMiy^3 zAEb+q%m&F!{?S|zbNPy(sdHjBH!&B)e0G})Vn$Cl7sQ<2YA%Rbeac)A^SW}#RO@lH z(au~Db9=P8AZGU_1f92#+7-Dh|IU=WUtf4oA%Dq9&KKp%>^lf_?-6%^(LN)HNN+SE6 z>Z2_k3Dr8o8VS`~BNaDzN*18JUosqOl`Fr-+%*kh&CG`xiha&XxGs*Uhf9_ItQsEG z=NQFvr!u>#hEtOhRl}*q7gfWl!_%taRABwFicLrDjZhDls#~ubPQB%*hEr*EAJIg0 zDVZc7AVw8>;wA6SWM34l8%se$P08j0bTP?HfK<$~*aN7M-LVHy6(7VNKpp%LdjK>4 z@<(HCR_1!m*aM>dOY8y6=L9nWGK14&4`9x&h&_N=`VImLWT_wP`f^Cg*-2iO<`iZw zuAq^n|7R{h7uSv}biqohL1yV4u?H|qJH{TsEFBzs0JC&l>;cTug|P=POLxQ`z$`r) zdjPZa7c&7eOUpkN^MzxU)`>lUS$aPLaF06gk=}wo0NVz?AuGo#Ns)V0LosTRPkiJr z9}=TLfqT?eD2&WrU>B7x_Sr)v)$pwyRMg3(<85dwDyWeiRMgh}c2H4u6YQX(9@pAI zMWr6GgNhoyIL(GD$d!dAc2H6GgY2N9Bg_R==aS?ch64oQ3i2;}$!Au2Va+Y?uVBk3 zj5}bjjwi%MV|x&Ez3ihioZ?$2XmxQ>y6s0R9i)!kv~-h!cGJ>XCfQ9(msxK&Egk1Q zyJ_h@C+w!B6J0UE<^-cFwYQ&Ejz4s}Y3Wvr?WU!3y$agK#am6DGs!aY$=0@l>#DyZ zu(?X0;YQ^rS|Y$V5UmhMhiR)$KreYnoq(<}TAhIY@RT|MonVtX0X6@+Isw(4qfS5_ zmz$)VNE}ntQ751_JF62=g%d!48xh4#2MRBB7X84)0+4jHN@A#Ur+s9&*Jl@*RP9gp zkWs-`PPV1ZsOBd2kWtx#>>;Ddr`khC#c#5QjOzc!9x^(?6;o`vnskM`>>;B=cK?miltg7X$AwdErqo4mdnu)hEVYx8Uh=!0lysDi zkK5Rm^pz!cQqo<1v6GS>(|?+cCr+n%%}z@CP26-FkCLu4$4*Lm&kuG|(t+GFB6re? zAFt%?De6}WHzB-rNv>0JxZyOf*g=C|9<)v)9p#u+8oJ0OGcC3ao#QsEG<1uWR%z%E z{jJi_6#`ai=mc}E(op>yt<%W$g14;FP~|7A(ooqIo+xoWAWyXXD|vb2iMj|ZVLhPu zKts(Ptr6(LZ-qcAc#b*&wfl-X0abfSoq&41be8f}pi<-138>Mo>I78hSakyGa;Fsn zsmQO?38=+?)Cs7D03bulKkq7k*kQk1&b z97|Cu;H_ASGS|P0r6{xduULvQe=E$1pGli=`;@Y~bkgTS_VNnZF_ zasGo(I7SXS6Twhfn19u{`1=f?AmkD*O$tI*YI%Zk5Ea zq*VLJbn%j1WYUWMu!oE`)N`>dZAJ@v$sRJ=PuV5592u>rw>@OEofYX?YRhTT zZid@MCI=|n?IEMh{GUB!w3t=Pupnzz=zU;D@^Lhe_!Z%;)x!;ksIc4y8ePO$r;)DE z*(weFAYhe-PB7al4Lx9&RT`@Q8>=+bec2TjFE|z7%qk7F?zT=NRX)Wk4fVazDh-vL z4Vt^nO4AVJ6)Tm4b1f1r)bh z>6|H>k*dK`EN`j>QzGS`Ryu47V_wn0VT`1G=-BeU|1G~kD(CF-mpD^J7raUpA0fDi z(RFOWhPrNCW0^!3eXWv6wav9gLe+g{jfCp!{EVeGp$ea}MnX0IYK?@dZ2qjJ)1f+7 zStFrJwY8RxgmdMGtdUT)Ypsz`y^YruF()>@-`y69mFd(STYe|Pi+8%1fuQsH!qS2a zwZ5w!tcxqxE7mO4*-0&!s$8HJOf~*jEto32YlG4`Q+*@Vf~mSqYQa=nt>=^un<|^B z8Z7(5V`{-vRki1p4x4J4h~Vah2Z^1q+B7nDGy;(EZklsMb@~iKyJln=D^7s z4x-57k98s{{d4O?RQ=7Hafhz3Xl0+t#{iNs>eVCb%qfxY9vUO!M9~p}=h;OpfriST zutuPZx2zCIRbRM8`4p(;2h|Cv;!WxVRPXQV1XOK@t;%gcwWg^PP^EvX6HuKGZBsr4 zj%atO6HtwpZdX16s&Ezv;tH#?=BmtDF46gprR3M+HJ#8(Goho zXag0^q3RwRsAv=4+e0P0@%ejgI4W94^L;i@(L}24FJkmxvWeu~y~#rGd5c-G1{*H$ zmvs_dR61bsNTl)`StFt5@3%%mwNJ7}LY;54MnZ*uWsQW|{=*tcbb5Wz(j}&zdsror zN*-&Cgc^Rz8VS|=8%Ua%>x>QAxn5EX#mcc-sFc`Ll~4-n4V6&J>6Vuj&Xpn>p%O~z zyrmLK!IXbR;eaWVG?h?_<3qJjDT%u?6b_g|NLLAE`jWA(&=L7VcU*QDsaTBHqlX)tzNT3ZMMYeE}MbhZ+j>jq~lq2-qQz|rQS5%+Vt z5^2wKoUMeWeZ<*HXyvUw#E-VwWsrGm9n(QO(0*FOaW^_iuZuUGqn9pw%qe>Mt9I0( zwx_e!af+UvdY@DDbklUF=;@;youa3Mo_30!-dXV@hcbsZff_kQPrrP~DSA5Pe9-r_ z%hC)Z%dnqR7rAzmO4GXPV_Q$3R@KB_QW{jyUQ*i9CVNSvGh};7X+hV0V(W#X@jPrV zDeY#F-K278_PV{Kw3dJDC8eRX{IrN?D~q1^%7-UCSfNW4VFaD`Y-MRdhTAMw57xyY z)nMr!C)9%J5|utvI%m2;XSHCe{!z7Hs(YJSFjah1EtqO`eXi7CRHd#OEY-J3Eto3% zL@k(Vy8a7IXw~8q6J0~RK98&B*!qvwbm;+CiaR06J=EiJhwxd0M{8=0vbRjmd1}hB zy*s}fzZ9ju8^7$>{-wuu?~!jC$hSGW_GV98nLTyO@paR)_sq(kF-fbF^VF8?)ys1> z%*$CdHA;>G*;~?1JiYAL-e)}$ z6F)TQ8R`zY+`)ul-jRXmVYq!b#}Q$V?r|jqlI5rJEbGM&4}^73(1o@b;zfD9WSh9d z=h_72lVwxMfV%NRhkC>Qp`M@&IM;%1SvX;sM@LhlxKX-8)`a<4>8rBR*JMq2E=ru0 zK9^jsth9AmX$!K_p3RytCu_oltn{r}6ZU1L@6Jkl?!>|UXxqr%16gT{w74@f)}2XT zle>0&?t!!GqydFK;wsKG8QsT4{y$RlcKhkU?!ugslk{W@6t=1}YUgm+!t(jXgw`K0ld?9mx z=I+cFTt_D2gBS6^mgtqr+~&$Wh|l(9zHlVng$-Wvf@!zoh-%_^LaFZ1p{@QyTjhbt zYZGZ@SHR~Ex|3XlP4D2kjtSGrMm&u~woKQPAcJ~Y#xvEP+)cu~g2B=;DZzj3Z^fx`#<8S7oc0w|-W zMvtj}H_xzOq9?3-kvOi_o*|xLJ~k2}GIkF2A@w}2{+^)jiALPfCLm8W;BxcqjdSkj z_635TkSiq+Id$Wt8=|-@4*^HYXGF6t&V>L^I2Z|F#49UHse;Yw^?7Bx27=yb@#a}+ z=~-zLv(k`|_;*8A`u3~|%d;ln-^b52SCfjbUhhKoo}TuMEO%75ELl5WTA_6%wD|#|@ zTYG%oV8}bhl@v%0>&CJ4@JS`W-43nr1bv=hwDcW$*&j&Jp-`iIG0A^&{NpEAy{MA> zC)0MHTsi67mE<)nIr&$)l4ZIFLV8KbUoT(syL#{>B352(?)OMZ@MdiHM|0V2oN_U_ zUq8xeBJ+Esj6qWxVmVhqF`3`;yv*N_HDN(k`mU@AYmxuwnk@F@&t3RJ?xcmWC4bX` z$?tXrQWA!{V@v!VDH&@so{pG^O#E{vny)1bCjJ9OCqDA|#fX<58IQ!@C;j}$c*DSA zPyKr5Qa|L$SnKh7l8j4RO!hZy9rpSXz5b!Dlwe@ECn2g9*ANUBba!wl1_48Y?qtuX zKu}VlgO1ahmEz2>@C~pu0vW$H}S0V;r1HB$!-f3}!;|YdzkI$#aX>H+V zDPCWsb3iSrXcc3OlY(B;g1qX{w~Yw96LIR%ixUk=$VxvL z8QN@H_UAfDr=1zMd+A(RZyF?m1Fv=}EoJdpQO6CdBmFRQ3 zLV7SPuWu>_H3=SHV3cQgq(mg=kd$qLUW~2S&IK+PE|`o(s9RpKLYHYs=3Hp+AbOR( z=x@%Aw9+v6Ish&1$=nTD;>7{%+jAt{=#O0Jn)V)<T#BNbR_Wc@jNC@)T7wW1q{LvDO>yb9nS2FGgqK!z*Mi`@*S#V4PO2e|)d* zow|2GmsS5!?eY^FpUs{#t%x^Q_wCtZV2@ti4=wJVF_Zfvp?!_e3h{0Gwd>WVUH3Mf z;+x^ZVT`C%jF%sE>fO6tw|3q8L+O{9pkbAD~(YsHtf$a|O zZP&e1JAQOod|qJH%oUj{Gv{M8`*ifxQ+Pce9=I@beq7{iF6(<=e6LOnt=Pqr%A;~& zYzGqx`xE1|>vA4HaBTNXOmj}oE9fXUoZEAJ$Lj2T^H0uvf#K3SuJ00==EzE1e$U`k zpUaPt+8B>NPOIG(Lh79`%$Kn*6oQ@D2`(t14pgs{gC zxx0{y2|o8oIg&>6#c7q>_%IyhoW_e1f$&H-#>{cr^=*cE&y~Xo`Qa9Uk#5}`r`5_z z-v~`cqq5RwoOpJ6R@$1ZwCP#t(;@@FC0XfD%CoqQ#F&~$5#??cmu8^UpQe*{!UE0vCXi2ML>ohj z!6gS|m~iZnx`@+mkmu`i``yD}J{U<2Mtb_)$?n8MTjR9LWHZ-Ft=Ii_m!_r4|Ch~K zxLMQUHEp<77JZ=W4-PHlwUET_ zd%8m*bc2aFkV~>RPd>gf&3LsMQyuN%j-HS&Adj+($L~i$9k0u^i8L@epqX}2Z;yW%sLDf5 zTOzi!_s9%cw5L0WIUQbA?dkKl*;kJA%F2R)(W$P4Ae_gqdoiPLrd2wzc~{P?*~bnn zIkxxd|@`>lB^K)0vNYsf9Gf!-MyqR{}KzE{NI3|xI!-UK`%;!G5 z3fYV<*p;ydQ(;dt?Vi?N9fczOsK@W>jg*Y=xc$iA&Jg;WjT}Ho%u5lN-$rIbBH#KEqrC3K1h|qHU7RO4$^(aqv~n}8sytE*l=zCn4s71bq$u2DhzO%;ou8qSiann<3?Kft@(27nPa=BAKSAhd(J|+ z1i)mAc>k^E5)MmOD1_+|hK48%gr zuAM>(20cFHB6^LCl|~nPW09E{nV6yjZkY4@DibLfX{v^BuY3csm{RekB2y6~E}m<# zNto9hP0S==WY|RN21d>eMmOSedv#YyX%{)c%lbki-7z15(OrIg-nyKryRv6vq@!JZ zZ2v*LKQVq1-XCAL6(3dVd-#AC-L1zLNVN%$jxL;1*e=UQapcz{z8|(pZnH~0 zT_D99!hpAZWVYq?gy1UC1-Vg?5mpj<0uMe4B@7FCytw#7VJ>*355+*8Q?M2sbPbDm zVYF9pW3A4QnW{{d=(%$dgOf6Z$`h8ewm7Y6d^jPDO7gdnzoy%jv0g_iu;V~)Cg))Z zm|sOABddEj?(P_bTL#J&vIuI;b&ycIq(W#X&)@zRRaYdKy@}^U{6W2s~k{zzxNKbNl_Cl;uyK?7G z%SE4(H;bw+hkz;QS1|gMmmnOOHtC+BxMI=OJdE=icgFxCoNSy5S1*PHypc2YB;a-d zh9`28TcABVWG+X7?nbX6`xChqZOngWB2gnVpL~mUnDt=#lYS%(-I4q^J#*WU39?&? z(`vR3M_1)I?{R0WJ+w8+hf$=_!T6FriQYKvY8~sfq15ET0iWy_M|y(VmB*idHhb2t zoTW3fr>)9fv@Y_&iA5`p?b{rgTuIZ782{7i?x@$}@e0Y@y%ja5kIR)yP zu@fR383+z_LxfbPd+<=t;9vmD<(T|bYUlGNd;M+-Eg@1TrVCod-rZ4dt|8Y)~aSdJ`D!~0pLI}!NIZ0fs@n#mb!6&W`%Z5Zu&-<-dm8^ zyVm7So^g8iI;}$AP?&21Zqy)`2Rz!bAc*|g((*B;-y zv87hms558jgzN*$BZ1jd7WlOES5foYSa^t2>H5^_w%xHa)tF1>Cg)zsCj?ghucJ+&90NhRw zd320MTWa+U9y$4C76da^Nqt0`<&}eN;p~_SvoYMkmRhsC2pC96W{4M^?zxcOf$%W& z@}4nwV98GQPHaYWuPwC(=VIN#jFr)gixCsLIX5fp7luils|}6c!U#cLMH(_Pdw$%= zwR8Ek2u*u@=i(EqkZ#B|dAAQGTWW2i@i5(5$h+Gm2L?~jFYc7cWIR24y>aX0)b@$F zlV?W8@Jml^TS?bF_2P_{TI+T`Pcphi;)y@wX*spqcN7|g?P#X|DN zgkMkfhmq2UrsO|)k8EO(%%vlT z_Oun}DMzbfgy$<0)roeSu@8$n0n9!_DTkIEUgbZuB)>-DwCYAN8XM-C0Uz#MV|^!| z7_=HjDdaiE8_`rp%O?baK`i}Zu!#{LdM=}!F^Y)p=hZ)#?O0qg3PuMJQ6@dglrOjA z^87#!4zQ}eTi%*JFN38+$}yO6sOK`)$kT`e=tA3aB_R{WJW zJVdKw(3R{K(iq~jhtME$Raf3qlD%sOj~?&y;d05_PVKSGAm??VZXO+X_M?4pYKq5& z8~*-4+cjf1ok+B92hz9xs?nIX!iS#A} z1EIhWJqjlp6#h7}nb zarYU`Vv@o&=9QI6e($irNPp^ip=g{qEm;mh`+&Gw;lnTa;HtTjkV(;n`iO1|$AdmH z;K8b;--S^)HgQ@4=aea7tc1dZG3E`*TY0)SC2-#Hm3#o`&O+cQqE>Av7TIyvG%_Oa zCgT|rK0kvyfGUZV=t&7<9$!>N{X0e3^i_CIDYcwgI6rs#GP%-< z`;C!XjJUse-VKt`a(0Y|DfVF&KgNAH9jgg)@Fg!x*cA+n8Rb1RX$;0~=Qm0z)sMj{ z>0qB14{#-Ui)_$g-Q~R&*~iLskWaz*W(~{9jDcg?oYv*S&DpOBZynEDR}4-&$Qr) zhdb~<1g<9r&bafH97x1G`VLwy9w0lpZ27T0YmV)io4s!qo)E^rxCMyY6vx->IdR}g zj9ul-r*_mvqs8ZDPoJN^Ebd`5LY8gU4-a~<#w65;IbX6X=)ql}5f zb=Sy@{bNQ(9?QaLK;FN={BUGQ52u9Vw6>j+ql3#lE_6uU0*P3)iVQt@2csRPvhKki zcX$X+JJA!AH!`@$AcvbB^E+D#)*P{98SoGB;tn`hQ!#?X>==s+@&OENU17g$BHZK% zp!JMq!yLSASGHZ`5t4IzhTxQ3DV|_5rc-#Jz~!sy^^e5rnp|!RxxFC_ckn7P;KypO z2lr!|<{vO(xQHk5am-i~H7*zG#;tH2t8emA71pDp8Qt2wxKi1h51d$!$LCi^R=n|S z*rx22JF;g_%^IJEE0sNMiM;K>r^@65%XqwOsvP^RT8FEdm9{o3ZRWYLpS)D9Pro=( zJ}$Nh4>-)nJ&$!5xY2S>Pn(B(=y-JbnaIua#q)BvZ9Fr-s3BeJd`^-a!16XnbaKfM zO@rsdMuT8MBzj2`QiuCfljF3OMR)^J9FOYb85gAc|0C~BgRDBw zJkL1p?&>bPT~&6Mm#S*JPNi%kx!~HeyhzxV1OnNzFd(6&Y?XWZl6iqkE|2hIg!0=a+zdyeN{mMe??{2^qXRdp} zmW9oi`}sKGcVc-s+W_aA=JmQ<(&ta7{Pcz*_wrQxy>k1%#XkjcHptDKg@fHF_~&*j z9uF+6w>pdqj-Ie$R^qm(%kLJIq)Kw_T?+f*=3-{eTUf344RAZtJh+Mn1+8e>z;lQQ zdKSv~z7u4aj6e3u_`atu9Dn)JOTQbx|LDY%Cjeyn4Vt%abGuLxPwpDucgAnOaD4sv z`mGkg7sNk2VF@aF;`+Pf#RVF3?o2n(+T{b)RYR-EC>VRKlL=vWrl9><{UJx?+^(8M zC|;|OVxiz+f4Zcf9H&EV)BB*CRt*N(ekA)Z&M)@y3|uiVQF zP1-xQ*B}#Yub8mnTTdflTalE8TeMX$*21{)AiJuE{Z1gbFH2mBV@KZ>*_#xuEWBz> zee6War0__*HOR@X5ExXp$^nB{uGdD|@CuGUw$P=04@_)7Y>~sa-`fcI`2}4CgW~w- zVv-ABG3H2{sT4yrH_`11Ain?TvB`&@U^Ast_dhZDyZzvxQ_o$o@ZxVC1NV=M``KfL z<$Uzj_qXp?NbyPHizQU%^>;BVVJ(eR*D*9zLM3N+bppKXtDid^=FKu-iUw3Axy~j6 zp%kWJ>_9JwSqH8R^)d^d{~|%f6j%tdlH7g%HFgL4MhPwN2-Tusm@)*kcg#VZ3Y2MK z9`;Mj9XNU(cXyr`qfPbh77P0vfA>-PqJSfCqOmvoG1TMfD8Bm(lf!Rn(Ag7+#HBd3}zS1TfdAqE*u_ksrF9f4)uhxzApH6SP zaAJ3MLraVK_WMb3`(+Olx16^%@%nEko_Vmfp=?(!DecO>TDC7k82>=nkHcxUA&K+V zvtOG&x{@rOX0!THS>CGbkFL}&G_^Cw^3b%I?=Ed-hCbWR!T^k&oOUy_Hsd}A6H%U< zN^)yqqazzaql0=VW~XIyT==b}ogWwXzs}37d)ecbyvE_HPFUhvy^`J{4Pa#@`EO7vuQ zjff$FoXHb_3`Kcz{={sZ)1~VzZ(33iIIC*?9J?#)ZKTcG+OUuomJ^zZjzM?09qhfs>b?*yT6P zy0mM%ZYt)HPV5@Jxa&0O8<)2oy7aQ=l_lR%4rw~F1|>emQT(L#SVC9h++JdE-2^s= zm!Eyw8=rkE*>{|z%WL&sVLYq-{H1ua)RID`Y3Pc7pVCL|quebUk7|QI`;GJOX2;eT z17I38e9{9$z(R<_r{vJF8gQ}pE4*yJSN;|Ev$bHDI|k?GWlYBY6gY{aLmN7)X;Uf^ zCPL3FV0xs=1_T3P%a-9?SUij~0QbT12VP`60RiYtAKm}nMoxLo_iYzrCM$_fzM$c~U5(Eh3xA0&iwLvoV+^ea5R!FJvPJH9mY7a5bDhMH8PmDde zOyPW15BR080CyE=A=4^J|s&JA_4-mg~OT?U4I zIW?`H+l{BM-rvm1)#*aKVvHqn? z2hWf^L_(7NEUl9Zuj<17*T|MsM)YFt*M+a$gEBB^8Fg86Xow-56g$z{y@t~)T}Uoz zANZK+3aQv=($e;nnXDi)jPI- zP#LD^Kf0~I?x?f@;_yz*jlCx{!R9M zKo_Pq9g)aa8+lS(^38j3gv&}=2M`%&c=iNvtdQf$uX>0CfhDOnm$dGt+2Dxd7P|Js z?0GadONepsm)3w;ISyBd*`9*t2uim2?nR5p@)&z^gz*J+Ja4$#PkJ&L2L9&4D*^0v z*64wNj(8g4GDv}z6fgLyD6WUU@%7MrV{v7Cv#>JC&9$zNZ#J!uw4>aE4%ua)`(I;$ zBQ+A?6I;hyvNEWgu%a&nwJwkiJrM?hLH0_W-_9JkSmq zd~SZ&;E*XK_mzDz5*ra`^0#(-hBe4C_XIngeEC%A6iPY@UYG$AuIah^VKP<(GNH0_ z21%(%I?k}rwOQw%%TEVSwL`zk)9>Dh!}CQuGs4M0W?W1>`u2Ul_*MD~#A$lpJpY5K z1X#eo7yl|<+~B{9?7!h>kZpPbXr4bYzIp%Ujr;wdJOEzLpYY%H&zq9(w|U~?Q}<8z z5SRS9xq5CM#*4b9{~`y{wfHwWR}mEV4uWv74%%UmT?G86XMa}pPX4TlwoKAXdm%Yy$xHq zhuJIK!;ktsxl!#*?bHp7tsIE5N9^A`Kec@m(7marp77`6lQ{94y`6r+T_(1bV(+xKzKeX>h$F(+=@rRCg8*nX0Ek7A9-hlqfFW;0b(!(S} z9`>j0FPt4pDg|1l^qkG!hQbP<{H&Gmck_LKA=TQ#wfKVld+=_Khc$+R)^0X z>Gx*tikHKWHzhw20LS;F9joAUs$EJZSYGP{Vj=$_3p7&L^pK$31(*?y#XO9`1QC79 zeB}`sZ%vZ{f@5O*={-ssk7PCiE}KUrztg!=ZVKrLEmSw&28Xuu-O#|rHy;meL`z1U z_z9vu65jNgL{`e0-2Ah(1>vqZQ%eI44%o%jb-a+72V@{TE2@)U=$tQDEI7cxig}8t zQR0v%N&?&9Y~0O&#g$v`%sE|!=ft1m2@V696BGXs+rlA-Rio2klVWX@%pP_ds<_~{ z481e!ROR{5xSMOU^ngD6UbKjk-IFToLE!<{F-cV)QU(N0QW5gR2@MUBoH%x1H30xF z<*m?eC0SBDV5)5yde90xSJ5`(K)dGgD0ppF)@iq}PS&+j@(2UD<9XRnWlkSDfCOmq zdX8=tED}t~`VCDF$he@fNb!>)f#v;3{#`54Pr*Hkl010`5I>&KXHHKZTHj3nBPH4y zfTl~sSh7?)YIqf@@y6?Yy?^+UTmE-R&?B*G$Ai zM5-RB{O{bVr0?`v?Nj5USXUoh#kmreYUV1@QmUj^qZC||%q0z+>~I1R#4TJLwA}A9 zhWLaNQ=qZ=v)}b+$2XH#GM&Ser<|A~dusmD#@UAvwjrZ@>}?JV>u~qrxkK94E<`Yw zn)*FAy*Bpx)`bHh1~bxLf|L9^ca$_WAY5BWO%Go`ZFXu_^4i-#-twQGRwJBkzmc03(!}{bdYJN}d!DNTa(bCLPajnHh$g(e{R)vB7 z-Y@g?`mjFXA{nv$T5p}|I6yyKn9mH+4_hXvNP<}xf+0;kjSv5n#H%CN$>e(bmOKA8 zA6{gnKv~XqAA7jPYa3hoLDL(W0w3(t@J*iA-!&8;{GRVfc3Rw%tlOD4<+W_eANj^I z#PNsQmU{Y!Gi=M$y_W1sYn)Y3*qwTK!AIYne5Jlyt^73Z&pvz2QsnHRyDuiqwHI~amJmiH!W^{(+BQcnw@6v+7v9RcaAIv`Wd(Ia4xYGm&kW< z^8nz4%-6(?`CgWTRh&MJ0UN^)-p=aA9j)7$@MUp3vxQ&(pe0hmYhVt1`<}W7 zUybGR*798n`^Wc*>@0kkzh>4_Tvai`U-)`rx*T2uL$o+zUB7xMZRww6Ym*EWZdC?w zJv1mkiw5EcJ_Hui-)B}TIUEY^Yy5G&j6XVhakG0_xRA3)B-fESKDEi1`zA+^LD4t$ z?0U7BIbfy^AD`NLxXd8&y?M)r(;=+YZlRcCTt0s9YC6~GBK+2M?xdKL8hvMX`AlSE z#0V)QAD$o_{zi?Dx4HN4S&T_~#?#W}s1=9>>vUUSlQ2)*8;Z``MVOE_oIedqA4e6+ zBEKFH#{_z&p0ih9yP!&}VMTQWJKKmQ0`-xG#}e$7mPV7Sc~xR#DBUC^ z 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�*$3# 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ุ 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�%cP(6*`sfAdi7U5a- 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 CBqpx_ From 5ef5b72d1a28ffb8a41d00a90cd0ad33729e7eb4 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 27 Oct 2026 09:35:47 +0000 Subject: [PATCH 2/3] Replace or remove the remaining 1.9-era libraries, drop the dead harness - win32/resolv: the 1.9 version needed dl and never loaded, so on Windows Resolv ran without a hosts file or nameservers. New ironruby/win32/resolv.rb answers get_hosts_path and get_resolv_info from System.Net.NetworkInformation. win32/registry (dl as well) goes with it. - win32/sspi: laid SecHandle out as two 32-bit words, so on 64-bit Windows the SSPI calls wrote past their buffers. Removed; Net::HTTP already treats a missing win32/sspi as "no Negotiate proxy auth". - debug, tracer, profile, profiler: 1.9's debug.rb started an interactive debugger on require, and tracer.rb loading made irb's tracer extension die on the missing CallTracer instead of reporting the gem as absent. CRuby 4.0 ships none of them. - kconv: moved to ironruby/ and given nkf 0.2.0's fix for String#kconv (form_enc typo, so the string's own encoding was never passed on). - win32ole/property: unreferenced; IronRuby's win32ole.rb is its own. - Tests/Libraries (Rails 3.0, Rack 1.1, Rake 0.8.7, RubyGems 1.3.7, ...) and the irtests/utr harness that alone used them; it ran ir.exe under Mono from a 2010 DLR_ROOT layout and nothing invokes it. - CI pins ruby/spec and mspec as SPEC_REF / MSPEC_REF. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01KPwZf7csSRV3oAVQ31sLDS --- .github/workflows/ci.yml | 6 + Src/Scripts/irtests | 2 - Src/Scripts/irtests.bat | 2 - Src/StdLib/{ruby/1.9.1 => ironruby}/kconv.rb | 572 +-- Src/StdLib/ironruby/win32/resolv.rb | 64 + Src/StdLib/ruby/1.9.1/debug.rb | 907 ---- Src/StdLib/ruby/1.9.1/profile.rb | 10 - Src/StdLib/ruby/1.9.1/profiler.rb | 59 - Src/StdLib/ruby/1.9.1/tracer.rb | 195 - Src/StdLib/ruby/1.9.1/win32/registry.rb | 845 ---- Src/StdLib/ruby/1.9.1/win32/resolv.rb | 379 -- Src/StdLib/ruby/1.9.1/win32/sspi.rb | 330 -- Src/StdLib/ruby/1.9.1/win32ole/property.rb | 16 - Tests/Libraries/ParseTreeTests/pt_testcase.rb | 4417 ----------------- Tests/Libraries/ParseTreeTests/something.rb | 53 - .../ParseTreeTests/test_parse_tree.rb | 259 - .../test_parse_tree_extensions.rb | 107 - .../ParseTreeTests/test_unified_ruby.rb | 57 - .../Rails-3.0.0/actionmailer/MIT-LICENSE | 21 - .../actionmailer/test/abstract_unit.rb | 80 - .../actionmailer/test/base_test.rb | 564 --- .../test/delivery_methods_test.rb | 172 - .../another.path/base_mailer/welcome.erb | 1 - .../email_with_asset.html.erb | 1 - .../fixtures/asset_mailer/welcome.html.erb | 1 - .../test/fixtures/attachments/foo.jpg | Bin 2029 -> 0 bytes .../test/fixtures/attachments/test.jpg | Bin 2029 -> 0 bytes .../auto_layout_mailer/hello.html.erb | 1 - .../auto_layout_mailer/multipart.html.erb | 1 - .../auto_layout_mailer/multipart.text.erb | 1 - .../base_mailer/attachment_with_content.erb | 1 - .../base_mailer/different_layout.html.erb | 1 - .../base_mailer/different_layout.text.erb | 1 - .../email_custom_layout.text.html.erb | 1 - .../email_with_translations.html.erb | 1 - .../explicit_multipart_templates.html.erb | 1 - .../explicit_multipart_templates.text.erb | 1 - .../explicit_multipart_with_one_template.erb | 1 - .../fixtures/base_mailer/html_only.html.erb | 1 - .../base_mailer/implicit_multipart.html.erb | 1 - .../base_mailer/implicit_multipart.text.erb | 1 - .../implicit_with_locale.en.html.erb | 1 - .../base_mailer/implicit_with_locale.html.erb | 1 - .../implicit_with_locale.pl.text.erb | 1 - .../base_mailer/implicit_with_locale.text.erb | 1 - .../base_mailer/inline_attachment.html.erb | 5 - .../base_mailer/inline_attachment.text.erb | 4 - .../base_mailer/plain_text_only.text.erb | 1 - .../test/fixtures/base_mailer/welcome.erb | 1 - .../explicit_layout_mailer/logout.html.erb | 1 - .../explicit_layout_mailer/signup.html.erb | 1 - .../test/fixtures/first_mailer/share.erb | 1 - .../layouts/auto_layout_mailer.html.erb | 1 - .../layouts/auto_layout_mailer.text.erb | 1 - .../layouts/different_layout.html.erb | 1 - .../layouts/different_layout.text.erb | 1 - .../test/fixtures/layouts/spam.html.erb | 1 - .../nested_layout_mailer/signup.html.erb | 1 - ...multipart_with_template_path_with_dots.erb | 1 - .../actionmailer/test/fixtures/raw_email | 14 - .../actionmailer/test/fixtures/raw_email10 | 20 - .../actionmailer/test/fixtures/raw_email12 | 32 - .../actionmailer/test/fixtures/raw_email13 | 29 - .../actionmailer/test/fixtures/raw_email2 | 114 - .../actionmailer/test/fixtures/raw_email3 | 70 - .../actionmailer/test/fixtures/raw_email4 | 59 - .../actionmailer/test/fixtures/raw_email5 | 19 - .../actionmailer/test/fixtures/raw_email6 | 20 - .../actionmailer/test/fixtures/raw_email7 | 66 - .../actionmailer/test/fixtures/raw_email8 | 47 - .../actionmailer/test/fixtures/raw_email9 | 28 - .../test/fixtures/raw_email_quoted_with_0d0a | 14 - ...il_with_invalid_characters_in_content_type | 104 - .../fixtures/raw_email_with_nested_attachment | 100 - .../raw_email_with_partially_quoted_subject | 14 - .../test/fixtures/second_mailer/share.erb | 1 - .../test/fixtures/templates/signed_up.erb | 3 - .../test_mailer/_subtemplate.text.erb | 1 - .../custom_templating_extension.html.haml | 6 - .../custom_templating_extension.text.haml | 6 - .../implicitly_multipart_example.html.erb | 10 - .../implicitly_multipart_example.html.erb~ | 10 - .../implicitly_multipart_example.ignored.erb | 1 - .../implicitly_multipart_example.text.erb | 2 - .../implicitly_multipart_example.yaml.erb | 1 - .../test_mailer/included_subtemplate.text.erb | 1 - .../multipart_alternative.html.erb | 1 - .../multipart_alternative.plain.erb | 1 - .../fixtures/test_mailer/rxml_template.rxml | 2 - .../fixtures/test_mailer/signed_up.html.erb | 3 - .../url_test_mailer/signed_up_with_url.erb | 5 - .../actionmailer/test/log_subscriber_test.rb | 48 - .../actionmailer/test/mail_helper_test.rb | 54 - .../actionmailer/test/mailers/asset_mailer.rb | 7 - .../actionmailer/test/mailers/base_mailer.rb | 130 - .../actionmailer/test/mailers/proc_mailer.rb | 16 - .../test/old_base/adv_attr_test.rb | 36 - .../test/old_base/asset_host_test.rb | 56 - .../test/old_base/mail_layout_test.rb | 126 - .../test/old_base/mail_render_test.rb | 167 - .../test/old_base/mail_service_test.rb | 1206 ----- .../test/old_base/tmail_compat_test.rb | 35 - .../actionmailer/test/old_base/url_test.rb | 90 - .../actionmailer/test/test_helper_test.rb | 127 - .../Rails-3.0.0/actionpack/MIT-LICENSE | 21 - .../test/abstract/abstract_controller_test.rb | 268 - .../test/abstract/callbacks_test.rb | 248 - .../test/abstract/collector_test.rb | 57 - .../actionpack/test/abstract/helper_test.rb | 98 - .../actionpack/test/abstract/layouts_test.rb | 277 -- .../actionpack/test/abstract/render_test.rb | 102 - .../test/abstract/translation_test.rb | 26 - .../testing/me3/formatted.html.erb | 1 - .../abstract_controller/testing/me3/index.erb | 1 - .../abstract_controller/testing/me4/index.erb | 1 - .../abstract_controller/testing/me5/index.erb | 1 - .../test/abstract/views/action_with_ivars.erb | 1 - .../test/abstract/views/helper_test.erb | 1 - .../actionpack/test/abstract/views/index.erb | 1 - .../abstract_controller/testing/me4.erb | 1 - .../abstract/views/layouts/application.erb | 1 - .../test/abstract/views/naked_render.erb | 1 - .../actionpack/test/abstract_unit.rb | 329 -- .../actionpack/test/active_record_unit.rb | 99 - .../activerecord/active_record_store_test.rb | 220 - .../activerecord/controller_runtime_test.rb | 42 - .../activerecord/polymorphic_routes_test.rb | 450 -- ...partial_with_record_identification_test.rb | 190 - .../controller/action_pack_assertions_test.rb | 574 --- .../test/controller/addresses_render_test.rb | 35 - .../test/controller/assert_select_test.rb | 742 --- .../actionpack/test/controller/base_test.rb | 318 -- .../test/controller/caching_test.rb | 768 --- .../test/controller/capture_test.rb | 73 - .../test/controller/content_type_test.rb | 169 - .../app/controllers/admin/user_controller.rb | 0 .../app/controllers/user_controller.rb | 0 .../bad_plugin/lib/plugin_controller.rb | 0 .../deprecated_base_methods_test.rb | 26 - .../test/controller/dispatcher_test.rb | 59 - .../test/controller/filters_test.rb | 938 ---- .../actionpack/test/controller/flash_test.rb | 271 - .../actionpack/test/controller/helper_test.rb | 258 - .../http_basic_authentication_test.rb | 113 - .../http_digest_authentication_test.rb | 238 - .../http_token_authentication_test.rb | 113 - .../test/controller/integration_test.rb | 524 -- .../actionpack/test/controller/layout_test.rb | 224 - .../controller/localized_templates_test.rb | 22 - .../test/controller/log_subscriber_test.rb | 172 - .../test/controller/mime_responds_test.rb | 941 ---- .../controller/new_base/bare_metal_test.rb | 27 - .../test/controller/new_base/base_test.rb | 132 - .../new_base/content_negotiation_test.rb | 18 - .../controller/new_base/content_type_test.rb | 113 - .../test/controller/new_base/etag_test.rb | 46 - .../test/controller/new_base/metal_test.rb | 45 - .../controller/new_base/middleware_test.rb | 88 - .../controller/new_base/render_action_test.rb | 320 -- .../controller/new_base/render_file_test.rb | 99 - .../new_base/render_implicit_action_test.rb | 28 - .../controller/new_base/render_layout_test.rb | 101 - .../new_base/render_partial_test.rb | 27 - .../controller/new_base/render_rjs_test.rb | 71 - .../new_base/render_template_test.rb | 182 - .../test/controller/new_base/render_test.rb | 85 - .../controller/new_base/render_text_test.rb | 137 - .../controller/new_base/render_xml_test.rb | 11 - .../test/controller/output_escaping_test.rb | 19 - .../test/controller/record_identifier_test.rb | 65 - .../test/controller/redirect_test.rb | 291 -- .../test/controller/render_js_test.rb | 43 - .../test/controller/render_json_test.rb | 112 - .../test/controller/render_other_test.rb | 257 - .../actionpack/test/controller/render_test.rb | 1538 ------ .../test/controller/render_xml_test.rb | 98 - .../controller/request/test_request_test.rb | 36 - .../request_forgery_protection_test.rb | 267 - .../actionpack/test/controller/rescue_test.rb | 382 -- .../test/controller/resources_test.rb | 1395 ------ .../test/controller/routing_test.rb | 1914 ------- .../test/controller/selector_test.rb | 629 --- .../test/controller/send_file_test.rb | 161 - .../actionpack/test/controller/test_test.rb | 710 --- .../test/controller/url_for_test.rb | 286 -- .../test/controller/url_rewriter_test.rb | 85 - .../test/controller/view_paths_test.rb | 153 - .../test/controller/webservice_test.rb | 263 - .../test/dispatch/callbacks_test.rb | 95 - .../actionpack/test/dispatch/cookies_test.rb | 278 -- .../actionpack/test/dispatch/header_test.rb | 16 - .../test/dispatch/middleware_stack_test.rb | 91 - .../test/dispatch/mime_type_test.rb | 96 - .../actionpack/test/dispatch/mount_test.rb | 36 - .../actionpack/test/dispatch/rack_test.rb | 203 - .../request/json_params_parsing_test.rb | 65 - .../request/multipart_params_parsing_test.rb | 165 - .../request/query_string_parsing_test.rb | 120 - .../url_encoded_params_parsing_test.rb | 169 - .../request/xml_params_parsing_test.rb | 116 - .../actionpack/test/dispatch/request_test.rb | 482 -- .../actionpack/test/dispatch/response_test.rb | 226 - .../actionpack/test/dispatch/routing_test.rb | 2123 -------- .../dispatch/session/cookie_store_test.rb | 316 -- .../dispatch/session/mem_cache_store_test.rb | 189 - .../dispatch/session/test_session_test.rb | 38 - .../test/dispatch/show_exceptions_test.rb | 118 - .../actionpack/test/dispatch/static_test.rb | 35 - .../test/dispatch/test_request_test.rb | 45 - .../test/dispatch/url_generation_test.rb | 43 - .../test/fixtures/_top_level_partial.html.erb | 1 - .../test/fixtures/_top_level_partial_only.erb | 1 - .../test/fixtures/addresses/list.erb | 1 - .../fixtures/alternate_helpers/foo_helper.rb | 3 - .../bad_customers/_bad_customer.html.erb | 1 - .../actionpack/test/fixtures/companies.yml | 24 - .../actionpack/test/fixtures/company.rb | 10 - .../fixtures/customers/_customer.html.erb | 1 - .../test/fixtures/db_definitions/sqlite.sql | 49 - .../actionpack/test/fixtures/developer.rb | 9 - .../actionpack/test/fixtures/developers.yml | 21 - .../test/fixtures/developers/_developer.erb | 1 - .../test/fixtures/developers_projects.yml | 13 - .../test/fixtures/fun/games/_form.erb | 1 - .../test/fixtures/fun/games/_game.erb | 1 - .../test/fixtures/fun/games/hello_world.erb | 1 - .../test/fixtures/fun/serious/games/_game.erb | 1 - .../fixtures/functional_caching/_partial.erb | 3 - .../formatted_fragment_cached.html.erb | 3 - .../formatted_fragment_cached.js.rjs | 6 - .../formatted_fragment_cached.xml.builder | 5 - .../fragment_cached.html.erb | 2 - ...html_fragment_cached_with_partial.html.erb | 1 - .../inline_fragment_cached.html.erb | 2 - .../js_fragment_cached_with_partial.js.rjs | 1 - .../good_customers/_good_customer.html.erb | 1 - .../happy_path/render_action/hello_world.erb | 1 - .../actionpack/test/fixtures/hello.html | 1 - .../test/fixtures/helpers/abc_helper.rb | 5 - .../test/fixtures/helpers/fun/games_helper.rb | 5 - .../test/fixtures/helpers/fun/pdf_helper.rb | 5 - .../fixtures/helpers/helpery_test_helper.rb | 5 - .../test/fixtures/helpers/just_me_helper.rb | 3 - .../test/fixtures/helpers/me_too_helper.rb | 3 - .../fixtures/layout_tests/alt/hello.rhtml | 1 - .../layout_tests/alt/layouts/alt.rhtml | 0 .../fixtures/layout_tests/layouts/item.rhtml | 1 - .../layout_tests/layouts/layout_test.rhtml | 1 - .../layouts/multiple_extensions.html.erb | 1 - .../fixtures/layout_tests/layouts/symlinked | 1 - .../layouts/third_party_template_library.mab | 1 - .../fixtures/layout_tests/views/goodbye.rhtml | 1 - .../fixtures/layout_tests/views/hello.rhtml | 1 - .../test/fixtures/layouts/_column.html.erb | 2 - .../test/fixtures/layouts/_customers.erb | 1 - .../fixtures/layouts/block_with_layout.erb | 3 - .../test/fixtures/layouts/builder.builder | 3 - .../fixtures/layouts/partial_with_layout.erb | 3 - .../test/fixtures/layouts/standard.html.erb | 1 - .../fixtures/layouts/talk_from_action.erb | 2 - .../test/fixtures/layouts/xhr.html.erb | 2 - .../test/fixtures/layouts/yield.erb | 2 - .../yield_with_render_inline_inside.erb | 2 - .../fixtures/localized/hello_world.de.html | 1 - .../fixtures/localized/hello_world.en.html | 1 - .../actionpack/test/fixtures/mascot.rb | 3 - .../actionpack/test/fixtures/mascots.yml | 4 - .../test/fixtures/mascots/_mascot.html.erb | 1 - .../test/fixtures/multipart/binary_file | Bin 19820 -> 0 bytes .../fixtures/multipart/boundary_problem_file | 10 - .../test/fixtures/multipart/bracketed_param | 5 - .../actionpack/test/fixtures/multipart/empty | 10 - .../test/fixtures/multipart/hello.txt | 1 - .../test/fixtures/multipart/large_text_file | 10 - .../test/fixtures/multipart/mixed_files | Bin 19937 -> 0 bytes .../test/fixtures/multipart/mona_lisa.jpg | Bin 159528 -> 0 bytes .../actionpack/test/fixtures/multipart/none | 9 - .../test/fixtures/multipart/single_parameter | 5 - .../test/fixtures/multipart/text_file | 10 - ...fault_content_types_for_respond_to.xml.erb | 1 - .../render_default_for_rhtml.rhtml | 1 - .../render_default_for_rjs.rjs | 1 - .../render_default_for_rxml.rxml | 1 - .../fixtures/override/test/hello_world.erb | 1 - .../fixtures/override2/layouts/test/sub.erb | 1 - .../fixtures/post_test/layouts/post.html.erb | 1 - .../post_test/layouts/super_post.iphone.erb | 1 - .../fixtures/post_test/post/index.html.erb | 1 - .../fixtures/post_test/post/index.iphone.erb | 1 - .../post_test/super_post/index.html.erb | 1 - .../post_test/super_post/index.iphone.erb | 1 - .../actionpack/test/fixtures/project.rb | 3 - .../actionpack/test/fixtures/projects.yml | 7 - .../test/fixtures/projects/_project.erb | 1 - .../test/fixtures/public/.gitignore | 1 - .../actionpack/test/fixtures/public/404.html | 1 - .../test/fixtures/public/500.da.html | 1 - .../actionpack/test/fixtures/public/500.html | 1 - .../test/fixtures/public/elsewhere/cools.js | 1 - .../test/fixtures/public/elsewhere/file.css | 1 - .../test/fixtures/public/foo/bar.html | 1 - .../test/fixtures/public/foo/index.html | 1 - .../test/fixtures/public/images/rails.png | Bin 1787 -> 0 bytes .../test/fixtures/public/index.html | 1 - .../public/javascripts/application.js | 1 - .../test/fixtures/public/javascripts/bank.js | 1 - .../public/javascripts/common.javascript | 1 - .../fixtures/public/javascripts/controls.js | 1 - .../fixtures/public/javascripts/dragdrop.js | 1 - .../fixtures/public/javascripts/effects.js | 1 - .../fixtures/public/javascripts/prototype.js | 1 - .../fixtures/public/javascripts/robber.js | 1 - .../public/javascripts/subdir/subdir.js | 1 - .../public/javascripts/version.1.0.js | 1 - .../test/fixtures/public/stylesheets/bank.css | 1 - .../fixtures/public/stylesheets/random.styles | 1 - .../fixtures/public/stylesheets/robber.css | 1 - .../public/stylesheets/subdir/subdir.css | 1 - .../public/stylesheets/version.1.0.css | 1 - .../quiz/questions/_question.html.erb | 1 - .../actionpack/test/fixtures/replies.yml | 15 - .../test/fixtures/replies/_reply.erb | 1 - .../actionpack/test/fixtures/reply.rb | 7 - .../respond_to/all_types_with_layout.html.erb | 1 - .../respond_to/all_types_with_layout.js.rjs | 1 - ...constant_handling_without_block.mobile.erb | 1 - .../iphone_with_html_response_type.html.erb | 1 - .../iphone_with_html_response_type.iphone.erb | 1 - .../respond_to/layouts/missing.html.erb | 1 - .../respond_to/layouts/standard.html.erb | 1 - .../respond_to/layouts/standard.iphone.erb | 1 - .../respond_to/using_defaults.html.erb | 1 - .../fixtures/respond_to/using_defaults.js.rjs | 1 - .../respond_to/using_defaults.xml.builder | 1 - .../using_defaults_with_type_list.html.erb | 1 - .../using_defaults_with_type_list.js.rjs | 1 - .../using_defaults_with_type_list.xml.builder | 1 - .../test/fixtures/respond_with/edit.html.erb | 1 - .../test/fixtures/respond_with/new.html.erb | 1 - .../respond_with/using_resource.js.rjs | 1 - .../using_resource_with_block.html.erb | 1 - .../test/fixtures/scope/test/modgreet.erb | 1 - .../session_autoload_test/foo.rb | 10 - .../actionpack/test/fixtures/shared.html.erb | 1 - .../symlink_parent/symlinked_layout.erb | 5 - .../test/fixtures/test/_counter.html.erb | 1 - .../test/fixtures/test/_customer.erb | 1 - .../test/fixtures/test/_customer_counter.erb | 1 - .../test/_customer_counter_with_as.erb | 1 - .../test/fixtures/test/_customer_greeting.erb | 1 - .../test/fixtures/test/_customer_with_var.erb | 1 - .../actionpack/test/fixtures/test/_form.erb | 1 - .../test/fixtures/test/_from_helper.erb | 1 - .../test/fixtures/test/_hash_greeting.erb | 1 - .../test/fixtures/test/_hash_object.erb | 2 - .../test/fixtures/test/_hello.builder | 1 - .../test/fixtures/test/_labelling_form.erb | 1 - .../test/_layout_for_block_with_args.html.erb | 3 - .../test/_layout_for_partial.html.erb | 3 - .../fixtures/test/_local_inspector.html.erb | 1 - .../test/fixtures/test/_one.html.erb | 1 - .../test/fixtures/test/_partial.erb | 1 - .../test/fixtures/test/_partial.html.erb | 1 - .../test/fixtures/test/_partial.js.erb | 1 - .../test/_partial_for_use_in_layout.html.erb | 1 - .../test/fixtures/test/_partial_only.erb | 1 - .../_partial_with_only_html_version.html.erb | 1 - .../actionpack/test/fixtures/test/_person.erb | 2 - .../test/fixtures/test/_raise.html.erb | 1 - .../test/fixtures/test/_two.html.erb | 1 - .../test/fixtures/test/_utf8_partial.html.erb | 1 - .../test/_utf8_partial_magic.html.erb | 2 - .../fixtures/test/action_talk_to_layout.erb | 2 - .../test/fixtures/test/basic.html.erb | 1 - .../test/calling_partial_with_layout.html.erb | 1 - .../test/fixtures/test/capturing.erb | 4 - .../test/fixtures/test/content_for.erb | 1 - .../test/content_for_concatenated.erb | 3 - .../test/content_for_with_parameter.erb | 2 - .../test/fixtures/test/delete_with_js.rjs | 2 - .../test/deprecated_nested_layout.erb | 3 - .../test/fixtures/test/dont_pick_me | 1 - .../dot.directory/render_file_with_ivar.erb | 1 - .../test/fixtures/test/enum_rjs_test.rjs | 6 - .../fixtures/test/formatted_html_erb.html.erb | 1 - .../fixtures/test/formatted_xml_erb.builder | 1 - .../fixtures/test/formatted_xml_erb.html.erb | 1 - .../fixtures/test/formatted_xml_erb.xml.erb | 1 - .../test/fixtures/test/greeting.html.erb | 1 - .../test/fixtures/test/greeting.js.rjs | 1 - .../test/fixtures/test/greeting.xml.erb | 1 - .../test/fixtures/test/hello.builder | 4 - .../fixtures/test/hello_world.da.html.erb | 1 - .../test/fixtures/test/hello_world.erb | 1 - .../test/fixtures/test/hello_world.erb~ | 1 - .../fixtures/test/hello_world.pt-BR.html.erb | 1 - .../test/hello_world_container.builder | 3 - .../test/hello_world_from_rxml.builder | 4 - .../test/hello_world_with_layout_false.erb | 1 - .../fixtures/test/hello_xml_world.builder | 11 - .../test/fixtures/test/hyphen-ated.erb | 1 - .../test/implicit_content_type.atom.builder | 2 - .../test/fixtures/test/layout_render_file.erb | 2 - .../fixtures/test/layout_render_object.erb | 1 - .../actionpack/test/fixtures/test/list.erb | 1 - .../test/malformed/malformed.en.html.erb~ | 1 - .../fixtures/test/malformed/malformed.erb~ | 1 - .../test/malformed/malformed.html.erb~ | 1 - .../test/fixtures/test/nested_layout.erb | 3 - .../test/non_erb_block_content_for.builder | 4 - .../fixtures/test/potential_conflicts.erb | 4 - .../fixtures/test/proper_block_detection.erb | 1 - .../test/render_explicit_html_template.js.rjs | 1 - .../test/render_file_from_template.html.erb | 1 - .../fixtures/test/render_file_with_ivar.erb | 1 - .../fixtures/test/render_file_with_locals.erb | 1 - .../render_file_with_locals_and_default.erb | 1 - .../test/render_implicit_html_template.js.rjs | 1 - ...html_template_from_xhr_request.da.html.erb | 1 - ...it_html_template_from_xhr_request.html.erb | 1 - ...implicit_js_template_without_layout.js.erb | 1 - .../fixtures/test/render_to_string_test.erb | 1 - .../test/fixtures/test/scoped_translation.erb | 1 - .../fixtures/test/sub_template_raise.html.erb | 1 - .../test/fixtures/test/template.erb | 1 - .../test/fixtures/test/translation.erb | 1 - .../test/update_element_with_capture.erb | 9 - .../test/using_layout_around_block.html.erb | 1 - .../test/fixtures/test/utf8.html.erb | 4 - .../test/fixtures/test/utf8_magic.html.erb | 5 - .../utf8_magic_with_bare_partial.html.erb | 5 - .../actionpack/test/fixtures/topic.rb | 3 - .../actionpack/test/fixtures/topics.yml | 22 - .../test/fixtures/topics/_topic.html.erb | 1 - .../test/lib/controller/fake_controllers.rb | 62 - .../test/lib/controller/fake_models.rb | 151 - .../actionpack/test/lib/testing_sandbox.rb | 15 - .../test/template/active_model_helper_test.rb | 70 - .../test/template/asset_tag_helper_test.rb | 986 ---- .../test/template/atom_feed_helper_test.rb | 323 -- .../test/template/capture_helper_test.rb | 121 - .../test/template/compiled_templates_test.rb | 59 - .../test/template/date_helper_i18n_test.rb | 121 - .../test/template/date_helper_test.rb | 2689 ---------- .../test/template/erb/form_for_test.rb | 11 - .../actionpack/test/template/erb/helper.rb | 23 - .../test/template/erb/tag_helper_test.rb | 60 - .../actionpack/test/template/erb_util_test.rb | 36 - .../test/template/form_helper_test.rb | 1768 ------- .../template/form_options_helper_i18n_test.rb | 27 - .../test/template/form_options_helper_test.rb | 950 ---- .../test/template/form_tag_helper_test.rb | 462 -- .../template/html-scanner/cdata_node_test.rb | 15 - .../template/html-scanner/document_test.rb | 148 - .../test/template/html-scanner/node_test.rb | 89 - .../template/html-scanner/sanitizer_test.rb | 277 -- .../template/html-scanner/tag_node_test.rb | 238 - .../template/html-scanner/text_node_test.rb | 50 - .../template/html-scanner/tokenizer_test.rb | 131 - .../test/template/javascript_helper_test.rb | 118 - .../test/template/log_subscriber_test.rb | 93 - .../test/template/lookup_context_test.rb | 166 - .../test/template/number_helper_i18n_test.rb | 112 - .../test/template/number_helper_test.rb | 363 -- .../test/template/output_buffer_test.rb | 61 - .../test/template/prototype_helper_test.rb | 476 -- .../test/template/raw_output_helper_test.rb | 21 - .../test/template/record_tag_helper_test.rb | 63 - .../actionpack/test/template/render_test.rb | 339 -- .../test/template/sanitize_helper_test.rb | 57 - .../template/scriptaculous_helper_test.rb | 86 - .../test/template/tag_helper_test.rb | 113 - .../actionpack/test/template/template_test.rb | 132 - .../test/template/test_case_test.rb | 256 - .../actionpack/test/template/test_test.rb | 64 - .../template/testing/fixture_resolver_test.rb | 18 - .../template/testing/null_resolver_test.rb | 12 - .../test/template/text_helper_test.rb | 639 --- .../test/template/translation_helper_test.rb | 63 - .../test/template/url_helper_test.rb | 664 --- .../actionpack/test/tmp/.gitignore | 0 .../actionpack/test/ts_isolated.rb | 17 - .../Rails-3.0.0/activemodel/MIT-LICENSE | 21 - .../test/cases/attribute_methods_test.rb | 46 - .../activemodel/test/cases/callbacks_test.rb | 84 - .../activemodel/test/cases/conversion_test.rb | 25 - .../activemodel/test/cases/dirty_test.rb | 109 - .../activemodel/test/cases/errors_test.rb | 65 - .../activemodel/test/cases/helper.rb | 20 - .../activemodel/test/cases/lint_test.rb | 24 - .../black_list_test.rb | 28 - .../permission_set_test.rb | 30 - .../sanitizer_test.rb | 37 - .../white_list_test.rb | 28 - .../cases/mass_assignment_security_test.rb | 52 - .../activemodel/test/cases/naming_test.rb | 67 - .../activemodel/test/cases/observing_test.rb | 131 - .../json_serialization_test.rb | 120 - .../serializeration/xml_serialization_test.rb | 124 - .../test/cases/translation_test.rb | 50 - .../validations/acceptance_validation_test.rb | 68 - .../test/cases/validations/callbacks_test.rb | 78 - .../conditional_validation_test.rb | 139 - .../confirmation_validation_test.rb | 55 - .../validations/exclusion_validation_test.rb | 45 - .../validations/format_validation_test.rb | 115 - .../i18n_generate_message_validation_test.rb | 138 - .../cases/validations/i18n_validation_test.rb | 366 -- .../validations/inclusion_validation_test.rb | 68 - .../validations/length_validation_test.rb | 359 -- .../numericality_validation_test.rb | 187 - .../validations/presence_validation_test.rb | 73 - .../test/cases/validations/validates_test.rb | 114 - .../validations/validations_context_test.rb | 39 - .../cases/validations/with_validation_test.rb | 174 - .../test/cases/validations_test.rb | 296 -- .../Rails-3.0.0/activemodel/test/config.rb | 3 - .../activemodel/test/models/automobile.rb | 12 - .../activemodel/test/models/contact.rb | 22 - .../activemodel/test/models/custom_reader.rb | 15 - .../test/models/mass_assignment_specific.rb | 57 - .../activemodel/test/models/person.rb | 13 - .../test/models/person_with_validator.rb | 11 - .../activemodel/test/models/reply.rb | 32 - .../activemodel/test/models/sheep.rb | 3 - .../activemodel/test/models/topic.rb | 28 - .../activemodel/test/models/track_back.rb | 4 - .../test/validators/email_validator.rb | 6 - .../Rails-3.0.0/activerecord/MIT-LICENSE | 20 - .../activerecord/test/assets/example.log | 1 - .../activerecord/test/assets/flowers.jpg | Bin 5834 -> 0 bytes .../activerecord/test/cases/adapter_test.rb | 156 - .../adapters/firebird/connection_test.rb | 8 - .../cases/adapters/firebird/default_test.rb | 16 - .../cases/adapters/firebird/migration_test.rb | 124 - .../adapters/mysql/active_schema_test.rb | 125 - .../cases/adapters/mysql/connection_test.rb | 65 - .../adapters/mysql/reserved_word_test.rb | 176 - .../test/cases/adapters/mysql/sp_test.rb | 15 - .../adapters/mysql2/active_schema_test.rb | 125 - .../cases/adapters/mysql2/connection_test.rb | 42 - .../adapters/mysql2/reserved_word_test.rb | 176 - .../cases/adapters/oracle/synonym_test.rb | 17 - .../adapters/postgresql/active_schema_test.rb | 28 - .../adapters/postgresql/datatype_test.rb | 243 - .../postgresql/postgresql_adapter_test.rb | 17 - .../postgresql/schema_authorization_test.rb | 84 - .../cases/adapters/postgresql/schema_test.rb | 197 - .../adapters/sqlite/sqlite_adapter_test.rb | 210 - .../cases/adapters/sqlite3/copy_table_test.rb | 80 - .../adapters/sqlite3/sqlite3_adapter_test.rb | 56 - .../test/cases/aggregations_test.rb | 140 - .../activerecord/test/cases/ar_schema_test.rb | 42 - .../belongs_to_associations_test.rb | 477 -- .../test/cases/associations/callbacks_test.rb | 159 - .../cascaded_eager_loading_test.rb | 154 - ...eager_load_includes_full_sti_class_test.rb | 36 - .../eager_load_nested_include_test.rb | 128 - .../eager_singularization_test.rb | 145 - .../test/cases/associations/eager_test.rb | 848 ---- .../test/cases/associations/extension_test.rb | 58 - .../associations/habtm_join_table_test.rb | 44 - ...s_and_belongs_to_many_associations_test.rb | 867 ---- .../has_many_associations_test.rb | 1273 ----- .../has_many_through_associations_test.rb | 424 -- .../associations/has_one_associations_test.rb | 329 -- .../has_one_through_associations_test.rb | 215 - .../inner_join_association_test.rb | 65 - .../associations/inverse_associations_test.rb | 567 --- .../cases/associations/join_model_test.rb | 704 --- .../test/cases/associations_test.rb | 314 -- .../test/cases/attribute_methods_test.rb | 621 --- .../test/cases/autosave_association_test.rb | 1279 ----- .../activerecord/test/cases/base_test.rb | 1432 ------ .../activerecord/test/cases/batches_test.rb | 85 - .../activerecord/test/cases/binary_test.rb | 30 - .../test/cases/calculations_test.rb | 339 -- .../activerecord/test/cases/callbacks_test.rb | 485 -- .../test/cases/column_alias_test.rb | 17 - .../test/cases/column_definition_test.rb | 121 - .../test/cases/connection_management_test.rb | 25 - .../test/cases/connection_pool_test.rb | 31 - .../test/cases/counter_cache_test.rb | 96 - .../test/cases/database_statements_test.rb | 19 - .../activerecord/test/cases/date_time_test.rb | 39 - .../activerecord/test/cases/defaults_test.rb | 111 - .../test/cases/deprecated_finder_test.rb | 30 - .../activerecord/test/cases/dirty_test.rb | 513 -- .../test/cases/finder_respond_to_test.rb | 76 - .../activerecord/test/cases/finder_test.rb | 1086 ---- .../activerecord/test/cases/fixtures_test.rb | 680 --- .../activerecord/test/cases/helper.rb | 85 - .../activerecord/test/cases/i18n_test.rb | 46 - .../test/cases/inheritance_test.rb | 266 - .../test/cases/invalid_date_test.rb | 34 - .../test/cases/json_serialization_test.rb | 211 - .../activerecord/test/cases/lifecycle_test.rb | 182 - .../activerecord/test/cases/locking_test.rb | 356 -- .../test/cases/log_subscriber_test.rb | 64 - .../cases/mass_assignment_security_test.rb | 43 - .../test/cases/method_scoping_test.rb | 552 -- .../activerecord/test/cases/migration_test.rb | 1879 ------- .../activerecord/test/cases/mixin_test.rb | 96 - .../activerecord/test/cases/modules_test.rb | 144 - .../test/cases/multiple_db_test.rb | 91 - .../test/cases/named_scope_test.rb | 487 -- .../test/cases/nested_attributes_test.rb | 906 ---- .../test/cases/persistence_test.rb | 477 -- .../test/cases/pooled_connections_test.rb | 140 - .../test/cases/primary_keys_test.rb | 139 - .../test/cases/query_cache_test.rb | 136 - .../activerecord/test/cases/readonly_test.rb | 108 - .../test/cases/reflection_test.rb | 238 - .../test/cases/relation_scoping_test.rb | 421 -- .../activerecord/test/cases/relations_test.rb | 670 --- .../test/cases/reload_models_test.rb | 22 - .../activerecord/test/cases/sanitize_test.rb | 25 - .../test/cases/schema_dumper_test.rb | 226 - .../test/cases/serialization_test.rb | 188 - .../test/cases/session_store/session_test.rb | 68 - .../test/cases/session_store/sql_bypass.rb | 56 - .../activerecord/test/cases/timestamp_test.rb | 134 - .../test/cases/transaction_callbacks_test.rb | 292 -- .../test/cases/transactions_test.rb | 602 --- .../test/cases/unconnected_test.rb | 32 - .../association_validation_test.rb | 113 - .../i18n_generate_message_validation_test.rb | 38 - .../cases/validations/i18n_validation_test.rb | 89 - .../validations/uniqueness_validation_test.rb | 283 -- .../test/cases/validations_repair_helper.rb | 23 - .../test/cases/validations_test.rb | 197 - .../test/cases/xml_serialization_test.rb | 244 - .../test/cases/yaml_serialization_test.rb | 11 - .../Rails-3.0.0/activerecord/test/config.rb | 5 - .../connections/jdbc_jdbcderby/connection.rb | 18 - .../connections/jdbc_jdbch2/connection.rb | 18 - .../connections/jdbc_jdbchsqldb/connection.rb | 18 - .../connections/jdbc_jdbcmysql/connection.rb | 26 - .../jdbc_jdbcpostgresql/connection.rb | 26 - .../jdbc_jdbcsqlite3/connection.rb | 25 - .../test/connections/native_db2/connection.rb | 25 - .../connections/native_firebird/connection.rb | 26 - .../native_frontbase/connection.rb | 27 - .../connections/native_mysql/connection.rb | 25 - .../connections/native_mysql2/connection.rb | 25 - .../connections/native_openbase/connection.rb | 21 - .../connections/native_oracle/connection.rb | 47 - .../native_postgresql/connection.rb | 21 - .../connections/native_sqlite3/connection.rb | 25 - .../native_sqlite3/in_memory_connection.rb | 18 - .../connections/native_sybase/connection.rb | 23 - .../activerecord/test/fixtures/.gitignore | 1 - .../activerecord/test/fixtures/accounts.yml | 29 - .../test/fixtures/admin/accounts.yml | 2 - .../test/fixtures/admin/users.yml | 7 - .../test/fixtures/all/developers.yml | 0 .../activerecord/test/fixtures/all/people.csv | 0 .../activerecord/test/fixtures/all/tasks.yml | 0 .../test/fixtures/author_addresses.yml | 5 - .../test/fixtures/author_favorites.yml | 4 - .../activerecord/test/fixtures/authors.yml | 9 - .../activerecord/test/fixtures/binaries.yml | 133 - .../activerecord/test/fixtures/books.yml | 7 - .../activerecord/test/fixtures/cars.yml | 4 - .../activerecord/test/fixtures/categories.yml | 14 - .../categories/special_categories.yml | 9 - .../subsubdir/arbitrary_filename.yml | 4 - .../test/fixtures/categories_ordered.yml | 7 - .../test/fixtures/categories_posts.yml | 23 - .../test/fixtures/categorizations.yml | 17 - .../activerecord/test/fixtures/clubs.yml | 6 - .../test/fixtures/collections.yml | 3 - .../activerecord/test/fixtures/comments.yml | 59 - .../activerecord/test/fixtures/companies.yml | 64 - .../activerecord/test/fixtures/computers.yml | 4 - .../activerecord/test/fixtures/courses.yml | 7 - .../activerecord/test/fixtures/customers.yml | 26 - .../activerecord/test/fixtures/dashboards.yml | 3 - .../activerecord/test/fixtures/developers.yml | 21 - .../test/fixtures/developers_projects.yml | 17 - .../activerecord/test/fixtures/edges.yml | 5 - .../activerecord/test/fixtures/entrants.yml | 14 - .../activerecord/test/fixtures/faces.yml | 11 - .../test/fixtures/fk_test_has_fk.yml | 3 - .../test/fixtures/fk_test_has_pk.yml | 2 - .../test/fixtures/funny_jokes.yml | 10 - .../activerecord/test/fixtures/interests.yml | 33 - .../activerecord/test/fixtures/items.yml | 3 - .../activerecord/test/fixtures/jobs.yml | 7 - .../test/fixtures/legacy_things.yml | 3 - .../activerecord/test/fixtures/mateys.yml | 4 - .../test/fixtures/member_types.yml | 6 - .../activerecord/test/fixtures/members.yml | 6 - .../test/fixtures/memberships.yml | 20 - .../activerecord/test/fixtures/men.yml | 5 - .../test/fixtures/minimalistics.yml | 2 - .../activerecord/test/fixtures/minivans.yml | 5 - .../test/fixtures/mixed_case_monkeys.yml | 6 - .../activerecord/test/fixtures/mixins.yml | 29 - .../activerecord/test/fixtures/movies.yml | 7 - .../test/fixtures/naked/csv/accounts.csv | 1 - .../test/fixtures/naked/yml/accounts.yml | 1 - .../test/fixtures/naked/yml/companies.yml | 1 - .../test/fixtures/naked/yml/courses.yml | 1 - .../test/fixtures/organizations.yml | 5 - .../activerecord/test/fixtures/owners.yml | 7 - .../activerecord/test/fixtures/parrots.yml | 27 - .../test/fixtures/parrots_pirates.yml | 7 - .../activerecord/test/fixtures/people.yml | 18 - .../activerecord/test/fixtures/pets.yml | 14 - .../activerecord/test/fixtures/pirates.yml | 9 - .../activerecord/test/fixtures/posts.yml | 52 - .../test/fixtures/price_estimates.yml | 7 - .../activerecord/test/fixtures/products.yml | 4 - .../activerecord/test/fixtures/projects.yml | 7 - .../activerecord/test/fixtures/readers.yml | 9 - .../activerecord/test/fixtures/references.yml | 17 - .../test/fixtures/reserved_words/distinct.yml | 5 - .../reserved_words/distincts_selects.yml | 11 - .../test/fixtures/reserved_words/group.yml | 14 - .../test/fixtures/reserved_words/select.yml | 8 - .../test/fixtures/reserved_words/values.yml | 7 - .../activerecord/test/fixtures/ships.yml | 5 - .../test/fixtures/speedometers.yml | 4 - .../activerecord/test/fixtures/sponsors.yml | 9 - .../test/fixtures/subscribers.yml | 7 - .../test/fixtures/subscriptions.yml | 12 - .../activerecord/test/fixtures/taggings.yml | 28 - .../activerecord/test/fixtures/tags.yml | 7 - .../activerecord/test/fixtures/tasks.yml | 7 - .../activerecord/test/fixtures/topics.yml | 42 - .../activerecord/test/fixtures/toys.yml | 4 - .../activerecord/test/fixtures/treasures.yml | 10 - .../activerecord/test/fixtures/variants.yml | 4 - .../activerecord/test/fixtures/vertices.yml | 4 - .../test/fixtures/warehouse-things.yml | 3 - .../activerecord/test/fixtures/zines.yml | 5 - .../100_migration_that_raises_exception.rb | 10 - .../decimal/1_give_me_big_numbers.rb | 15 - .../duplicate/1_people_have_last_names.rb | 9 - .../duplicate/2_we_need_reminders.rb | 12 - .../test/migrations/duplicate/3_foo.rb | 7 - .../duplicate/3_innocent_jointable.rb | 12 - .../duplicate_names/20080507052938_chunky.rb | 7 - .../duplicate_names/20080507053028_chunky.rb | 7 - .../pass_1/3_innocent_jointable.rb | 12 - .../pass_2/1_people_have_last_names.rb | 9 - .../pass_2/3_innocent_jointable.rb | 12 - .../pass_3/1_people_have_last_names.rb | 9 - .../interleaved/pass_3/2_i_raise_on_down.rb | 8 - .../pass_3/3_innocent_jointable.rb | 12 - .../missing/1000_people_have_middle_names.rb | 9 - .../missing/1_people_have_last_names.rb | 9 - .../migrations/missing/3_we_need_reminders.rb | 12 - .../missing/4_innocent_jointable.rb | 12 - .../valid/1_people_have_last_names.rb | 9 - .../migrations/valid/2_we_need_reminders.rb | 12 - .../migrations/valid/3_innocent_jointable.rb | 12 - .../activerecord/test/models/admin.rb | 5 - .../activerecord/test/models/admin/account.rb | 3 - .../activerecord/test/models/admin/user.rb | 3 - .../activerecord/test/models/author.rb | 153 - .../activerecord/test/models/auto_id.rb | 4 - .../activerecord/test/models/binary.rb | 2 - .../activerecord/test/models/bird.rb | 9 - .../activerecord/test/models/book.rb | 7 - .../activerecord/test/models/boolean.rb | 2 - .../activerecord/test/models/bulb.rb | 7 - .../activerecord/test/models/car.rb | 10 - .../test/models/categorization.rb | 5 - .../activerecord/test/models/category.rb | 34 - .../activerecord/test/models/citation.rb | 6 - .../activerecord/test/models/club.rb | 13 - .../activerecord/test/models/column_name.rb | 3 - .../activerecord/test/models/comment.rb | 30 - .../activerecord/test/models/company.rb | 190 - .../test/models/company_in_module.rb | 83 - .../activerecord/test/models/computer.rb | 3 - .../activerecord/test/models/contact.rb | 18 - .../activerecord/test/models/contract.rb | 4 - .../activerecord/test/models/country.rb | 7 - .../activerecord/test/models/course.rb | 3 - .../activerecord/test/models/customer.rb | 73 - .../activerecord/test/models/dashboard.rb | 3 - .../activerecord/test/models/default.rb | 2 - .../activerecord/test/models/developer.rb | 113 - .../activerecord/test/models/edge.rb | 5 - .../activerecord/test/models/electron.rb | 3 - .../activerecord/test/models/engine.rb | 3 - .../activerecord/test/models/entrant.rb | 3 - .../activerecord/test/models/essay.rb | 3 - .../activerecord/test/models/event.rb | 3 - .../activerecord/test/models/face.rb | 7 - .../activerecord/test/models/guid.rb | 2 - .../activerecord/test/models/interest.rb | 5 - .../activerecord/test/models/invoice.rb | 4 - .../activerecord/test/models/item.rb | 7 - .../activerecord/test/models/job.rb | 5 - .../activerecord/test/models/joke.rb | 3 - .../activerecord/test/models/keyboard.rb | 3 - .../activerecord/test/models/legacy_thing.rb | 3 - .../activerecord/test/models/line_item.rb | 3 - .../activerecord/test/models/liquid.rb | 5 - .../activerecord/test/models/loose_person.rb | 24 - .../activerecord/test/models/man.rb | 9 - .../activerecord/test/models/matey.rb | 4 - .../activerecord/test/models/member.rb | 12 - .../activerecord/test/models/member_detail.rb | 5 - .../activerecord/test/models/member_type.rb | 3 - .../activerecord/test/models/membership.rb | 9 - .../activerecord/test/models/minimalistic.rb | 2 - .../activerecord/test/models/minivan.rb | 9 - .../test/models/mixed_case_monkey.rb | 3 - .../activerecord/test/models/molecule.rb | 4 - .../activerecord/test/models/movie.rb | 5 - .../activerecord/test/models/order.rb | 4 - .../activerecord/test/models/organization.rb | 6 - .../activerecord/test/models/owner.rb | 5 - .../activerecord/test/models/parrot.rb | 22 - .../activerecord/test/models/person.rb | 19 - .../activerecord/test/models/pet.rb | 5 - .../activerecord/test/models/pirate.rb | 80 - .../activerecord/test/models/post.rb | 115 - .../test/models/price_estimate.rb | 3 - .../activerecord/test/models/project.rb | 37 - .../activerecord/test/models/reader.rb | 4 - .../activerecord/test/models/reference.rb | 9 - .../activerecord/test/models/reply.rb | 57 - .../activerecord/test/models/ship.rb | 19 - .../activerecord/test/models/ship_part.rb | 7 - .../activerecord/test/models/shop.rb | 12 - .../activerecord/test/models/speedometer.rb | 4 - .../activerecord/test/models/sponsor.rb | 4 - .../activerecord/test/models/subject.rb | 12 - .../activerecord/test/models/subscriber.rb | 8 - .../activerecord/test/models/subscription.rb | 4 - .../activerecord/test/models/tag.rb | 7 - .../activerecord/test/models/tagging.rb | 10 - .../activerecord/test/models/task.rb | 3 - .../activerecord/test/models/topic.rb | 101 - .../activerecord/test/models/toy.rb | 4 - .../activerecord/test/models/treasure.rb | 8 - .../activerecord/test/models/treaty.rb | 7 - .../activerecord/test/models/tyre.rb | 3 - .../activerecord/test/models/vertex.rb | 9 - .../test/models/warehouse_thing.rb | 5 - .../activerecord/test/models/wheel.rb | 3 - .../activerecord/test/models/without_table.rb | 3 - .../activerecord/test/models/zine.rb | 3 - .../test/schema/mysql2_specific_schema.rb | 24 - .../test/schema/mysql_specific_schema.rb | 35 - .../test/schema/oracle_specific_schema.rb | 46 - .../test/schema/postgresql_specific_schema.rb | 121 - .../activerecord/test/schema/schema.rb | 658 --- .../test/schema/sqlite_specific_schema.rb | 25 - .../Rails-3.0.0/activeresource/MIT-LICENSE | 20 - .../activeresource/test/abstract_unit.rb | 20 - .../test/cases/authorization_test.rb | 244 - .../test/cases/base/custom_methods_test.rb | 101 - .../test/cases/base/equality_test.rb | 52 - .../test/cases/base/load_test.rb | 180 - .../test/cases/base/schema_test.rb | 420 -- .../test/cases/base_errors_test.rb | 107 - .../activeresource/test/cases/base_test.rb | 1116 ----- .../activeresource/test/cases/finder_test.rb | 233 - .../activeresource/test/cases/format_test.rb | 112 - .../test/cases/http_mock_test.rb | 82 - .../test/cases/log_subscriber_test.rb | 32 - .../test/cases/observing_test.rb | 55 - .../test/cases/validations_test.rb | 69 - .../activeresource/test/connection_test.rb | 253 - .../activeresource/test/fixtures/beast.rb | 14 - .../activeresource/test/fixtures/customer.rb | 3 - .../activeresource/test/fixtures/person.rb | 3 - .../activeresource/test/fixtures/project.rb | 25 - .../activeresource/test/fixtures/proxy.rb | 4 - .../activeresource/test/fixtures/sound.rb | 5 - .../test/fixtures/street_address.rb | 4 - .../activeresource/test/setter_trap.rb | 28 - .../Rails-3.0.0/activesupport/MIT-LICENSE | 20 - .../activesupport/test/abstract_unit.rb | 64 - .../activesupport/test/autoload.rb | 80 - .../test/autoloading_fixtures/a/b.rb | 2 - .../test/autoloading_fixtures/a/c/d.rb | 2 - .../test/autoloading_fixtures/a/c/e/f.rb | 2 - .../test/autoloading_fixtures/application.rb | 1 - .../test/autoloading_fixtures/class_folder.rb | 3 - .../class_folder/class_folder_subclass.rb | 3 - .../class_folder/inline_class.rb | 2 - .../class_folder/nested_class.rb | 7 - .../test/autoloading_fixtures/conflict.rb | 1 - .../autoloading_fixtures/counting_loader.rb | 5 - .../cross_site_dependency.rb | 2 - .../test/autoloading_fixtures/e.rb | 2 - .../load_path/loaded_constant.rb | 3 - .../autoloading_fixtures/loads_constant.rb | 5 - .../module_folder/inline_class.rb | 2 - .../module_folder/nested_class.rb | 4 - .../module_folder/nested_sibling.rb | 2 - .../module_with_custom_const_missing/a/b.rb | 1 - .../multiple_constant_file.rb | 2 - .../autoloading_fixtures/raises_name_error.rb | 3 - .../raises_no_method_error.rb | 3 - .../autoloading_fixtures/requires_constant.rb | 5 - .../activesupport/test/benchmarkable_test.rb | 86 - .../test/buffered_logger_test.rb | 164 - .../activesupport/test/caching_test.rb | 694 --- .../test/callback_inheritance_test.rb | 150 - .../activesupport/test/callbacks_test.rb | 553 --- .../test/clean_backtrace_test.rb | 52 - .../activesupport/test/clean_logger_test.rb | 58 - .../activesupport/test/concern_test.rb | 97 - .../activesupport/test/configurable_test.rb | 42 - .../test/core_ext/array_ext_test.rb | 466 -- .../test/core_ext/base64_ext_test.rb | 8 - .../activesupport/test/core_ext/bigdecimal.rb | 10 - .../activesupport/test/core_ext/blank_test.rb | 22 - .../test/core_ext/cgi_ext_test.rb | 15 - .../core_ext/class/attribute_accessor_test.rb | 38 - .../test/core_ext/class/attribute_test.rb | 73 - .../class_inheritable_attributes_test.rb | 225 - .../class/delegating_attributes_test.rb | 97 - .../activesupport/test/core_ext/class_test.rb | 28 - .../test/core_ext/date_ext_test.rb | 436 -- .../test/core_ext/date_time_ext_test.rb | 369 -- .../test/core_ext/duplicable_test.rb | 24 - .../test/core_ext/duration_test.rb | 140 - .../test/core_ext/enumerable_test.rb | 97 - .../activesupport/test/core_ext/file_test.rb | 72 - .../test/core_ext/float_ext_test.rb | 26 - .../test/core_ext/hash_ext_test.rb | 1000 ---- .../test/core_ext/integer_ext_test.rb | 27 - .../test/core_ext/kernel_test.rb | 70 - .../test/core_ext/load_error_test.rb | 32 - .../test/core_ext/module/anonymous_test.rb | 14 - .../module/attr_accessor_with_default_test.rb | 31 - .../core_ext/module/attr_internal_test.rb | 53 - .../module/attribute_accessor_test.rb | 40 - .../module/attribute_aliasing_test.rb | 59 - .../test/core_ext/module/reachable_test.rb | 41 - .../core_ext/module/synchronization_test.rb | 88 - .../test/core_ext/module_test.rb | 358 -- .../test/core_ext/name_error_test.rb | 21 - .../test/core_ext/numeric_ext_test.rb | 150 - .../test/core_ext/object/to_param_test.rb | 19 - .../test/core_ext/object/to_query_test.rb | 44 - .../core_ext/object_and_class_ext_test.rb | 168 - .../activesupport/test/core_ext/proc_test.rb | 12 - .../test/core_ext/range_ext_test.rb | 65 - .../test/core_ext/regexp_ext_test.rb | 10 - .../test/core_ext/string_ext_test.rb | 515 -- .../test/core_ext/time_ext_test.rb | 793 --- .../test/core_ext/time_with_zone_test.rb | 868 ---- .../test/core_ext/uri_ext_test.rb | 17 - .../test/dependencies/check_warnings.rb | 2 - .../test/dependencies/conflict.rb | 1 - .../test/dependencies/cross_site_depender.rb | 3 - .../test/dependencies/mutual_one.rb | 4 - .../test/dependencies/mutual_two.rb | 4 - .../test/dependencies/raises_exception.rb | 3 - .../dependencies/requires_nonexistent0.rb | 1 - .../dependencies/requires_nonexistent1.rb | 1 - .../test/dependencies/service_one.rb | 5 - .../test/dependencies/service_two.rb | 2 - .../activesupport/test/dependencies_test.rb | 851 ---- .../test/deprecation/proxy_wrappers_test.rb | 22 - .../activesupport/test/deprecation_test.rb | 187 - .../test/descendants_tracker_test.rb | 77 - .../activesupport/test/empty_bool.rb | 7 - .../test/file_update_checker_test.rb | 56 - .../test/fixtures/autoload/another_class.rb | 2 - .../test/fixtures/autoload/some_class.rb | 2 - .../activesupport/test/fixtures/custom.rb | 2 - ...flush_cache_on_private_memoization_test.rb | 44 - .../activesupport/test/gzip_test.rb | 7 - .../activesupport/test/i18n_test.rb | 100 - .../activesupport/test/inflector_test.rb | 316 -- .../test/inflector_test_cases.rb | 263 - .../activesupport/test/isolation_test.rb | 182 - .../activesupport/test/json/decoding_test.rb | 83 - .../activesupport/test/json/encoding_test.rb | 176 - .../test/lazy_load_hooks_test.rb | 67 - .../activesupport/test/load_paths_test.rb | 15 - .../activesupport/test/log_subscriber_test.rb | 123 - .../activesupport/test/memoizable_test.rb | 250 - .../test/message_encryptor_test.rb | 57 - .../test/message_verifier_test.rb | 42 - .../test/multibyte_chars_test.rb | 702 --- .../test/multibyte_conformance.rb | 129 - .../test/multibyte_test_helpers.rb | 22 - .../test/multibyte_unicode_database_test.rb | 26 - .../test/multibyte_utils_test.rb | 138 - .../activesupport/test/notifications_test.rb | 216 - .../activesupport/test/option_merger_test.rb | 86 - .../activesupport/test/ordered_hash_test.rb | 267 - .../test/ordered_options_test.rb | 53 - .../activesupport/test/rescuable_test.rb | 106 - .../activesupport/test/safe_buffer_test.rb | 41 - .../activesupport/test/secure_random_test.rb | 19 - .../test/string_inquirer_test.rb | 15 - .../activesupport/test/test_test.rb | 190 - .../activesupport/test/test_xml_mini.rb | 49 - .../activesupport/test/time_zone_test.rb | 309 -- .../activesupport/test/transliterate_test.rb | 35 - .../activesupport/test/ts_isolated.rb | 17 - .../activesupport/test/whiny_nil_test.rb | 53 - .../test/xml_mini/jdom_engine_test.rb | 153 - .../test/xml_mini/libxml_engine_test.rb | 203 - .../test/xml_mini/libxmlsax_engine_test.rb | 194 - .../test/xml_mini/nokogiri_engine_test.rb | 216 - .../test/xml_mini/nokogirisax_engine_test.rb | 217 - .../test/xml_mini/rexml_engine_test.rb | 29 - Tests/Libraries/Rails-3.0.0/load_paths.rb | 34 - .../Rails-3.0.0/railties/MIT-LICENSE | 20 - .../railties/test/abstract_unit.rb | 17 - .../test/application/configuration_test.rb | 281 -- .../railties/test/application/console_test.rb | 93 - .../test/application/generators_test.rb | 122 - .../application/initializers/boot_test.rb | 16 - .../initializers/check_ruby_version_test.rb | 35 - .../initializers/frameworks_test.rb | 118 - .../application/initializers/hooks_test.rb | 86 - .../application/initializers/i18n_test.rb | 150 - .../initializers/load_path_test.rb | 91 - .../initializers/notifications_test.rb | 39 - .../railties/test/application/loading_test.rb | 86 - .../test/application/middleware_test.rb | 224 - .../railties/test/application/paths_test.rb | 82 - .../railties/test/application/rackup_test.rb | 46 - .../railties/test/application/rake_test.rb | 37 - .../railties/test/application/routing_test.rb | 246 - .../railties/test/application/runner_test.rb | 49 - .../railties/test/application/test_test.rb | 80 - .../test/application/url_generation_test.rb | 44 - .../railties/test/backtrace_cleaner_test.rb | 54 - .../about_yml_plugins/bad_about_yml/about.yml | 1 - .../about_yml_plugins/bad_about_yml/init.rb | 1 - .../plugin_without_about_yml/init.rb | 1 - .../test/fixtures/lib/empty_builder.rb | 2 - .../active_record/fixjour_generator.rb | 8 - .../lib/generators/fixjour_generator.rb | 2 - .../lib/generators/model_generator.rb | 1 - .../lib/generators/wrong_generator.rb | 3 - .../generators/foobar/foobar_generator.rb | 4 - .../test/fixtures/lib/simple_builder.rb | 7 - .../railties/test/fixtures/lib/template.rb | 1 - .../test/fixtures/lib/tweak_builder.rb | 7 - .../railties/test/generators/actions_test.rb | 232 - .../test/generators/app_generator_test.rb | 325 -- .../generators/controller_generator_test.rb | 79 - .../generators/generated_attribute_test.rb | 111 - .../generators/generator_generator_test.rb | 20 - .../test/generators/generators_test_helper.rb | 39 - .../test/generators/helper_generator_test.rb | 54 - .../integration_test_generator_test.rb | 12 - .../test/generators/mailer_generator_test.rb | 78 - .../generators/migration_generator_test.rb | 80 - .../test/generators/model_generator_test.rb | 183 - .../test/generators/named_base_test.rb | 111 - .../generators/observer_generator_test.rb | 27 - .../performance_test_generator_test.rb | 12 - .../test/generators/plugin_generator_test.rb | 65 - .../generators/resource_generator_test.rb | 84 - .../scaffold_controller_generator_test.rb | 125 - .../generators/scaffold_generator_test.rb | 234 - .../session_migration_generator_test.rb | 27 - .../generators/stylesheets_generator_test.rb | 17 - .../railties/test/generators_test.rb | 193 - .../railties/test/initializable_test.rb | 231 - .../railties/test/isolation/abstract_unit.rb | 245 - .../Rails-3.0.0/railties/test/paths_test.rb | 253 - .../test/rails_info_controller_test.rb | 52 - .../railties/test/rails_info_test.rb | 87 - .../railties/test/railties/engine_test.rb | 54 - .../test/railties/plugin_ordering_test.rb | 72 - .../railties/test/railties/plugin_test.rb | 146 - .../railties/test/railties/railtie_test.rb | 147 - .../railties/test/railties/shared_tests.rb | 272 - .../railties/test/script_rails_loader_test.rb | 22 - Tests/Libraries/Rails-3.0.0/source.txt | 4 - .../Rake-0.8.7/test/capture_stdout.rb | 26 - .../Rake-0.8.7/test/check_expansion.rb | 5 - .../Rake-0.8.7/test/check_no_expansion.rb | 5 - .../Rake-0.8.7/test/contrib/test_sys.rb | 47 - .../Rake-0.8.7/test/data/chains/.cvsignore | 1 - .../Rake-0.8.7/test/data/chains/Rakefile | 15 - .../Rake-0.8.7/test/data/default/Rakefile | 19 - .../Rake-0.8.7/test/data/dryrun/.cvsignore | 1 - .../Rake-0.8.7/test/data/dryrun/Rakefile | 22 - .../test/data/file_creation_task/.cvsignore | 2 - .../test/data/file_creation_task/.gitignore | 2 - .../test/data/file_creation_task/Rakefile | 33 - .../Rake-0.8.7/test/data/imports/.cvsignore | 1 - .../Rake-0.8.7/test/data/imports/Rakefile | 19 - .../Rake-0.8.7/test/data/imports/deps.mf | 1 - .../Rake-0.8.7/test/data/multidesc/Rakefile | 17 - .../Rake-0.8.7/test/data/namespace/Rakefile | 57 - .../Rake-0.8.7/test/data/nosearch/dummy | 1 - .../Rake-0.8.7/test/data/rakelib/test1.rb | 3 - .../Rake-0.8.7/test/data/rakelib/test2.rake | 3 - .../Rake-0.8.7/test/data/rbext/rakefile.rb | 3 - .../Libraries/Rake-0.8.7/test/data/sample.mf | 14 - .../test/data/statusreturn/Rakefile | 8 - .../Rake-0.8.7/test/data/sys/sys1.rake | 3 - .../Rake-0.8.7/test/data/unittest/Rakefile | 1 - .../test/data/unittest/subdir/README | 0 .../Libraries/Rake-0.8.7/test/filecreation.rb | 32 - Tests/Libraries/Rake-0.8.7/test/functional.rb | 15 - .../Rake-0.8.7/test/in_environment.rb | 30 - .../Rake-0.8.7/test/rake_test_setup.rb | 24 - Tests/Libraries/Rake-0.8.7/test/reqfile.rb | 3 - Tests/Libraries/Rake-0.8.7/test/reqfile2.rb | 3 - Tests/Libraries/Rake-0.8.7/test/reqfile3.rake | 3 - .../Rake-0.8.7/test/session_functional.rb | 339 -- .../Libraries/Rake-0.8.7/test/shellcommand.rb | 3 - .../Rake-0.8.7/test/test_application.rb | 675 --- Tests/Libraries/Rake-0.8.7/test/test_clean.rb | 14 - .../Rake-0.8.7/test/test_definitions.rb | 85 - .../Rake-0.8.7/test/test_earlytime.rb | 35 - .../Rake-0.8.7/test/test_extension.rb | 63 - .../test/test_file_creation_task.rb | 62 - .../Rake-0.8.7/test/test_file_task.rb | 143 - .../Rake-0.8.7/test/test_filelist.rb | 623 --- .../Rake-0.8.7/test/test_fileutils.rb | 251 - Tests/Libraries/Rake-0.8.7/test/test_ftp.rb | 59 - .../Rake-0.8.7/test/test_invocation_chain.rb | 81 - .../Rake-0.8.7/test/test_makefile_loader.rb | 26 - .../Rake-0.8.7/test/test_multitask.rb | 45 - .../Rake-0.8.7/test/test_namespace.rb | 55 - .../Rake-0.8.7/test/test_package_task.rb | 118 - .../Libraries/Rake-0.8.7/test/test_pathmap.rb | 210 - .../Rake-0.8.7/test/test_pseudo_status.rb | 26 - Tests/Libraries/Rake-0.8.7/test/test_rake.rb | 41 - .../Rake-0.8.7/test/test_rdoc_task.rb | 88 - .../Libraries/Rake-0.8.7/test/test_require.rb | 35 - Tests/Libraries/Rake-0.8.7/test/test_rules.rb | 349 -- .../Rake-0.8.7/test/test_task_arguments.rb | 89 - .../Rake-0.8.7/test/test_task_manager.rb | 173 - .../Libraries/Rake-0.8.7/test/test_tasklib.rb | 12 - Tests/Libraries/Rake-0.8.7/test/test_tasks.rb | 374 -- .../Rake-0.8.7/test/test_test_task.rb | 77 - .../test/test_top_level_functions.rb | 86 - Tests/Libraries/Rake-0.8.7/test/test_win32.rb | 72 - .../Libraries/RubyGems-1.3.7/bogussources.rb | 8 - .../RubyGems-1.3.7/data/gem-private_key.pem | 27 - .../RubyGems-1.3.7/data/gem-public_cert.pem | 20 - .../RubyGems-1.3.7/fake_certlib/openssl.rb | 7 - .../Libraries/RubyGems-1.3.7/foo/discover.rb | 0 Tests/Libraries/RubyGems-1.3.7/functional.rb | 92 - .../RubyGems-1.3.7/gem_installer_test_case.rb | 97 - .../gem_package_tar_test_case.rb | 132 - .../Libraries/RubyGems-1.3.7/gemutilities.rb | 588 --- .../RubyGems-1.3.7/insure_session.rb | 43 - Tests/Libraries/RubyGems-1.3.7/mockgemui.rb | 56 - .../plugin/exception/rubygems_plugin.rb | 2 - .../plugin/load/rubygems_plugin.rb | 1 - .../plugin/standarderror/rubygems_plugin.rb | 2 - .../Libraries/RubyGems-1.3.7/private_key.pem | 27 - .../Libraries/RubyGems-1.3.7/public_cert.pem | 20 - .../rubygems/commands/crash_command.rb | 5 - .../RubyGems-1.3.7/rubygems_plugin.rb | 21 - Tests/Libraries/RubyGems-1.3.7/simple_gem.rb | 66 - Tests/Libraries/RubyGems-1.3.7/test_config.rb | 12 - Tests/Libraries/RubyGems-1.3.7/test_gem.rb | 708 --- .../RubyGems-1.3.7/test_gem_builder.rb | 27 - .../RubyGems-1.3.7/test_gem_command.rb | 178 - .../test_gem_command_manager.rb | 207 - .../test_gem_commands_build_command.rb | 74 - .../test_gem_commands_cert_command.rb | 124 - .../test_gem_commands_check_command.rb | 18 - .../test_gem_commands_contents_command.rb | 156 - .../test_gem_commands_dependency_command.rb | 216 - .../test_gem_commands_environment_command.rb | 135 - .../test_gem_commands_fetch_command.rb | 76 - ...est_gem_commands_generate_index_command.rb | 135 - .../test_gem_commands_install_command.rb | 262 - .../test_gem_commands_list_command.rb | 36 - .../test_gem_commands_lock_command.rb | 68 - .../test_gem_commands_mirror_command.rb | 60 - .../test_gem_commands_outdated_command.rb | 40 - .../test_gem_commands_owner_command.rb | 105 - .../test_gem_commands_pristine_command.rb | 108 - .../test_gem_commands_push_command.rb | 61 - .../test_gem_commands_query_command.rb | 426 -- .../test_gem_commands_server_command.rb | 59 - .../test_gem_commands_sources_command.rb | 209 - ...test_gem_commands_specification_command.rb | 139 - .../test_gem_commands_stale_command.rb | 38 - .../test_gem_commands_uninstall_command.rb | 83 - .../test_gem_commands_unpack_command.rb | 159 - .../test_gem_commands_update_command.rb | 169 - .../test_gem_commands_which_command.rb | 66 - .../RubyGems-1.3.7/test_gem_config_file.rb | 287 -- .../RubyGems-1.3.7/test_gem_dependency.rb | 149 - .../test_gem_dependency_installer.rb | 676 --- .../test_gem_dependency_list.rb | 230 - .../RubyGems-1.3.7/test_gem_doc_manager.rb | 31 - .../test_gem_ext_configure_builder.rb | 84 - .../test_gem_ext_ext_conf_builder.rb | 127 - .../test_gem_ext_rake_builder.rb | 81 - .../RubyGems-1.3.7/test_gem_format.rb | 70 - .../test_gem_gem_path_searcher.rb | 78 - .../RubyGems-1.3.7/test_gem_gem_runner.rb | 45 - .../test_gem_gemcutter_utilities.rb | 103 - .../RubyGems-1.3.7/test_gem_indexer.rb | 673 --- .../test_gem_install_update_options.rb | 68 - .../RubyGems-1.3.7/test_gem_installer.rb | 857 ---- .../test_gem_local_remote_options.rb | 97 - .../test_gem_package_tar_header.rb | 130 - .../test_gem_package_tar_input.rb | 112 - .../test_gem_package_tar_output.rb | 97 - .../test_gem_package_tar_reader.rb | 46 - .../test_gem_package_tar_reader_entry.rb | 109 - .../test_gem_package_tar_writer.rb | 144 - .../RubyGems-1.3.7/test_gem_package_task.rb | 46 - .../RubyGems-1.3.7/test_gem_platform.rb | 264 - .../RubyGems-1.3.7/test_gem_remote_fetcher.rb | 740 --- .../RubyGems-1.3.7/test_gem_requirement.rb | 292 -- .../RubyGems-1.3.7/test_gem_server.rb | 356 -- .../RubyGems-1.3.7/test_gem_source_index.rb | 461 -- .../RubyGems-1.3.7/test_gem_spec_fetcher.rb | 410 -- .../RubyGems-1.3.7/test_gem_specification.rb | 1283 ----- .../RubyGems-1.3.7/test_gem_stream_ui.rb | 136 - .../RubyGems-1.3.7/test_gem_uninstaller.rb | 146 - .../RubyGems-1.3.7/test_gem_validator.rb | 63 - .../RubyGems-1.3.7/test_gem_version.rb | 172 - .../RubyGems-1.3.7/test_gem_version_option.rb | 89 - Tests/Libraries/RubyGems-1.3.7/test_kernel.rb | 59 - Tests/Libraries/TZInfoTests/tc_country.rb | 156 - .../tc_country_index_definition.rb | 71 - .../Libraries/TZInfoTests/tc_country_info.rb | 72 - .../TZInfoTests/tc_country_timezone.rb | 121 - .../Libraries/TZInfoTests/tc_data_timezone.rb | 69 - .../TZInfoTests/tc_data_timezone_info.rb | 285 -- .../Libraries/TZInfoTests/tc_info_timezone.rb | 37 - .../TZInfoTests/tc_linked_timezone.rb | 103 - .../TZInfoTests/tc_linked_timezone_info.rb | 18 - .../TZInfoTests/tc_offset_rationals.rb | 25 - .../TZInfoTests/tc_ruby_core_support.rb | 15 - .../TZInfoTests/tc_time_or_datetime.rb | 422 -- Tests/Libraries/TZInfoTests/tc_timezone.rb | 856 ---- .../TZInfoTests/tc_timezone_definition.rb | 115 - .../tc_timezone_index_definition.rb | 75 - .../Libraries/TZInfoTests/tc_timezone_info.rb | 13 - .../TZInfoTests/tc_timezone_london.rb | 114 - .../TZInfoTests/tc_timezone_melbourne.rb | 114 - .../TZInfoTests/tc_timezone_new_york.rb | 114 - .../TZInfoTests/tc_timezone_offset_info.rb | 116 - .../TZInfoTests/tc_timezone_period.rb | 511 -- .../TZInfoTests/tc_timezone_proxy.rb | 87 - .../tc_timezone_transition_info.rb | 194 - .../Libraries/TZInfoTests/tc_timezone_utc.rb | 29 - Tests/Libraries/TZInfoTests/test_utils.rb | 21 - Tests/Libraries/TZInfoTests/ts_all.rb | 9 - Tests/Libraries/Yaml/collections_tests.rb | 75 - Tests/Libraries/Yaml/dump_tests.rb | 47 - Tests/Libraries/Yaml/load_documents_tests.rb | 49 - Tests/Libraries/Yaml/load_file_tests.rb | 16 - Tests/Libraries/Yaml/load_stream_tests.rb | 132 - Tests/Libraries/Yaml/load_tests.rb | 45 - Tests/Libraries/Yaml/run.bat | 2 - Tests/Libraries/Yaml/tags_tests.rb | 109 - Tests/Libraries/Yaml/test_yaml.rb | 1286 ----- Tests/Libraries/Yaml/yaml/rails_database.yml | 19 - Tests/Libraries/Yaml/yaml/readme.txt | 7 - .../Libraries/Yaml/yaml/test_duplicatekey.yml | 6 - Tests/Libraries/Yaml/yaml/wp_datatypes.yml | 17 - Tests/Libraries/Yaml/yaml/wp_hashes.yml | 5 - .../Libraries/Yaml/yaml/wp_indenteddelim.yml | 8 - Tests/Libraries/Yaml/yaml/wp_lists.yml | 6 - Tests/Libraries/Yaml/yaml/wp_listshashes.yml | 9 - .../Yaml/yaml/wp_mergesreferences.yml | 19 - .../Libraries/Yaml/yaml/wp_newlinesfolded.yml | 8 - .../Yaml/yaml/wp_newlinespreserved.yml | 6 - Tests/Libraries/Yaml/yaml/wp_sample.yml | 33 - Tests/Libraries/Yaml/yaml/yamlorg_index.yml | 64 - Tests/Libraries/Yaml/yaml/yamlorg_refcard.yml | 65 - Tests/Libraries/Yaml/yaml/yamlorg_start.yml | 30 - Tests/Libraries/Yaml/yaml/yts_basictests.yml | 251 - .../Libraries/Yaml/yaml/yts_blockmapping.yml | 67 - .../Yaml/yaml/yts_simpleblockseq.yml | 22 - Tests/Libraries/Yaml/yaml/yts_strangekeys.yml | 36 - Tests/Libraries/Yaml/yaml_test_suite.rb | 39 - .../Gemfile | 18 - .../MIT-LICENSE | 20 - .../RUNNING_UNIT_TESTS | 47 - .../aaaa_create_tables_test_sqlserver.rb | 19 - .../test/cases/adapter_test_sqlserver.rb | 609 --- .../cases/attribute_methods_test_sqlserver.rb | 40 - .../test/cases/base_test_sqlserver.rb | 25 - .../belongs_to_associations_test_sqlserver.rb | 19 - .../test/cases/calculations_test_sqlserver.rb | 19 - .../test/cases/column_test_sqlserver.rb | 273 - .../test/cases/connection_test_sqlserver.rb | 148 - .../test/cases/eager_test_sqlserver.rb | 22 - .../cases/execute_procedure_test_sqlserver.rb | 35 - .../test/cases/finder_test_sqlserver.rb | 23 - ...ngs_to_many_associations_test_sqlserver.rb | 17 - .../test/cases/inheritance_test_sqlserver.rb | 22 - .../cases/method_scoping_test_sqlserver.rb | 29 - .../test/cases/migration_test_sqlserver.rb | 103 - .../cases/offset_and_limit_test_sqlserver.rb | 91 - .../pessimistic_locking_test_sqlserver.rb | 123 - .../test/cases/query_cache_test_sqlserver.rb | 22 - .../cases/schema_dumper_test_sqlserver.rb | 87 - .../test/cases/session_test_sqlserver.rb | 19 - .../cases/specific_schema_test_sqlserver.rb | 143 - .../test/cases/sqlserver_helper.rb | 137 - .../test/cases/table_name_test_sqlserver.rb | 38 - .../test/cases/transaction_test_sqlserver.rb | 93 - .../test/cases/unicode_test_sqlserver.rb | 50 - .../uniqueness_validation_test_sqlserver.rb | 44 - .../native_sqlserver/connection.rb | 26 - .../native_sqlserver_odbc/connection.rb | 28 - .../1_table_will_never_be_created.rb | 11 - .../test/profile/connection_profile_case.rb | 30 - .../test/profile/finder_profile_case.rb | 18 - .../test/profile/helper.rb | 58 - .../test/schema/sqlserver_specific_schema.rb | 94 - Tests/Libraries/rack-1.1.0/COPYING | 18 - Tests/Libraries/rack-1.1.0/KNOWN-ISSUES | 21 - Tests/Libraries/rack-1.1.0/README | 396 -- Tests/Libraries/rack-1.1.0/Rakefile | 97 - .../rack-1.1.0/contrib/rack_logo.svg | 111 - Tests/Libraries/rack-1.1.0/example/lobster.ru | 4 - .../rack-1.1.0/example/protectedlobster.rb | 14 - .../rack-1.1.0/example/protectedlobster.ru | 8 - Tests/Libraries/rack-1.1.0/lib/rack.rb | 81 - .../rack-1.1.0/lib/rack/adapter/camping.rb | 22 - .../lib/rack/auth/abstract/handler.rb | 37 - .../lib/rack/auth/abstract/request.rb | 37 - .../rack-1.1.0/lib/rack/auth/basic.rb | 58 - .../rack-1.1.0/lib/rack/auth/digest/md5.rb | 124 - .../rack-1.1.0/lib/rack/auth/digest/nonce.rb | 51 - .../rack-1.1.0/lib/rack/auth/digest/params.rb | 55 - .../lib/rack/auth/digest/request.rb | 40 - .../Libraries/rack-1.1.0/lib/rack/builder.rb | 80 - .../Libraries/rack-1.1.0/lib/rack/cascade.rb | 41 - .../Libraries/rack-1.1.0/lib/rack/chunked.rb | 49 - .../rack-1.1.0/lib/rack/commonlogger.rb | 49 - .../rack-1.1.0/lib/rack/conditionalget.rb | 47 - Tests/Libraries/rack-1.1.0/lib/rack/config.rb | 15 - .../rack-1.1.0/lib/rack/content_length.rb | 29 - .../rack-1.1.0/lib/rack/content_type.rb | 23 - .../Libraries/rack-1.1.0/lib/rack/deflater.rb | 96 - .../rack-1.1.0/lib/rack/directory.rb | 157 - Tests/Libraries/rack-1.1.0/lib/rack/etag.rb | 32 - Tests/Libraries/rack-1.1.0/lib/rack/file.rb | 90 - .../Libraries/rack-1.1.0/lib/rack/handler.rb | 88 - .../rack-1.1.0/lib/rack/handler/cgi.rb | 61 - .../lib/rack/handler/evented_mongrel.rb | 8 - .../rack-1.1.0/lib/rack/handler/fastcgi.rb | 89 - .../rack-1.1.0/lib/rack/handler/lsws.rb | 63 - .../rack-1.1.0/lib/rack/handler/mongrel.rb | 90 - .../rack-1.1.0/lib/rack/handler/scgi.rb | 59 - .../lib/rack/handler/swiftiplied_mongrel.rb | 8 - .../rack-1.1.0/lib/rack/handler/thin.rb | 18 - .../rack-1.1.0/lib/rack/handler/webrick.rb | 73 - Tests/Libraries/rack-1.1.0/lib/rack/head.rb | 19 - Tests/Libraries/rack-1.1.0/lib/rack/lint.rb | 566 --- .../Libraries/rack-1.1.0/lib/rack/lobster.rb | 65 - Tests/Libraries/rack-1.1.0/lib/rack/lock.rb | 16 - Tests/Libraries/rack-1.1.0/lib/rack/logger.rb | 20 - .../rack-1.1.0/lib/rack/methodoverride.rb | 27 - Tests/Libraries/rack-1.1.0/lib/rack/mime.rb | 207 - Tests/Libraries/rack-1.1.0/lib/rack/mock.rb | 190 - .../rack-1.1.0/lib/rack/nulllogger.rb | 18 - .../rack-1.1.0/lib/rack/recursive.rb | 61 - .../Libraries/rack-1.1.0/lib/rack/reloader.rb | 109 - .../Libraries/rack-1.1.0/lib/rack/request.rb | 271 - .../Libraries/rack-1.1.0/lib/rack/response.rb | 149 - .../rack-1.1.0/lib/rack/rewindable_input.rb | 103 - .../Libraries/rack-1.1.0/lib/rack/runtime.rb | 27 - .../Libraries/rack-1.1.0/lib/rack/sendfile.rb | 142 - Tests/Libraries/rack-1.1.0/lib/rack/server.rb | 270 - .../lib/rack/session/abstract/id.rb | 140 - .../rack-1.1.0/lib/rack/session/cookie.rb | 90 - .../rack-1.1.0/lib/rack/session/memcache.rb | 119 - .../rack-1.1.0/lib/rack/session/pool.rb | 100 - .../rack-1.1.0/lib/rack/showexceptions.rb | 349 -- .../rack-1.1.0/lib/rack/showstatus.rb | 106 - Tests/Libraries/rack-1.1.0/lib/rack/static.rb | 38 - Tests/Libraries/rack-1.1.0/lib/rack/urlmap.rb | 56 - Tests/Libraries/rack-1.1.0/lib/rack/utils.rb | 648 --- Tests/Libraries/rack-1.1.0/rack.gemspec | 37 - .../rack-1.1.0/test/cgi/lighttpd.conf | 25 - .../rack-1.1.0/test/cgi/rackup_stub.rb | 6 - .../rack-1.1.0/test/cgi/sample_rackup.ru | 5 - Tests/Libraries/rack-1.1.0/test/cgi/test | 9 - Tests/Libraries/rack-1.1.0/test/cgi/test.fcgi | 8 - Tests/Libraries/rack-1.1.0/test/cgi/test.ru | 6 - .../rack-1.1.0/test/multipart/bad_robots | 259 - .../rack-1.1.0/test/multipart/binary | Bin 26667 -> 0 bytes .../Libraries/rack-1.1.0/test/multipart/empty | 10 - .../test/multipart/fail_16384_nofile | 814 --- .../rack-1.1.0/test/multipart/file1.txt | 1 - .../multipart/filename_and_modification_param | 7 - .../multipart/filename_with_escaped_quotes | 6 - ...with_escaped_quotes_and_modification_param | 7 - .../filename_with_percent_escaped_quotes | 6 - .../multipart/filename_with_unescaped_quotes | 6 - Tests/Libraries/rack-1.1.0/test/multipart/ie | 6 - .../rack-1.1.0/test/multipart/nested | 10 - .../Libraries/rack-1.1.0/test/multipart/none | 9 - .../rack-1.1.0/test/multipart/semicolon | 6 - .../Libraries/rack-1.1.0/test/multipart/text | 10 - .../rack-1.1.0/test/rackup/config.ru | 31 - .../rack-1.1.0/test/spec_rack_auth_basic.rb | 73 - .../rack-1.1.0/test/spec_rack_auth_digest.rb | 226 - .../rack-1.1.0/test/spec_rack_builder.rb | 84 - .../rack-1.1.0/test/spec_rack_camping.rb | 51 - .../rack-1.1.0/test/spec_rack_cascade.rb | 48 - .../rack-1.1.0/test/spec_rack_cgi.rb | 89 - .../rack-1.1.0/test/spec_rack_chunked.rb | 62 - .../rack-1.1.0/test/spec_rack_commonlogger.rb | 64 - .../test/spec_rack_conditionalget.rb | 41 - .../rack-1.1.0/test/spec_rack_config.rb | 24 - .../test/spec_rack_content_length.rb | 43 - .../rack-1.1.0/test/spec_rack_content_type.rb | 30 - .../rack-1.1.0/test/spec_rack_deflater.rb | 131 - .../rack-1.1.0/test/spec_rack_directory.rb | 61 - .../rack-1.1.0/test/spec_rack_etag.rb | 17 - .../rack-1.1.0/test/spec_rack_fastcgi.rb | 94 - .../rack-1.1.0/test/spec_rack_file.rb | 75 - .../rack-1.1.0/test/spec_rack_handler.rb | 43 - .../rack-1.1.0/test/spec_rack_head.rb | 30 - .../rack-1.1.0/test/spec_rack_lint.rb | 517 -- .../rack-1.1.0/test/spec_rack_lobster.rb | 45 - .../rack-1.1.0/test/spec_rack_lock.rb | 38 - .../rack-1.1.0/test/spec_rack_logger.rb | 21 - .../test/spec_rack_methodoverride.rb | 60 - .../rack-1.1.0/test/spec_rack_mock.rb | 243 - .../rack-1.1.0/test/spec_rack_mongrel.rb | 189 - .../rack-1.1.0/test/spec_rack_nulllogger.rb | 13 - .../rack-1.1.0/test/spec_rack_recursive.rb | 77 - .../rack-1.1.0/test/spec_rack_request.rb | 545 -- .../rack-1.1.0/test/spec_rack_response.rb | 223 - .../test/spec_rack_rewindable_input.rb | 118 - .../rack-1.1.0/test/spec_rack_runtime.rb | 41 - .../rack-1.1.0/test/spec_rack_sendfile.rb | 86 - .../test/spec_rack_session_cookie.rb | 73 - .../test/spec_rack_session_memcache.rb | 273 - .../rack-1.1.0/test/spec_rack_session_pool.rb | 172 - .../test/spec_rack_showexceptions.rb | 21 - .../rack-1.1.0/test/spec_rack_showstatus.rb | 72 - .../rack-1.1.0/test/spec_rack_static.rb | 37 - .../rack-1.1.0/test/spec_rack_thin.rb | 91 - .../rack-1.1.0/test/spec_rack_urlmap.rb | 215 - .../rack-1.1.0/test/spec_rack_utils.rb | 621 --- .../rack-1.1.0/test/spec_rack_webrick.rb | 130 - .../Libraries/rack-1.1.0/test/spec_rackup.rb | 164 - .../Libraries/rack-1.1.0/test/testrequest.rb | 72 - .../rack/handler/unregistered.rb | 7 - .../rack/handler/unregistered_long_one.rb | 7 - .../test-spec-0.10.0/examples/stack.rb | 38 - .../test-spec-0.10.0/examples/stack_spec.rb | 119 - .../test-spec-0.10.0/lib/test/spec.rb | 662 --- .../test-spec-0.10.0/lib/test/spec/dox.rb | 149 - .../test-spec-0.10.0/lib/test/spec/rdox.rb | 25 - .../lib/test/spec/should-output.rb | 49 - .../test-spec-0.10.0/lib/test/spec/version.rb | 8 - .../test-spec-0.10.0/test/spec_dox.rb | 39 - .../test-spec-0.10.0/test/spec_flexmock.rb | 209 - .../test-spec-0.10.0/test/spec_mocha.rb | 104 - .../test/spec_nestedcontexts.rb | 26 - .../test-spec-0.10.0/test/spec_new_style.rb | 80 - .../test/spec_should-output.rb | 26 - .../test-spec-0.10.0/test/spec_testspec.rb | 699 --- .../test/spec_testspec_order.rb | 26 - .../test-spec-0.10.0/test/test_testunit.rb | 22 - Tests/Scripts/adonet_sqlserver/connection.rb | 24 - Tests/Scripts/irtests.rb | 396 -- Tests/Scripts/irtests/failing_task.rb | 5 - Tests/Scripts/irtests/passing_task.rb | 5 - Tests/Scripts/native_sqlserver/connection.rb | 22 - Tests/Scripts/utr.rb | 233 - Tests/Scripts/utr/action_mailer_tests.rb | 38 - Tests/Scripts/utr/action_pack_tests.rb | 167 - Tests/Scripts/utr/active_record_tests.rb | 189 - Tests/Scripts/utr/active_resource_tests.rb | 166 - Tests/Scripts/utr/active_support_tests.rb | 232 - Tests/Scripts/utr/gem_tests.rb | 128 - Tests/Scripts/utr/rack_tests.rb | 258 - Tests/Scripts/utr/rake_tests.rb | 56 - Tests/Scripts/utr/test-spec_tests.rb | 49 - Tests/Scripts/utr/tzinfo_tests.rb | 27 - 1486 files changed, 356 insertions(+), 152914 deletions(-) delete mode 100644 Src/Scripts/irtests delete mode 100644 Src/Scripts/irtests.bat rename Src/StdLib/{ruby/1.9.1 => ironruby}/kconv.rb (89%) create mode 100644 Src/StdLib/ironruby/win32/resolv.rb delete mode 100644 Src/StdLib/ruby/1.9.1/debug.rb delete mode 100644 Src/StdLib/ruby/1.9.1/profile.rb delete mode 100644 Src/StdLib/ruby/1.9.1/profiler.rb delete mode 100644 Src/StdLib/ruby/1.9.1/tracer.rb delete mode 100644 Src/StdLib/ruby/1.9.1/win32/registry.rb delete mode 100644 Src/StdLib/ruby/1.9.1/win32/resolv.rb delete mode 100644 Src/StdLib/ruby/1.9.1/win32/sspi.rb delete mode 100644 Src/StdLib/ruby/1.9.1/win32ole/property.rb delete mode 100644 Tests/Libraries/ParseTreeTests/pt_testcase.rb delete mode 100644 Tests/Libraries/ParseTreeTests/something.rb delete mode 100644 Tests/Libraries/ParseTreeTests/test_parse_tree.rb delete mode 100644 Tests/Libraries/ParseTreeTests/test_parse_tree_extensions.rb delete mode 100644 Tests/Libraries/ParseTreeTests/test_unified_ruby.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/MIT-LICENSE delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/abstract_unit.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/base_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/delivery_methods_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/another.path/base_mailer/welcome.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/asset_host_mailer/email_with_asset.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/asset_mailer/welcome.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/attachments/foo.jpg delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/attachments/test.jpg delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/auto_layout_mailer/hello.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/auto_layout_mailer/multipart.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/auto_layout_mailer/multipart.text.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/attachment_with_content.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/different_layout.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/different_layout.text.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/email_custom_layout.text.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/email_with_translations.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/explicit_multipart_templates.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/explicit_multipart_templates.text.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/explicit_multipart_with_one_template.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/html_only.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/implicit_multipart.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/implicit_multipart.text.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/implicit_with_locale.en.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/implicit_with_locale.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/implicit_with_locale.pl.text.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/implicit_with_locale.text.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/inline_attachment.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/inline_attachment.text.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/plain_text_only.text.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/welcome.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/explicit_layout_mailer/logout.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/explicit_layout_mailer/signup.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/first_mailer/share.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/layouts/auto_layout_mailer.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/layouts/auto_layout_mailer.text.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/layouts/different_layout.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/layouts/different_layout.text.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/layouts/spam.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/nested_layout_mailer/signup.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/path.with.dots/funky_path_mailer/multipart_with_template_path_with_dots.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email10 delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email12 delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email13 delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email2 delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email3 delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email4 delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email5 delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email6 delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email7 delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email8 delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email9 delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email_quoted_with_0d0a delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email_with_invalid_characters_in_content_type delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email_with_nested_attachment delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email_with_partially_quoted_subject delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/second_mailer/share.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/templates/signed_up.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/_subtemplate.text.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/custom_templating_extension.html.haml delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/custom_templating_extension.text.haml delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.html.erb~ delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.ignored.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.text.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.yaml.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/included_subtemplate.text.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/multipart_alternative.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/multipart_alternative.plain.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/rxml_template.rxml delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/signed_up.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/url_test_mailer/signed_up_with_url.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/log_subscriber_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/mail_helper_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/mailers/asset_mailer.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/mailers/base_mailer.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/mailers/proc_mailer.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/old_base/adv_attr_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/old_base/asset_host_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/old_base/mail_layout_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/old_base/mail_render_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/old_base/mail_service_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/old_base/tmail_compat_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/old_base/url_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionmailer/test/test_helper_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/MIT-LICENSE delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/abstract_controller_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/callbacks_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/collector_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/helper_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/layouts_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/render_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/translation_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/views/abstract_controller/testing/me3/formatted.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/views/abstract_controller/testing/me3/index.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/views/abstract_controller/testing/me4/index.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/views/abstract_controller/testing/me5/index.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/views/action_with_ivars.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/views/helper_test.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/views/index.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/views/layouts/abstract_controller/testing/me4.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/views/layouts/application.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/views/naked_render.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/abstract_unit.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/active_record_unit.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/activerecord/active_record_store_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/activerecord/controller_runtime_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/activerecord/polymorphic_routes_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/activerecord/render_partial_with_record_identification_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/action_pack_assertions_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/addresses_render_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/assert_select_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/base_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/caching_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/capture_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/content_type_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/controller_fixtures/app/controllers/admin/user_controller.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/controller_fixtures/app/controllers/user_controller.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib/plugin_controller.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/deprecation/deprecated_base_methods_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/dispatcher_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/filters_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/flash_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/helper_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/http_basic_authentication_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/http_digest_authentication_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/http_token_authentication_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/integration_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/layout_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/localized_templates_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/log_subscriber_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/mime_responds_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/bare_metal_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/base_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/content_negotiation_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/content_type_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/etag_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/metal_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/middleware_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/render_action_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/render_file_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/render_implicit_action_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/render_layout_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/render_partial_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/render_rjs_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/render_template_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/render_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/render_text_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/render_xml_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/output_escaping_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/record_identifier_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/redirect_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/render_js_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/render_json_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/render_other_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/render_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/render_xml_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/request/test_request_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/request_forgery_protection_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/rescue_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/resources_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/routing_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/selector_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/send_file_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/test_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/url_for_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/url_rewriter_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/view_paths_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/controller/webservice_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/dispatch/callbacks_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/dispatch/cookies_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/dispatch/header_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/dispatch/middleware_stack_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/dispatch/mime_type_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/dispatch/mount_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/dispatch/rack_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/dispatch/request/json_params_parsing_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/dispatch/request/multipart_params_parsing_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/dispatch/request/query_string_parsing_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/dispatch/request/url_encoded_params_parsing_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/dispatch/request/xml_params_parsing_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/dispatch/request_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/dispatch/response_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/dispatch/routing_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/dispatch/session/cookie_store_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/dispatch/session/mem_cache_store_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/dispatch/session/test_session_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/dispatch/show_exceptions_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/dispatch/static_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/dispatch/test_request_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/dispatch/url_generation_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/_top_level_partial.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/_top_level_partial_only.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/addresses/list.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/alternate_helpers/foo_helper.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/bad_customers/_bad_customer.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/companies.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/company.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/customers/_customer.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/db_definitions/sqlite.sql delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/developer.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/developers.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/developers/_developer.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/developers_projects.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/fun/games/_form.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/fun/games/_game.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/fun/games/hello_world.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/fun/serious/games/_game.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/functional_caching/_partial.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/functional_caching/formatted_fragment_cached.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/functional_caching/formatted_fragment_cached.js.rjs delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/functional_caching/formatted_fragment_cached.xml.builder delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/functional_caching/fragment_cached.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/functional_caching/html_fragment_cached_with_partial.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/functional_caching/inline_fragment_cached.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/functional_caching/js_fragment_cached_with_partial.js.rjs delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/good_customers/_good_customer.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/happy_path/render_action/hello_world.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/hello.html delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/helpers/abc_helper.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/helpers/fun/games_helper.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/helpers/fun/pdf_helper.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/helpers/helpery_test_helper.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/helpers/just_me_helper.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/helpers/me_too_helper.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/layout_tests/alt/hello.rhtml delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/layout_tests/alt/layouts/alt.rhtml delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/layout_tests/layouts/item.rhtml delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/layout_tests/layouts/layout_test.rhtml delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/layout_tests/layouts/multiple_extensions.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/layout_tests/layouts/symlinked delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/layout_tests/layouts/third_party_template_library.mab delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/layout_tests/views/goodbye.rhtml delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/layout_tests/views/hello.rhtml delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/layouts/_column.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/layouts/_customers.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/layouts/block_with_layout.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/layouts/builder.builder delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/layouts/partial_with_layout.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/layouts/standard.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/layouts/talk_from_action.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/layouts/xhr.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/layouts/yield.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/layouts/yield_with_render_inline_inside.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/localized/hello_world.de.html delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/localized/hello_world.en.html delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/mascot.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/mascots.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/mascots/_mascot.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/multipart/binary_file delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/multipart/boundary_problem_file delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/multipart/bracketed_param delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/multipart/empty delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/multipart/hello.txt delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/multipart/large_text_file delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/multipart/mixed_files delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/multipart/mona_lisa.jpg delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/multipart/none delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/multipart/single_parameter delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/multipart/text_file delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/old_content_type/render_default_content_types_for_respond_to.xml.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/old_content_type/render_default_for_rhtml.rhtml delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/old_content_type/render_default_for_rjs.rjs delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/old_content_type/render_default_for_rxml.rxml delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/override/test/hello_world.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/override2/layouts/test/sub.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/post_test/layouts/post.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/post_test/layouts/super_post.iphone.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/post_test/post/index.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/post_test/post/index.iphone.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/post_test/super_post/index.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/post_test/super_post/index.iphone.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/project.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/projects.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/projects/_project.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/public/.gitignore delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/public/404.html delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/public/500.da.html delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/public/500.html delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/public/elsewhere/cools.js delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/public/elsewhere/file.css delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/public/foo/bar.html delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/public/foo/index.html delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/public/images/rails.png delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/public/index.html delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/public/javascripts/application.js delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/public/javascripts/bank.js delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/public/javascripts/common.javascript delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/public/javascripts/controls.js delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/public/javascripts/dragdrop.js delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/public/javascripts/effects.js delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/public/javascripts/prototype.js delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/public/javascripts/robber.js delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/public/javascripts/subdir/subdir.js delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/public/javascripts/version.1.0.js delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/public/stylesheets/bank.css delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/public/stylesheets/random.styles delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/public/stylesheets/robber.css delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/public/stylesheets/subdir/subdir.css delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/public/stylesheets/version.1.0.css delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/quiz/questions/_question.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/replies.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/replies/_reply.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/reply.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/respond_to/all_types_with_layout.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/respond_to/all_types_with_layout.js.rjs delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/respond_to/custom_constant_handling_without_block.mobile.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/respond_to/iphone_with_html_response_type.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/respond_to/iphone_with_html_response_type.iphone.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/respond_to/layouts/missing.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/respond_to/layouts/standard.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/respond_to/layouts/standard.iphone.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/respond_to/using_defaults.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/respond_to/using_defaults.js.rjs delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/respond_to/using_defaults.xml.builder delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/respond_to/using_defaults_with_type_list.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/respond_to/using_defaults_with_type_list.js.rjs delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/respond_to/using_defaults_with_type_list.xml.builder delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/respond_with/edit.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/respond_with/new.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/respond_with/using_resource.js.rjs delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/respond_with/using_resource_with_block.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/scope/test/modgreet.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/session_autoload_test/session_autoload_test/foo.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/shared.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/symlink_parent/symlinked_layout.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/_counter.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/_customer.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/_customer_counter.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/_customer_counter_with_as.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/_customer_greeting.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/_customer_with_var.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/_form.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/_from_helper.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/_hash_greeting.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/_hash_object.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/_hello.builder delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/_labelling_form.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/_layout_for_block_with_args.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/_layout_for_partial.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/_local_inspector.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/_one.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/_partial.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/_partial.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/_partial.js.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/_partial_for_use_in_layout.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/_partial_only.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/_partial_with_only_html_version.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/_person.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/_raise.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/_two.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/_utf8_partial.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/_utf8_partial_magic.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/action_talk_to_layout.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/basic.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/calling_partial_with_layout.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/capturing.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/content_for.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/content_for_concatenated.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/content_for_with_parameter.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/delete_with_js.rjs delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/deprecated_nested_layout.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/dont_pick_me delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/dot.directory/render_file_with_ivar.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/enum_rjs_test.rjs delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/formatted_html_erb.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/formatted_xml_erb.builder delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/formatted_xml_erb.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/formatted_xml_erb.xml.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/greeting.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/greeting.js.rjs delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/greeting.xml.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/hello.builder delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/hello_world.da.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/hello_world.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/hello_world.erb~ delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/hello_world.pt-BR.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/hello_world_container.builder delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/hello_world_from_rxml.builder delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/hello_world_with_layout_false.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/hello_xml_world.builder delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/hyphen-ated.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/implicit_content_type.atom.builder delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/layout_render_file.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/layout_render_object.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/list.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/malformed/malformed.en.html.erb~ delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/malformed/malformed.erb~ delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/malformed/malformed.html.erb~ delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/nested_layout.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/non_erb_block_content_for.builder delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/potential_conflicts.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/proper_block_detection.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/render_explicit_html_template.js.rjs delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/render_file_from_template.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/render_file_with_ivar.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/render_file_with_locals.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/render_file_with_locals_and_default.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/render_implicit_html_template.js.rjs delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/render_implicit_html_template_from_xhr_request.da.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/render_implicit_html_template_from_xhr_request.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/render_implicit_js_template_without_layout.js.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/render_to_string_test.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/scoped_translation.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/sub_template_raise.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/template.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/translation.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/update_element_with_capture.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/using_layout_around_block.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/utf8.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/utf8_magic.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/test/utf8_magic_with_bare_partial.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/topic.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/topics.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/fixtures/topics/_topic.html.erb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/lib/controller/fake_controllers.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/lib/controller/fake_models.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/lib/testing_sandbox.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/template/active_model_helper_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/template/asset_tag_helper_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/template/atom_feed_helper_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/template/capture_helper_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/template/compiled_templates_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/template/date_helper_i18n_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/template/date_helper_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/template/erb/form_for_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/template/erb/helper.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/template/erb/tag_helper_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/template/erb_util_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/template/form_helper_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/template/form_options_helper_i18n_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/template/form_options_helper_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/template/form_tag_helper_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/template/html-scanner/cdata_node_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/template/html-scanner/document_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/template/html-scanner/node_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/template/html-scanner/sanitizer_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/template/html-scanner/tag_node_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/template/html-scanner/text_node_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/template/html-scanner/tokenizer_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/template/javascript_helper_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/template/log_subscriber_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/template/lookup_context_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/template/number_helper_i18n_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/template/number_helper_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/template/output_buffer_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/template/prototype_helper_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/template/raw_output_helper_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/template/record_tag_helper_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/template/render_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/template/sanitize_helper_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/template/scriptaculous_helper_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/template/tag_helper_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/template/template_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/template/test_case_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/template/test_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/template/testing/fixture_resolver_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/template/testing/null_resolver_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/template/text_helper_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/template/translation_helper_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/template/url_helper_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/tmp/.gitignore delete mode 100644 Tests/Libraries/Rails-3.0.0/actionpack/test/ts_isolated.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activemodel/MIT-LICENSE delete mode 100644 Tests/Libraries/Rails-3.0.0/activemodel/test/cases/attribute_methods_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activemodel/test/cases/callbacks_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activemodel/test/cases/conversion_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activemodel/test/cases/dirty_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activemodel/test/cases/errors_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activemodel/test/cases/helper.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activemodel/test/cases/lint_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activemodel/test/cases/mass_assignment_security/black_list_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activemodel/test/cases/mass_assignment_security/permission_set_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activemodel/test/cases/mass_assignment_security/sanitizer_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activemodel/test/cases/mass_assignment_security/white_list_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activemodel/test/cases/mass_assignment_security_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activemodel/test/cases/naming_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activemodel/test/cases/observing_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activemodel/test/cases/serializeration/json_serialization_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activemodel/test/cases/serializeration/xml_serialization_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activemodel/test/cases/translation_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activemodel/test/cases/validations/acceptance_validation_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activemodel/test/cases/validations/callbacks_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activemodel/test/cases/validations/conditional_validation_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activemodel/test/cases/validations/confirmation_validation_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activemodel/test/cases/validations/exclusion_validation_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activemodel/test/cases/validations/format_validation_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activemodel/test/cases/validations/i18n_generate_message_validation_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activemodel/test/cases/validations/i18n_validation_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activemodel/test/cases/validations/inclusion_validation_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activemodel/test/cases/validations/length_validation_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activemodel/test/cases/validations/numericality_validation_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activemodel/test/cases/validations/presence_validation_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activemodel/test/cases/validations/validates_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activemodel/test/cases/validations/validations_context_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activemodel/test/cases/validations/with_validation_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activemodel/test/cases/validations_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activemodel/test/config.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activemodel/test/models/automobile.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activemodel/test/models/contact.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activemodel/test/models/custom_reader.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activemodel/test/models/mass_assignment_specific.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activemodel/test/models/person.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activemodel/test/models/person_with_validator.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activemodel/test/models/reply.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activemodel/test/models/sheep.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activemodel/test/models/topic.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activemodel/test/models/track_back.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activemodel/test/validators/email_validator.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/MIT-LICENSE delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/assets/example.log delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/assets/flowers.jpg delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/adapter_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/adapters/firebird/connection_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/adapters/firebird/default_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/adapters/firebird/migration_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/adapters/mysql/active_schema_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/adapters/mysql/connection_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/adapters/mysql/reserved_word_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/adapters/mysql/sp_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/adapters/mysql2/active_schema_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/adapters/mysql2/connection_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/adapters/mysql2/reserved_word_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/adapters/oracle/synonym_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/adapters/postgresql/active_schema_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/adapters/postgresql/datatype_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/adapters/postgresql/postgresql_adapter_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/adapters/postgresql/schema_authorization_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/adapters/postgresql/schema_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/adapters/sqlite/sqlite_adapter_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/adapters/sqlite3/copy_table_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/aggregations_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/ar_schema_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/associations/belongs_to_associations_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/associations/callbacks_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/associations/cascaded_eager_loading_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/associations/eager_load_includes_full_sti_class_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/associations/eager_load_nested_include_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/associations/eager_singularization_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/associations/eager_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/associations/extension_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/associations/habtm_join_table_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/associations/has_and_belongs_to_many_associations_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/associations/has_many_associations_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/associations/has_many_through_associations_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/associations/has_one_associations_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/associations/has_one_through_associations_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/associations/inner_join_association_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/associations/inverse_associations_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/associations/join_model_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/associations_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/attribute_methods_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/autosave_association_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/base_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/batches_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/binary_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/calculations_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/callbacks_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/column_alias_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/column_definition_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/connection_management_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/connection_pool_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/counter_cache_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/database_statements_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/date_time_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/defaults_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/deprecated_finder_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/dirty_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/finder_respond_to_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/finder_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/fixtures_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/helper.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/i18n_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/inheritance_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/invalid_date_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/json_serialization_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/lifecycle_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/locking_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/log_subscriber_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/mass_assignment_security_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/method_scoping_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/migration_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/mixin_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/modules_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/multiple_db_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/named_scope_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/nested_attributes_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/persistence_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/pooled_connections_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/primary_keys_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/query_cache_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/readonly_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/reflection_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/relation_scoping_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/relations_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/reload_models_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/sanitize_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/schema_dumper_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/serialization_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/session_store/session_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/session_store/sql_bypass.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/timestamp_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/transaction_callbacks_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/transactions_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/unconnected_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/validations/association_validation_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/validations/i18n_generate_message_validation_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/validations/i18n_validation_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/validations/uniqueness_validation_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/validations_repair_helper.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/validations_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/xml_serialization_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/cases/yaml_serialization_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/config.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/connections/jdbc_jdbcderby/connection.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/connections/jdbc_jdbch2/connection.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/connections/jdbc_jdbchsqldb/connection.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/connections/jdbc_jdbcmysql/connection.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/connections/jdbc_jdbcpostgresql/connection.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/connections/jdbc_jdbcsqlite3/connection.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/connections/native_db2/connection.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/connections/native_firebird/connection.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/connections/native_frontbase/connection.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/connections/native_mysql/connection.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/connections/native_mysql2/connection.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/connections/native_openbase/connection.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/connections/native_oracle/connection.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/connections/native_postgresql/connection.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/connections/native_sqlite3/connection.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/connections/native_sqlite3/in_memory_connection.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/connections/native_sybase/connection.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/.gitignore delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/accounts.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/admin/accounts.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/admin/users.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/all/developers.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/all/people.csv delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/all/tasks.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/author_addresses.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/author_favorites.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/authors.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/binaries.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/books.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/cars.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/categories.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/categories/special_categories.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/categories/subsubdir/arbitrary_filename.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/categories_ordered.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/categories_posts.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/categorizations.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/clubs.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/collections.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/comments.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/companies.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/computers.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/courses.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/customers.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/dashboards.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/developers.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/developers_projects.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/edges.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/entrants.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/faces.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/fk_test_has_fk.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/fk_test_has_pk.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/funny_jokes.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/interests.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/items.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/jobs.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/legacy_things.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/mateys.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/member_types.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/members.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/memberships.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/men.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/minimalistics.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/minivans.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/mixed_case_monkeys.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/mixins.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/movies.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/naked/csv/accounts.csv delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/naked/yml/accounts.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/naked/yml/companies.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/naked/yml/courses.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/organizations.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/owners.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/parrots.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/parrots_pirates.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/people.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/pets.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/pirates.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/posts.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/price_estimates.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/products.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/projects.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/readers.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/references.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/reserved_words/distinct.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/reserved_words/distincts_selects.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/reserved_words/group.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/reserved_words/select.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/reserved_words/values.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/ships.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/speedometers.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/sponsors.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/subscribers.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/subscriptions.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/taggings.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/tags.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/tasks.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/topics.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/toys.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/treasures.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/variants.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/vertices.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/warehouse-things.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/fixtures/zines.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/migrations/broken/100_migration_that_raises_exception.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/migrations/decimal/1_give_me_big_numbers.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/migrations/duplicate/1_people_have_last_names.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/migrations/duplicate/2_we_need_reminders.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/migrations/duplicate/3_foo.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/migrations/duplicate/3_innocent_jointable.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/migrations/duplicate_names/20080507052938_chunky.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/migrations/duplicate_names/20080507053028_chunky.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/migrations/interleaved/pass_1/3_innocent_jointable.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/migrations/interleaved/pass_2/1_people_have_last_names.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/migrations/interleaved/pass_2/3_innocent_jointable.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/migrations/interleaved/pass_3/1_people_have_last_names.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/migrations/interleaved/pass_3/2_i_raise_on_down.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/migrations/interleaved/pass_3/3_innocent_jointable.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/migrations/missing/1000_people_have_middle_names.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/migrations/missing/1_people_have_last_names.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/migrations/missing/3_we_need_reminders.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/migrations/missing/4_innocent_jointable.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/migrations/valid/1_people_have_last_names.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/migrations/valid/2_we_need_reminders.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/migrations/valid/3_innocent_jointable.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/admin.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/admin/account.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/admin/user.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/author.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/auto_id.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/binary.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/bird.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/book.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/boolean.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/bulb.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/car.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/categorization.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/category.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/citation.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/club.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/column_name.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/comment.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/company.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/company_in_module.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/computer.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/contact.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/contract.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/country.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/course.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/customer.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/dashboard.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/default.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/developer.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/edge.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/electron.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/engine.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/entrant.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/essay.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/event.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/face.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/guid.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/interest.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/invoice.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/item.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/job.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/joke.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/keyboard.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/legacy_thing.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/line_item.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/liquid.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/loose_person.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/man.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/matey.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/member.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/member_detail.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/member_type.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/membership.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/minimalistic.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/minivan.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/mixed_case_monkey.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/molecule.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/movie.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/order.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/organization.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/owner.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/parrot.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/person.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/pet.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/pirate.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/post.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/price_estimate.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/project.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/reader.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/reference.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/reply.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/ship.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/ship_part.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/shop.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/speedometer.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/sponsor.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/subject.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/subscriber.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/subscription.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/tag.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/tagging.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/task.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/topic.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/toy.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/treasure.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/treaty.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/tyre.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/vertex.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/warehouse_thing.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/wheel.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/without_table.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/models/zine.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/schema/mysql2_specific_schema.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/schema/mysql_specific_schema.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/schema/oracle_specific_schema.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/schema/postgresql_specific_schema.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/schema/schema.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activerecord/test/schema/sqlite_specific_schema.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activeresource/MIT-LICENSE delete mode 100644 Tests/Libraries/Rails-3.0.0/activeresource/test/abstract_unit.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activeresource/test/cases/authorization_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activeresource/test/cases/base/custom_methods_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activeresource/test/cases/base/equality_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activeresource/test/cases/base/load_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activeresource/test/cases/base/schema_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activeresource/test/cases/base_errors_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activeresource/test/cases/base_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activeresource/test/cases/finder_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activeresource/test/cases/format_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activeresource/test/cases/http_mock_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activeresource/test/cases/log_subscriber_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activeresource/test/cases/observing_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activeresource/test/cases/validations_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activeresource/test/connection_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activeresource/test/fixtures/beast.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activeresource/test/fixtures/customer.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activeresource/test/fixtures/person.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activeresource/test/fixtures/project.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activeresource/test/fixtures/proxy.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activeresource/test/fixtures/sound.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activeresource/test/fixtures/street_address.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activeresource/test/setter_trap.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/MIT-LICENSE delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/abstract_unit.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/autoload.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/autoloading_fixtures/a/b.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/autoloading_fixtures/a/c/d.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/autoloading_fixtures/a/c/e/f.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/autoloading_fixtures/application.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/autoloading_fixtures/class_folder.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/autoloading_fixtures/class_folder/class_folder_subclass.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/autoloading_fixtures/class_folder/inline_class.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/autoloading_fixtures/class_folder/nested_class.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/autoloading_fixtures/conflict.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/autoloading_fixtures/counting_loader.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/autoloading_fixtures/cross_site_dependency.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/autoloading_fixtures/e.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/autoloading_fixtures/load_path/loaded_constant.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/autoloading_fixtures/loads_constant.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/autoloading_fixtures/module_folder/inline_class.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/autoloading_fixtures/module_folder/nested_class.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/autoloading_fixtures/module_folder/nested_sibling.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/autoloading_fixtures/module_with_custom_const_missing/a/b.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/autoloading_fixtures/multiple_constant_file.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/autoloading_fixtures/raises_name_error.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/autoloading_fixtures/raises_no_method_error.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/autoloading_fixtures/requires_constant.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/benchmarkable_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/buffered_logger_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/caching_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/callback_inheritance_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/callbacks_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/clean_backtrace_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/clean_logger_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/concern_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/configurable_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/core_ext/array_ext_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/core_ext/base64_ext_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/core_ext/bigdecimal.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/core_ext/blank_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/core_ext/cgi_ext_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/core_ext/class/attribute_accessor_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/core_ext/class/attribute_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/core_ext/class/class_inheritable_attributes_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/core_ext/class/delegating_attributes_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/core_ext/class_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/core_ext/date_ext_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/core_ext/date_time_ext_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/core_ext/duplicable_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/core_ext/duration_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/core_ext/enumerable_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/core_ext/file_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/core_ext/float_ext_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/core_ext/hash_ext_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/core_ext/integer_ext_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/core_ext/kernel_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/core_ext/load_error_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/core_ext/module/anonymous_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/core_ext/module/attr_accessor_with_default_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/core_ext/module/attr_internal_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/core_ext/module/attribute_accessor_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/core_ext/module/attribute_aliasing_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/core_ext/module/reachable_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/core_ext/module/synchronization_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/core_ext/module_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/core_ext/name_error_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/core_ext/numeric_ext_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/core_ext/object/to_param_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/core_ext/object/to_query_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/core_ext/object_and_class_ext_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/core_ext/proc_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/core_ext/range_ext_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/core_ext/regexp_ext_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/core_ext/string_ext_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/core_ext/time_ext_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/core_ext/time_with_zone_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/core_ext/uri_ext_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/dependencies/check_warnings.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/dependencies/conflict.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/dependencies/cross_site_depender.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/dependencies/mutual_one.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/dependencies/mutual_two.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/dependencies/raises_exception.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/dependencies/requires_nonexistent0.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/dependencies/requires_nonexistent1.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/dependencies/service_one.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/dependencies/service_two.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/dependencies_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/deprecation/proxy_wrappers_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/deprecation_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/descendants_tracker_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/empty_bool.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/file_update_checker_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/fixtures/autoload/another_class.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/fixtures/autoload/some_class.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/fixtures/custom.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/flush_cache_on_private_memoization_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/gzip_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/i18n_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/inflector_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/inflector_test_cases.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/isolation_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/json/decoding_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/json/encoding_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/lazy_load_hooks_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/load_paths_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/log_subscriber_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/memoizable_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/message_encryptor_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/message_verifier_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/multibyte_chars_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/multibyte_conformance.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/multibyte_test_helpers.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/multibyte_unicode_database_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/multibyte_utils_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/notifications_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/option_merger_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/ordered_hash_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/ordered_options_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/rescuable_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/safe_buffer_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/secure_random_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/string_inquirer_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/test_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/test_xml_mini.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/time_zone_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/transliterate_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/ts_isolated.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/whiny_nil_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/xml_mini/jdom_engine_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/xml_mini/libxml_engine_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/xml_mini/libxmlsax_engine_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/xml_mini/nokogiri_engine_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/xml_mini/nokogirisax_engine_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/activesupport/test/xml_mini/rexml_engine_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/load_paths.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/MIT-LICENSE delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/abstract_unit.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/application/configuration_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/application/console_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/application/generators_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/application/initializers/boot_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/application/initializers/check_ruby_version_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/application/initializers/frameworks_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/application/initializers/hooks_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/application/initializers/i18n_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/application/initializers/load_path_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/application/initializers/notifications_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/application/loading_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/application/middleware_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/application/paths_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/application/rackup_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/application/rake_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/application/routing_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/application/runner_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/application/test_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/application/url_generation_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/backtrace_cleaner_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/fixtures/about_yml_plugins/bad_about_yml/about.yml delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/fixtures/about_yml_plugins/bad_about_yml/init.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/fixtures/about_yml_plugins/plugin_without_about_yml/init.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/fixtures/lib/empty_builder.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/fixtures/lib/generators/active_record/fixjour_generator.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/fixtures/lib/generators/fixjour_generator.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/fixtures/lib/generators/model_generator.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/fixtures/lib/generators/wrong_generator.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/fixtures/lib/rails/generators/foobar/foobar_generator.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/fixtures/lib/simple_builder.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/fixtures/lib/template.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/fixtures/lib/tweak_builder.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/generators/actions_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/generators/app_generator_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/generators/controller_generator_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/generators/generated_attribute_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/generators/generator_generator_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/generators/generators_test_helper.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/generators/helper_generator_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/generators/integration_test_generator_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/generators/mailer_generator_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/generators/migration_generator_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/generators/model_generator_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/generators/named_base_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/generators/observer_generator_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/generators/performance_test_generator_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/generators/plugin_generator_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/generators/resource_generator_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/generators/scaffold_controller_generator_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/generators/scaffold_generator_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/generators/session_migration_generator_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/generators/stylesheets_generator_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/generators_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/initializable_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/isolation/abstract_unit.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/paths_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/rails_info_controller_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/rails_info_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/railties/engine_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/railties/plugin_ordering_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/railties/plugin_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/railties/railtie_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/railties/shared_tests.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/railties/test/script_rails_loader_test.rb delete mode 100644 Tests/Libraries/Rails-3.0.0/source.txt delete mode 100644 Tests/Libraries/Rake-0.8.7/test/capture_stdout.rb delete mode 100644 Tests/Libraries/Rake-0.8.7/test/check_expansion.rb delete mode 100644 Tests/Libraries/Rake-0.8.7/test/check_no_expansion.rb delete mode 100644 Tests/Libraries/Rake-0.8.7/test/contrib/test_sys.rb delete mode 100644 Tests/Libraries/Rake-0.8.7/test/data/chains/.cvsignore delete mode 100644 Tests/Libraries/Rake-0.8.7/test/data/chains/Rakefile delete mode 100644 Tests/Libraries/Rake-0.8.7/test/data/default/Rakefile delete mode 100644 Tests/Libraries/Rake-0.8.7/test/data/dryrun/.cvsignore delete mode 100644 Tests/Libraries/Rake-0.8.7/test/data/dryrun/Rakefile delete mode 100644 Tests/Libraries/Rake-0.8.7/test/data/file_creation_task/.cvsignore delete mode 100644 Tests/Libraries/Rake-0.8.7/test/data/file_creation_task/.gitignore delete mode 100644 Tests/Libraries/Rake-0.8.7/test/data/file_creation_task/Rakefile delete mode 100644 Tests/Libraries/Rake-0.8.7/test/data/imports/.cvsignore delete mode 100644 Tests/Libraries/Rake-0.8.7/test/data/imports/Rakefile delete mode 100644 Tests/Libraries/Rake-0.8.7/test/data/imports/deps.mf delete mode 100644 Tests/Libraries/Rake-0.8.7/test/data/multidesc/Rakefile delete mode 100644 Tests/Libraries/Rake-0.8.7/test/data/namespace/Rakefile delete mode 100644 Tests/Libraries/Rake-0.8.7/test/data/nosearch/dummy delete mode 100644 Tests/Libraries/Rake-0.8.7/test/data/rakelib/test1.rb delete mode 100644 Tests/Libraries/Rake-0.8.7/test/data/rakelib/test2.rake delete mode 100644 Tests/Libraries/Rake-0.8.7/test/data/rbext/rakefile.rb delete mode 100644 Tests/Libraries/Rake-0.8.7/test/data/sample.mf delete mode 100644 Tests/Libraries/Rake-0.8.7/test/data/statusreturn/Rakefile delete mode 100644 Tests/Libraries/Rake-0.8.7/test/data/sys/sys1.rake delete mode 100644 Tests/Libraries/Rake-0.8.7/test/data/unittest/Rakefile delete mode 100644 Tests/Libraries/Rake-0.8.7/test/data/unittest/subdir/README delete mode 100644 Tests/Libraries/Rake-0.8.7/test/filecreation.rb delete mode 100644 Tests/Libraries/Rake-0.8.7/test/functional.rb delete mode 100644 Tests/Libraries/Rake-0.8.7/test/in_environment.rb delete mode 100644 Tests/Libraries/Rake-0.8.7/test/rake_test_setup.rb delete mode 100644 Tests/Libraries/Rake-0.8.7/test/reqfile.rb delete mode 100644 Tests/Libraries/Rake-0.8.7/test/reqfile2.rb delete mode 100644 Tests/Libraries/Rake-0.8.7/test/reqfile3.rake delete mode 100644 Tests/Libraries/Rake-0.8.7/test/session_functional.rb delete mode 100644 Tests/Libraries/Rake-0.8.7/test/shellcommand.rb delete mode 100644 Tests/Libraries/Rake-0.8.7/test/test_application.rb delete mode 100644 Tests/Libraries/Rake-0.8.7/test/test_clean.rb delete mode 100644 Tests/Libraries/Rake-0.8.7/test/test_definitions.rb delete mode 100644 Tests/Libraries/Rake-0.8.7/test/test_earlytime.rb delete mode 100644 Tests/Libraries/Rake-0.8.7/test/test_extension.rb delete mode 100644 Tests/Libraries/Rake-0.8.7/test/test_file_creation_task.rb delete mode 100644 Tests/Libraries/Rake-0.8.7/test/test_file_task.rb delete mode 100644 Tests/Libraries/Rake-0.8.7/test/test_filelist.rb delete mode 100644 Tests/Libraries/Rake-0.8.7/test/test_fileutils.rb delete mode 100644 Tests/Libraries/Rake-0.8.7/test/test_ftp.rb delete mode 100644 Tests/Libraries/Rake-0.8.7/test/test_invocation_chain.rb delete mode 100644 Tests/Libraries/Rake-0.8.7/test/test_makefile_loader.rb delete mode 100644 Tests/Libraries/Rake-0.8.7/test/test_multitask.rb delete mode 100644 Tests/Libraries/Rake-0.8.7/test/test_namespace.rb delete mode 100644 Tests/Libraries/Rake-0.8.7/test/test_package_task.rb delete mode 100644 Tests/Libraries/Rake-0.8.7/test/test_pathmap.rb delete mode 100644 Tests/Libraries/Rake-0.8.7/test/test_pseudo_status.rb delete mode 100644 Tests/Libraries/Rake-0.8.7/test/test_rake.rb delete mode 100644 Tests/Libraries/Rake-0.8.7/test/test_rdoc_task.rb delete mode 100644 Tests/Libraries/Rake-0.8.7/test/test_require.rb delete mode 100644 Tests/Libraries/Rake-0.8.7/test/test_rules.rb delete mode 100644 Tests/Libraries/Rake-0.8.7/test/test_task_arguments.rb delete mode 100644 Tests/Libraries/Rake-0.8.7/test/test_task_manager.rb delete mode 100644 Tests/Libraries/Rake-0.8.7/test/test_tasklib.rb delete mode 100644 Tests/Libraries/Rake-0.8.7/test/test_tasks.rb delete mode 100644 Tests/Libraries/Rake-0.8.7/test/test_test_task.rb delete mode 100644 Tests/Libraries/Rake-0.8.7/test/test_top_level_functions.rb delete mode 100644 Tests/Libraries/Rake-0.8.7/test/test_win32.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/bogussources.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/data/gem-private_key.pem delete mode 100644 Tests/Libraries/RubyGems-1.3.7/data/gem-public_cert.pem delete mode 100644 Tests/Libraries/RubyGems-1.3.7/fake_certlib/openssl.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/foo/discover.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/functional.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/gem_installer_test_case.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/gem_package_tar_test_case.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/gemutilities.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/insure_session.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/mockgemui.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/plugin/exception/rubygems_plugin.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/plugin/load/rubygems_plugin.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/plugin/standarderror/rubygems_plugin.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/private_key.pem delete mode 100644 Tests/Libraries/RubyGems-1.3.7/public_cert.pem delete mode 100644 Tests/Libraries/RubyGems-1.3.7/rubygems/commands/crash_command.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/rubygems_plugin.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/simple_gem.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_config.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_builder.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_command.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_command_manager.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_commands_build_command.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_commands_cert_command.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_commands_check_command.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_commands_contents_command.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_commands_dependency_command.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_commands_environment_command.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_commands_fetch_command.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_commands_generate_index_command.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_commands_install_command.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_commands_list_command.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_commands_lock_command.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_commands_mirror_command.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_commands_outdated_command.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_commands_owner_command.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_commands_pristine_command.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_commands_push_command.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_commands_query_command.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_commands_server_command.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_commands_sources_command.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_commands_specification_command.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_commands_stale_command.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_commands_uninstall_command.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_commands_unpack_command.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_commands_update_command.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_commands_which_command.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_config_file.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_dependency.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_dependency_installer.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_dependency_list.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_doc_manager.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_ext_configure_builder.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_ext_ext_conf_builder.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_ext_rake_builder.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_format.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_gem_path_searcher.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_gem_runner.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_gemcutter_utilities.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_indexer.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_install_update_options.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_installer.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_local_remote_options.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_package_tar_header.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_package_tar_input.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_package_tar_output.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_package_tar_reader.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_package_tar_reader_entry.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_package_tar_writer.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_package_task.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_platform.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_remote_fetcher.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_requirement.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_server.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_source_index.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_spec_fetcher.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_specification.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_stream_ui.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_uninstaller.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_validator.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_version.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_gem_version_option.rb delete mode 100644 Tests/Libraries/RubyGems-1.3.7/test_kernel.rb delete mode 100644 Tests/Libraries/TZInfoTests/tc_country.rb delete mode 100644 Tests/Libraries/TZInfoTests/tc_country_index_definition.rb delete mode 100644 Tests/Libraries/TZInfoTests/tc_country_info.rb delete mode 100644 Tests/Libraries/TZInfoTests/tc_country_timezone.rb delete mode 100644 Tests/Libraries/TZInfoTests/tc_data_timezone.rb delete mode 100644 Tests/Libraries/TZInfoTests/tc_data_timezone_info.rb delete mode 100644 Tests/Libraries/TZInfoTests/tc_info_timezone.rb delete mode 100644 Tests/Libraries/TZInfoTests/tc_linked_timezone.rb delete mode 100644 Tests/Libraries/TZInfoTests/tc_linked_timezone_info.rb delete mode 100644 Tests/Libraries/TZInfoTests/tc_offset_rationals.rb delete mode 100644 Tests/Libraries/TZInfoTests/tc_ruby_core_support.rb delete mode 100644 Tests/Libraries/TZInfoTests/tc_time_or_datetime.rb delete mode 100644 Tests/Libraries/TZInfoTests/tc_timezone.rb delete mode 100644 Tests/Libraries/TZInfoTests/tc_timezone_definition.rb delete mode 100644 Tests/Libraries/TZInfoTests/tc_timezone_index_definition.rb delete mode 100644 Tests/Libraries/TZInfoTests/tc_timezone_info.rb delete mode 100644 Tests/Libraries/TZInfoTests/tc_timezone_london.rb delete mode 100644 Tests/Libraries/TZInfoTests/tc_timezone_melbourne.rb delete mode 100644 Tests/Libraries/TZInfoTests/tc_timezone_new_york.rb delete mode 100644 Tests/Libraries/TZInfoTests/tc_timezone_offset_info.rb delete mode 100644 Tests/Libraries/TZInfoTests/tc_timezone_period.rb delete mode 100644 Tests/Libraries/TZInfoTests/tc_timezone_proxy.rb delete mode 100644 Tests/Libraries/TZInfoTests/tc_timezone_transition_info.rb delete mode 100644 Tests/Libraries/TZInfoTests/tc_timezone_utc.rb delete mode 100644 Tests/Libraries/TZInfoTests/test_utils.rb delete mode 100644 Tests/Libraries/TZInfoTests/ts_all.rb delete mode 100644 Tests/Libraries/Yaml/collections_tests.rb delete mode 100644 Tests/Libraries/Yaml/dump_tests.rb delete mode 100644 Tests/Libraries/Yaml/load_documents_tests.rb delete mode 100644 Tests/Libraries/Yaml/load_file_tests.rb delete mode 100644 Tests/Libraries/Yaml/load_stream_tests.rb delete mode 100644 Tests/Libraries/Yaml/load_tests.rb delete mode 100644 Tests/Libraries/Yaml/run.bat delete mode 100644 Tests/Libraries/Yaml/tags_tests.rb delete mode 100644 Tests/Libraries/Yaml/test_yaml.rb delete mode 100644 Tests/Libraries/Yaml/yaml/rails_database.yml delete mode 100644 Tests/Libraries/Yaml/yaml/readme.txt delete mode 100644 Tests/Libraries/Yaml/yaml/test_duplicatekey.yml delete mode 100644 Tests/Libraries/Yaml/yaml/wp_datatypes.yml delete mode 100644 Tests/Libraries/Yaml/yaml/wp_hashes.yml delete mode 100644 Tests/Libraries/Yaml/yaml/wp_indenteddelim.yml delete mode 100644 Tests/Libraries/Yaml/yaml/wp_lists.yml delete mode 100644 Tests/Libraries/Yaml/yaml/wp_listshashes.yml delete mode 100644 Tests/Libraries/Yaml/yaml/wp_mergesreferences.yml delete mode 100644 Tests/Libraries/Yaml/yaml/wp_newlinesfolded.yml delete mode 100644 Tests/Libraries/Yaml/yaml/wp_newlinespreserved.yml delete mode 100644 Tests/Libraries/Yaml/yaml/wp_sample.yml delete mode 100644 Tests/Libraries/Yaml/yaml/yamlorg_index.yml delete mode 100644 Tests/Libraries/Yaml/yaml/yamlorg_refcard.yml delete mode 100644 Tests/Libraries/Yaml/yaml/yamlorg_start.yml delete mode 100644 Tests/Libraries/Yaml/yaml/yts_basictests.yml delete mode 100644 Tests/Libraries/Yaml/yaml/yts_blockmapping.yml delete mode 100644 Tests/Libraries/Yaml/yaml/yts_simpleblockseq.yml delete mode 100644 Tests/Libraries/Yaml/yaml/yts_strangekeys.yml delete mode 100644 Tests/Libraries/Yaml/yaml_test_suite.rb delete mode 100644 Tests/Libraries/activerecord-sqlserver-adapter-3.0.0/Gemfile delete mode 100644 Tests/Libraries/activerecord-sqlserver-adapter-3.0.0/MIT-LICENSE delete mode 100644 Tests/Libraries/activerecord-sqlserver-adapter-3.0.0/RUNNING_UNIT_TESTS delete mode 100644 Tests/Libraries/activerecord-sqlserver-adapter-3.0.0/test/cases/aaaa_create_tables_test_sqlserver.rb delete mode 100644 Tests/Libraries/activerecord-sqlserver-adapter-3.0.0/test/cases/adapter_test_sqlserver.rb delete mode 100644 Tests/Libraries/activerecord-sqlserver-adapter-3.0.0/test/cases/attribute_methods_test_sqlserver.rb delete mode 100644 Tests/Libraries/activerecord-sqlserver-adapter-3.0.0/test/cases/base_test_sqlserver.rb delete mode 100644 Tests/Libraries/activerecord-sqlserver-adapter-3.0.0/test/cases/belongs_to_associations_test_sqlserver.rb delete mode 100644 Tests/Libraries/activerecord-sqlserver-adapter-3.0.0/test/cases/calculations_test_sqlserver.rb delete mode 100644 Tests/Libraries/activerecord-sqlserver-adapter-3.0.0/test/cases/column_test_sqlserver.rb delete mode 100644 Tests/Libraries/activerecord-sqlserver-adapter-3.0.0/test/cases/connection_test_sqlserver.rb delete mode 100644 Tests/Libraries/activerecord-sqlserver-adapter-3.0.0/test/cases/eager_test_sqlserver.rb delete mode 100644 Tests/Libraries/activerecord-sqlserver-adapter-3.0.0/test/cases/execute_procedure_test_sqlserver.rb delete mode 100644 Tests/Libraries/activerecord-sqlserver-adapter-3.0.0/test/cases/finder_test_sqlserver.rb delete mode 100644 Tests/Libraries/activerecord-sqlserver-adapter-3.0.0/test/cases/has_and_belongs_to_many_associations_test_sqlserver.rb delete mode 100644 Tests/Libraries/activerecord-sqlserver-adapter-3.0.0/test/cases/inheritance_test_sqlserver.rb delete mode 100644 Tests/Libraries/activerecord-sqlserver-adapter-3.0.0/test/cases/method_scoping_test_sqlserver.rb delete mode 100644 Tests/Libraries/activerecord-sqlserver-adapter-3.0.0/test/cases/migration_test_sqlserver.rb delete mode 100644 Tests/Libraries/activerecord-sqlserver-adapter-3.0.0/test/cases/offset_and_limit_test_sqlserver.rb delete mode 100644 Tests/Libraries/activerecord-sqlserver-adapter-3.0.0/test/cases/pessimistic_locking_test_sqlserver.rb delete mode 100644 Tests/Libraries/activerecord-sqlserver-adapter-3.0.0/test/cases/query_cache_test_sqlserver.rb delete mode 100644 Tests/Libraries/activerecord-sqlserver-adapter-3.0.0/test/cases/schema_dumper_test_sqlserver.rb delete mode 100644 Tests/Libraries/activerecord-sqlserver-adapter-3.0.0/test/cases/session_test_sqlserver.rb delete mode 100644 Tests/Libraries/activerecord-sqlserver-adapter-3.0.0/test/cases/specific_schema_test_sqlserver.rb delete mode 100644 Tests/Libraries/activerecord-sqlserver-adapter-3.0.0/test/cases/sqlserver_helper.rb delete mode 100644 Tests/Libraries/activerecord-sqlserver-adapter-3.0.0/test/cases/table_name_test_sqlserver.rb delete mode 100644 Tests/Libraries/activerecord-sqlserver-adapter-3.0.0/test/cases/transaction_test_sqlserver.rb delete mode 100644 Tests/Libraries/activerecord-sqlserver-adapter-3.0.0/test/cases/unicode_test_sqlserver.rb delete mode 100644 Tests/Libraries/activerecord-sqlserver-adapter-3.0.0/test/cases/uniqueness_validation_test_sqlserver.rb delete mode 100644 Tests/Libraries/activerecord-sqlserver-adapter-3.0.0/test/connections/native_sqlserver/connection.rb delete mode 100644 Tests/Libraries/activerecord-sqlserver-adapter-3.0.0/test/connections/native_sqlserver_odbc/connection.rb delete mode 100644 Tests/Libraries/activerecord-sqlserver-adapter-3.0.0/test/migrations/transaction_table/1_table_will_never_be_created.rb delete mode 100644 Tests/Libraries/activerecord-sqlserver-adapter-3.0.0/test/profile/connection_profile_case.rb delete mode 100644 Tests/Libraries/activerecord-sqlserver-adapter-3.0.0/test/profile/finder_profile_case.rb delete mode 100644 Tests/Libraries/activerecord-sqlserver-adapter-3.0.0/test/profile/helper.rb delete mode 100644 Tests/Libraries/activerecord-sqlserver-adapter-3.0.0/test/schema/sqlserver_specific_schema.rb delete mode 100644 Tests/Libraries/rack-1.1.0/COPYING delete mode 100644 Tests/Libraries/rack-1.1.0/KNOWN-ISSUES delete mode 100644 Tests/Libraries/rack-1.1.0/README delete mode 100644 Tests/Libraries/rack-1.1.0/Rakefile delete mode 100644 Tests/Libraries/rack-1.1.0/contrib/rack_logo.svg delete mode 100644 Tests/Libraries/rack-1.1.0/example/lobster.ru delete mode 100644 Tests/Libraries/rack-1.1.0/example/protectedlobster.rb delete mode 100644 Tests/Libraries/rack-1.1.0/example/protectedlobster.ru delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/adapter/camping.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/auth/abstract/handler.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/auth/abstract/request.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/auth/basic.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/auth/digest/md5.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/auth/digest/nonce.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/auth/digest/params.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/auth/digest/request.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/builder.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/cascade.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/chunked.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/commonlogger.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/conditionalget.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/config.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/content_length.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/content_type.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/deflater.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/directory.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/etag.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/file.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/handler.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/handler/cgi.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/handler/evented_mongrel.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/handler/fastcgi.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/handler/lsws.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/handler/mongrel.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/handler/scgi.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/handler/swiftiplied_mongrel.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/handler/thin.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/handler/webrick.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/head.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/lint.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/lobster.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/lock.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/logger.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/methodoverride.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/mime.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/mock.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/nulllogger.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/recursive.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/reloader.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/request.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/response.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/rewindable_input.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/runtime.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/sendfile.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/server.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/session/abstract/id.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/session/cookie.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/session/memcache.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/session/pool.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/showexceptions.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/showstatus.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/static.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/urlmap.rb delete mode 100644 Tests/Libraries/rack-1.1.0/lib/rack/utils.rb delete mode 100644 Tests/Libraries/rack-1.1.0/rack.gemspec delete mode 100644 Tests/Libraries/rack-1.1.0/test/cgi/lighttpd.conf delete mode 100644 Tests/Libraries/rack-1.1.0/test/cgi/rackup_stub.rb delete mode 100644 Tests/Libraries/rack-1.1.0/test/cgi/sample_rackup.ru delete mode 100644 Tests/Libraries/rack-1.1.0/test/cgi/test delete mode 100644 Tests/Libraries/rack-1.1.0/test/cgi/test.fcgi delete mode 100644 Tests/Libraries/rack-1.1.0/test/cgi/test.ru delete mode 100644 Tests/Libraries/rack-1.1.0/test/multipart/bad_robots delete mode 100644 Tests/Libraries/rack-1.1.0/test/multipart/binary delete mode 100644 Tests/Libraries/rack-1.1.0/test/multipart/empty delete mode 100644 Tests/Libraries/rack-1.1.0/test/multipart/fail_16384_nofile delete mode 100644 Tests/Libraries/rack-1.1.0/test/multipart/file1.txt delete mode 100644 Tests/Libraries/rack-1.1.0/test/multipart/filename_and_modification_param delete mode 100644 Tests/Libraries/rack-1.1.0/test/multipart/filename_with_escaped_quotes delete mode 100644 Tests/Libraries/rack-1.1.0/test/multipart/filename_with_escaped_quotes_and_modification_param delete mode 100644 Tests/Libraries/rack-1.1.0/test/multipart/filename_with_percent_escaped_quotes delete mode 100644 Tests/Libraries/rack-1.1.0/test/multipart/filename_with_unescaped_quotes delete mode 100644 Tests/Libraries/rack-1.1.0/test/multipart/ie delete mode 100644 Tests/Libraries/rack-1.1.0/test/multipart/nested delete mode 100644 Tests/Libraries/rack-1.1.0/test/multipart/none delete mode 100644 Tests/Libraries/rack-1.1.0/test/multipart/semicolon delete mode 100644 Tests/Libraries/rack-1.1.0/test/multipart/text delete mode 100644 Tests/Libraries/rack-1.1.0/test/rackup/config.ru delete mode 100644 Tests/Libraries/rack-1.1.0/test/spec_rack_auth_basic.rb delete mode 100644 Tests/Libraries/rack-1.1.0/test/spec_rack_auth_digest.rb delete mode 100644 Tests/Libraries/rack-1.1.0/test/spec_rack_builder.rb delete mode 100644 Tests/Libraries/rack-1.1.0/test/spec_rack_camping.rb delete mode 100644 Tests/Libraries/rack-1.1.0/test/spec_rack_cascade.rb delete mode 100644 Tests/Libraries/rack-1.1.0/test/spec_rack_cgi.rb delete mode 100644 Tests/Libraries/rack-1.1.0/test/spec_rack_chunked.rb delete mode 100644 Tests/Libraries/rack-1.1.0/test/spec_rack_commonlogger.rb delete mode 100644 Tests/Libraries/rack-1.1.0/test/spec_rack_conditionalget.rb delete mode 100644 Tests/Libraries/rack-1.1.0/test/spec_rack_config.rb delete mode 100644 Tests/Libraries/rack-1.1.0/test/spec_rack_content_length.rb delete mode 100644 Tests/Libraries/rack-1.1.0/test/spec_rack_content_type.rb delete mode 100644 Tests/Libraries/rack-1.1.0/test/spec_rack_deflater.rb delete mode 100644 Tests/Libraries/rack-1.1.0/test/spec_rack_directory.rb delete mode 100644 Tests/Libraries/rack-1.1.0/test/spec_rack_etag.rb delete mode 100644 Tests/Libraries/rack-1.1.0/test/spec_rack_fastcgi.rb delete mode 100644 Tests/Libraries/rack-1.1.0/test/spec_rack_file.rb delete mode 100644 Tests/Libraries/rack-1.1.0/test/spec_rack_handler.rb delete mode 100644 Tests/Libraries/rack-1.1.0/test/spec_rack_head.rb delete mode 100644 Tests/Libraries/rack-1.1.0/test/spec_rack_lint.rb delete mode 100644 Tests/Libraries/rack-1.1.0/test/spec_rack_lobster.rb delete mode 100644 Tests/Libraries/rack-1.1.0/test/spec_rack_lock.rb delete mode 100644 Tests/Libraries/rack-1.1.0/test/spec_rack_logger.rb delete mode 100644 Tests/Libraries/rack-1.1.0/test/spec_rack_methodoverride.rb delete mode 100644 Tests/Libraries/rack-1.1.0/test/spec_rack_mock.rb delete mode 100644 Tests/Libraries/rack-1.1.0/test/spec_rack_mongrel.rb delete mode 100644 Tests/Libraries/rack-1.1.0/test/spec_rack_nulllogger.rb delete mode 100644 Tests/Libraries/rack-1.1.0/test/spec_rack_recursive.rb delete mode 100644 Tests/Libraries/rack-1.1.0/test/spec_rack_request.rb delete mode 100644 Tests/Libraries/rack-1.1.0/test/spec_rack_response.rb delete mode 100644 Tests/Libraries/rack-1.1.0/test/spec_rack_rewindable_input.rb delete mode 100644 Tests/Libraries/rack-1.1.0/test/spec_rack_runtime.rb delete mode 100644 Tests/Libraries/rack-1.1.0/test/spec_rack_sendfile.rb delete mode 100644 Tests/Libraries/rack-1.1.0/test/spec_rack_session_cookie.rb delete mode 100644 Tests/Libraries/rack-1.1.0/test/spec_rack_session_memcache.rb delete mode 100644 Tests/Libraries/rack-1.1.0/test/spec_rack_session_pool.rb delete mode 100644 Tests/Libraries/rack-1.1.0/test/spec_rack_showexceptions.rb delete mode 100644 Tests/Libraries/rack-1.1.0/test/spec_rack_showstatus.rb delete mode 100644 Tests/Libraries/rack-1.1.0/test/spec_rack_static.rb delete mode 100644 Tests/Libraries/rack-1.1.0/test/spec_rack_thin.rb delete mode 100644 Tests/Libraries/rack-1.1.0/test/spec_rack_urlmap.rb delete mode 100644 Tests/Libraries/rack-1.1.0/test/spec_rack_utils.rb delete mode 100644 Tests/Libraries/rack-1.1.0/test/spec_rack_webrick.rb delete mode 100644 Tests/Libraries/rack-1.1.0/test/spec_rackup.rb delete mode 100644 Tests/Libraries/rack-1.1.0/test/testrequest.rb delete mode 100644 Tests/Libraries/rack-1.1.0/test/unregistered_handler/rack/handler/unregistered.rb delete mode 100644 Tests/Libraries/rack-1.1.0/test/unregistered_handler/rack/handler/unregistered_long_one.rb delete mode 100644 Tests/Libraries/test-spec-0.10.0/examples/stack.rb delete mode 100644 Tests/Libraries/test-spec-0.10.0/examples/stack_spec.rb delete mode 100644 Tests/Libraries/test-spec-0.10.0/lib/test/spec.rb delete mode 100644 Tests/Libraries/test-spec-0.10.0/lib/test/spec/dox.rb delete mode 100644 Tests/Libraries/test-spec-0.10.0/lib/test/spec/rdox.rb delete mode 100644 Tests/Libraries/test-spec-0.10.0/lib/test/spec/should-output.rb delete mode 100644 Tests/Libraries/test-spec-0.10.0/lib/test/spec/version.rb delete mode 100644 Tests/Libraries/test-spec-0.10.0/test/spec_dox.rb delete mode 100644 Tests/Libraries/test-spec-0.10.0/test/spec_flexmock.rb delete mode 100644 Tests/Libraries/test-spec-0.10.0/test/spec_mocha.rb delete mode 100644 Tests/Libraries/test-spec-0.10.0/test/spec_nestedcontexts.rb delete mode 100644 Tests/Libraries/test-spec-0.10.0/test/spec_new_style.rb delete mode 100644 Tests/Libraries/test-spec-0.10.0/test/spec_should-output.rb delete mode 100644 Tests/Libraries/test-spec-0.10.0/test/spec_testspec.rb delete mode 100644 Tests/Libraries/test-spec-0.10.0/test/spec_testspec_order.rb delete mode 100644 Tests/Libraries/test-spec-0.10.0/test/test_testunit.rb delete mode 100644 Tests/Scripts/adonet_sqlserver/connection.rb delete mode 100644 Tests/Scripts/irtests.rb delete mode 100644 Tests/Scripts/irtests/failing_task.rb delete mode 100644 Tests/Scripts/irtests/passing_task.rb delete mode 100644 Tests/Scripts/native_sqlserver/connection.rb delete mode 100644 Tests/Scripts/utr.rb delete mode 100644 Tests/Scripts/utr/action_mailer_tests.rb delete mode 100644 Tests/Scripts/utr/action_pack_tests.rb delete mode 100644 Tests/Scripts/utr/active_record_tests.rb delete mode 100644 Tests/Scripts/utr/active_resource_tests.rb delete mode 100644 Tests/Scripts/utr/active_support_tests.rb delete mode 100644 Tests/Scripts/utr/gem_tests.rb delete mode 100644 Tests/Scripts/utr/rack_tests.rb delete mode 100644 Tests/Scripts/utr/rake_tests.rb delete mode 100644 Tests/Scripts/utr/test-spec_tests.rb delete mode 100644 Tests/Scripts/utr/tzinfo_tests.rb diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 25e1752e0..26c2fad3a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,6 +22,10 @@ env: # release can be rebuilt and an upstream change only arrives when this is moved on purpose. # Move both together, after checking the patches still apply. DLR_REF: 922753f8ccbf5186c15899116d5a407b6b1723fb + # ruby/spec and mspec for the spec job, pinned so a result moves only with IronRuby's own + # changes, not with whatever lands upstream on the day. + SPEC_REF: dda28d049100033a8b7050eacbb35957a2eb0c00 + MSPEC_REF: b79c65ed28b00f0869ad82b0e3dceef0d943cd58 jobs: build-and-test: @@ -388,10 +392,12 @@ jobs: - uses: actions/checkout@v7 with: repository: ruby/spec + ref: ${{ env.SPEC_REF }} path: ironruby/spec - uses: actions/checkout@v7 with: repository: ruby/mspec + ref: ${{ env.MSPEC_REF }} path: ironruby/mspec - name: Patch the DLR diff --git a/Src/Scripts/irtests b/Src/Scripts/irtests deleted file mode 100644 index a05a73604..000000000 --- a/Src/Scripts/irtests +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -mono "$DLR_ROOT/Util/IronRuby/bin/ir.exe" "$DLR_ROOT/Languages/Ruby/Tests/Scripts/irtests.rb" "$@" diff --git a/Src/Scripts/irtests.bat b/Src/Scripts/irtests.bat deleted file mode 100644 index 211e5d26b..000000000 --- a/Src/Scripts/irtests.bat +++ /dev/null @@ -1,2 +0,0 @@ -"%DLR_ROOT%\Util\IronRuby\bin\ir.exe" "%DLR_ROOT%\Languages\Ruby\Tests\Scripts\irtests.rb" %* - diff --git a/Src/StdLib/ruby/1.9.1/kconv.rb b/Src/StdLib/ironruby/kconv.rb similarity index 89% rename from Src/StdLib/ruby/1.9.1/kconv.rb rename to Src/StdLib/ironruby/kconv.rb index 85e5c64d1..e82a502bb 100644 --- a/Src/StdLib/ruby/1.9.1/kconv.rb +++ b/Src/StdLib/ironruby/kconv.rb @@ -1,286 +1,286 @@ -# -# kconv.rb - Kanji Converter. -# -# $Id: kconv.rb 25189 2009-10-02 12:04:37Z akr $ -# -# ---- -# -# kconv.rb implements the Kconv class for Kanji Converter. Additionally, -# some methods in String classes are added to allow easy conversion. -# - -require 'nkf' - -# -# Kanji Converter for Ruby. -# -module Kconv - # - # Public Constants - # - - #Constant of Encoding - - # These name encodings: #kconv passes them to nkf as --oc=/--ic= and #iseuc and its - # neighbours hand them to String#force_encoding. The NKF::* integers this used to read - # are nkf's own internal numbering and mean nothing to either. - - # Auto-Detect - AUTO = NKF::AUTO - # ISO-2022-JP - JIS = Encoding::ISO_2022_JP - # EUC-JP - EUC = Encoding::EUC_JP - # Shift_JIS - SJIS = Encoding::Shift_JIS - # BINARY - BINARY = Encoding::ASCII_8BIT - # NOCONV - NOCONV = Encoding::ASCII_8BIT - # ASCII - ASCII = Encoding::US_ASCII - # UTF-8 - UTF8 = Encoding::UTF_8 - # UTF-16 - UTF16 = Encoding::UTF_16BE - # UTF-32 - UTF32 = Encoding::UTF_32BE - # UNKNOWN - UNKNOWN = Encoding::ASCII_8BIT - - # - # Public Methods - # - - # call-seq: - # Kconv.kconv(str, to_enc, from_enc=nil) - # - # Convert str to out_code. - # out_code and in_code are given as constants of Kconv. - def kconv(str, to_enc, from_enc=nil) - opt = '' - opt += ' --ic=' + from_enc.to_s if from_enc - opt += ' --oc=' + to_enc.to_s if to_enc - - ::NKF::nkf(opt, str) - end - module_function :kconv - - # - # Encode to - # - - # call-seq: - # Kconv.tojis(str) => string - # - # Convert str to ISO-2022-JP - def tojis(str) - kconv(str, JIS) - end - module_function :tojis - - # call-seq: - # Kconv.toeuc(str) => string - # - # Convert str to EUC-JP - def toeuc(str) - kconv(str, EUC) - end - module_function :toeuc - - # call-seq: - # Kconv.tosjis(str) => string - # - # Convert str to Shift_JIS - def tosjis(str) - kconv(str, SJIS) - end - module_function :tosjis - - # call-seq: - # Kconv.toutf8(str) => string - # - # Convert str to UTF-8 - def toutf8(str) - kconv(str, UTF8) - end - module_function :toutf8 - - # call-seq: - # Kconv.toutf16(str) => string - # - # Convert str to UTF-16 - def toutf16(str) - kconv(str, UTF16) - end - module_function :toutf16 - - # call-seq: - # Kconv.toutf32(str) => string - # - # Convert str to UTF-32 - def toutf32(str) - kconv(str, UTF32) - end - module_function :toutf32 - - # call-seq: - # Kconv.tolocale => string - # - # Convert self to locale encoding - def tolocale(str) - kconv(str, Encoding.locale_charmap) - end - module_function :tolocale - - # - # guess - # - - # call-seq: - # Kconv.guess(str) => encoding - # - # Guess input encoding by NKF.guess - def guess(str) - ::NKF::guess(str) - end - module_function :guess - - # - # isEncoding - # - - # call-seq: - # Kconv.iseuc(str) => true or false - # - # Returns whether input encoding is EUC-JP or not. - # - # *Note* don't expect this return value is MatchData. - def iseuc(str) - str.dup.force_encoding(EUC).valid_encoding? - end - module_function :iseuc - - # call-seq: - # Kconv.issjis(str) => true or false - # - # Returns whether input encoding is Shift_JIS or not. - def issjis(str) - str.dup.force_encoding(SJIS).valid_encoding? - end - module_function :issjis - - # call-seq: - # Kconv.isjis(str) => true or false - # - # Returns whether input encoding is ISO-2022-JP or not. - def isjis(str) - /\A [\t\n\r\x20-\x7E]* - (?: - (?:\x1b \x28 I [\x21-\x7E]* - |\x1b \x28 J [\x21-\x7E]* - |\x1b \x24 @ (?:[\x21-\x7E]{2})* - |\x1b \x24 B (?:[\x21-\x7E]{2})* - |\x1b \x24 \x28 D (?:[\x21-\x7E]{2})* - )* - \x1b \x28 B [\t\n\r\x20-\x7E]* - )* - \z/nox =~ str.dup.force_encoding('BINARY') ? true : false - end - module_function :isjis - - # call-seq: - # Kconv.isutf8(str) => true or false - # - # Returns whether input encoding is UTF-8 or not. - def isutf8(str) - str.dup.force_encoding(UTF8).valid_encoding? - end - module_function :isutf8 -end - -class String - # call-seq: - # String#kconv(to_enc, from_enc) - # - # Convert self to out_code. - # out_code and in_code are given as constants of Kconv. - def kconv(to_enc, from_enc=nil) - form_enc = self.encoding if !from_enc && self.encoding != Encoding.list[0] - Kconv::kconv(self, to_enc, from_enc) - end - - # - # to Encoding - # - - # call-seq: - # String#tojis => string - # - # Convert self to ISO-2022-JP - def tojis; Kconv.tojis(self) end - - # call-seq: - # String#toeuc => string - # - # Convert self to EUC-JP - def toeuc; Kconv.toeuc(self) end - - # call-seq: - # String#tosjis => string - # - # Convert self to Shift_JIS - def tosjis; Kconv.tosjis(self) end - - # call-seq: - # String#toutf8 => string - # - # Convert self to UTF-8 - def toutf8; Kconv.toutf8(self) end - - # call-seq: - # String#toutf16 => string - # - # Convert self to UTF-16 - def toutf16; Kconv.toutf16(self) end - - # call-seq: - # String#toutf32 => string - # - # Convert self to UTF-32 - def toutf32; Kconv.toutf32(self) end - - # call-seq: - # String#tolocale => string - # - # Convert self to locale encoding - def tolocale; Kconv.tolocale(self) end - - # - # is Encoding - # - - # call-seq: - # String#iseuc => true or false - # - # Returns whether self's encoding is EUC-JP or not. - def iseuc; Kconv.iseuc(self) end - - # call-seq: - # String#issjis => true or false - # - # Returns whether self's encoding is Shift_JIS or not. - def issjis; Kconv.issjis(self) end - - # call-seq: - # String#isjis => true or false - # - # Returns whether self's encoding is ISO-2022-JP or not. - def isjis; Kconv.isjis(self) end - - # call-seq: - # String#isutf8 => true or false - # - # Returns whether self's encoding is UTF-8 or not. - def isutf8; Kconv.isutf8(self) end -end +# +# kconv.rb - Kanji Converter. +# +# $Id$ +# +# ---- +# +# kconv.rb implements the Kconv class for Kanji Converter. Additionally, +# some methods in String classes are added to allow easy conversion. +# + +require 'nkf' + +# +# Kanji Converter for Ruby. +# +module Kconv + # + # Public Constants + # + + #Constant of Encoding + + # These name encodings: #kconv passes them to nkf as --oc=/--ic= and #iseuc and its + # neighbours hand them to String#force_encoding. The NKF::* integers this used to read + # are nkf's own internal numbering and mean nothing to either. + + # Auto-Detect + AUTO = NKF::AUTO + # ISO-2022-JP + JIS = Encoding::ISO_2022_JP + # EUC-JP + EUC = Encoding::EUC_JP + # Shift_JIS + SJIS = Encoding::Shift_JIS + # BINARY + BINARY = Encoding::ASCII_8BIT + # NOCONV + NOCONV = Encoding::ASCII_8BIT + # ASCII + ASCII = Encoding::US_ASCII + # UTF-8 + UTF8 = Encoding::UTF_8 + # UTF-16 + UTF16 = Encoding::UTF_16BE + # UTF-32 + UTF32 = Encoding::UTF_32BE + # UNKNOWN + UNKNOWN = Encoding::ASCII_8BIT + + # + # Public Methods + # + + # call-seq: + # Kconv.kconv(str, to_enc, from_enc=nil) + # + # Convert str to to_enc. + # to_enc and from_enc are given as constants of Kconv or Encoding objects. + def kconv(str, to_enc, from_enc=nil) + opt = '' + opt += ' --ic=' + from_enc.to_s if from_enc + opt += ' --oc=' + to_enc.to_s if to_enc + + ::NKF::nkf(opt, str) + end + module_function :kconv + + # + # Encode to + # + + # call-seq: + # Kconv.tojis(str) => string + # + # Convert str to ISO-2022-JP + def tojis(str) + kconv(str, JIS) + end + module_function :tojis + + # call-seq: + # Kconv.toeuc(str) => string + # + # Convert str to EUC-JP + def toeuc(str) + kconv(str, EUC) + end + module_function :toeuc + + # call-seq: + # Kconv.tosjis(str) => string + # + # Convert str to Shift_JIS + def tosjis(str) + kconv(str, SJIS) + end + module_function :tosjis + + # call-seq: + # Kconv.toutf8(str) => string + # + # Convert str to UTF-8 + def toutf8(str) + kconv(str, UTF8) + end + module_function :toutf8 + + # call-seq: + # Kconv.toutf16(str) => string + # + # Convert str to UTF-16 + def toutf16(str) + kconv(str, UTF16) + end + module_function :toutf16 + + # call-seq: + # Kconv.toutf32(str) => string + # + # Convert str to UTF-32 + def toutf32(str) + kconv(str, UTF32) + end + module_function :toutf32 + + # call-seq: + # Kconv.tolocale => string + # + # Convert self to locale encoding + def tolocale(str) + kconv(str, Encoding.locale_charmap) + end + module_function :tolocale + + # + # guess + # + + # call-seq: + # Kconv.guess(str) => encoding + # + # Guess input encoding by NKF.guess + def guess(str) + ::NKF::guess(str) + end + module_function :guess + + # + # isEncoding + # + + # call-seq: + # Kconv.iseuc(str) => true or false + # + # Returns whether input encoding is EUC-JP or not. + # + # *Note* don't expect this return value is MatchData. + def iseuc(str) + str.dup.force_encoding(EUC).valid_encoding? + end + module_function :iseuc + + # call-seq: + # Kconv.issjis(str) => true or false + # + # Returns whether input encoding is Shift_JIS or not. + def issjis(str) + str.dup.force_encoding(SJIS).valid_encoding? + end + module_function :issjis + + # call-seq: + # Kconv.isjis(str) => true or false + # + # Returns whether input encoding is ISO-2022-JP or not. + def isjis(str) + /\A [\t\n\r\x20-\x7E]* + (?: + (?:\x1b \x28 I [\x21-\x7E]* + |\x1b \x28 J [\x21-\x7E]* + |\x1b \x24 @ (?:[\x21-\x7E]{2})* + |\x1b \x24 B (?:[\x21-\x7E]{2})* + |\x1b \x24 \x28 D (?:[\x21-\x7E]{2})* + )* + \x1b \x28 B [\t\n\r\x20-\x7E]* + )* + \z/nox =~ str.dup.force_encoding('BINARY') ? true : false + end + module_function :isjis + + # call-seq: + # Kconv.isutf8(str) => true or false + # + # Returns whether input encoding is UTF-8 or not. + def isutf8(str) + str.dup.force_encoding(UTF8).valid_encoding? + end + module_function :isutf8 +end + +class String + # call-seq: + # String#kconv(to_enc, from_enc) + # + # Convert self to to_enc. + # to_enc and from_enc are given as constants of Kconv or Encoding objects. + def kconv(to_enc, from_enc=nil) + from_enc = self.encoding if !from_enc && self.encoding != Encoding.list[0] + Kconv::kconv(self, to_enc, from_enc) + end + + # + # to Encoding + # + + # call-seq: + # String#tojis => string + # + # Convert self to ISO-2022-JP + def tojis; Kconv.tojis(self) end + + # call-seq: + # String#toeuc => string + # + # Convert self to EUC-JP + def toeuc; Kconv.toeuc(self) end + + # call-seq: + # String#tosjis => string + # + # Convert self to Shift_JIS + def tosjis; Kconv.tosjis(self) end + + # call-seq: + # String#toutf8 => string + # + # Convert self to UTF-8 + def toutf8; Kconv.toutf8(self) end + + # call-seq: + # String#toutf16 => string + # + # Convert self to UTF-16 + def toutf16; Kconv.toutf16(self) end + + # call-seq: + # String#toutf32 => string + # + # Convert self to UTF-32 + def toutf32; Kconv.toutf32(self) end + + # call-seq: + # String#tolocale => string + # + # Convert self to locale encoding + def tolocale; Kconv.tolocale(self) end + + # + # is Encoding + # + + # call-seq: + # String#iseuc => true or false + # + # Returns whether self's encoding is EUC-JP or not. + def iseuc; Kconv.iseuc(self) end + + # call-seq: + # String#issjis => true or false + # + # Returns whether self's encoding is Shift_JIS or not. + def issjis; Kconv.issjis(self) end + + # call-seq: + # String#isjis => true or false + # + # Returns whether self's encoding is ISO-2022-JP or not. + def isjis; Kconv.isjis(self) end + + # call-seq: + # String#isutf8 => true or false + # + # Returns whether self's encoding is UTF-8 or not. + def isutf8; Kconv.isutf8(self) end +end diff --git a/Src/StdLib/ironruby/win32/resolv.rb b/Src/StdLib/ironruby/win32/resolv.rb new file mode 100644 index 000000000..5f4def04c --- /dev/null +++ b/Src/StdLib/ironruby/win32/resolv.rb @@ -0,0 +1,64 @@ +# Win32::Resolv over System.Net.NetworkInformation: the two things resolv.rb asks +# for on Windows, the hosts file (Resolv::Hosts) and the DNS servers and search +# suffixes (Resolv::DNS::Config). CRuby reads them from the registry and +# GetNetworkParams; the 1.9 version did the same over dl, which IronRuby never had, +# so its require failed and resolv ran with no hosts file and no nameservers. +module Win32 + module Resolv + load_assembly 'System.Net.NetworkInformation' + + def self.get_hosts_path + dir = File.join(System::Environment.system_directory.to_s, "drivers", "etc") + path = File.expand_path("hosts", dir) + File.exist?(path) ? path : nil + rescue Exception + nil + end + + # [search, nameserver] the way CRuby returns them: each an Array, or nil when empty. + def self.get_resolv_info + search, nameserver = get_info + search.delete("") + search.uniq! + nameserver.delete("") + nameserver.delete("0.0.0.0") + nameserver.uniq! + [search.empty? ? nil : search, nameserver.empty? ? nil : nameserver] + end + + def self.get_info # :nodoc: + search = [] + nameserver = [] + ni = System::Net::NetworkInformation + begin + domain = ni::IPGlobalProperties.get_ip_global_properties.domain_name.to_s + search << domain unless domain.empty? + rescue Exception + end + interfaces = begin + ni::NetworkInterface.get_all_network_interfaces.to_a + rescue Exception + [] + end + interfaces.each do |nic| + next unless nic.operational_status.to_s == "Up" + next if nic.network_interface_type.to_s == "Loopback" + props = begin + nic.get_ip_properties + rescue Exception + next + end + suffix = props.dns_suffix.to_s + search << suffix unless suffix.empty? + props.dns_addresses.each do |address| + # A scoped (link-local) address is only reachable through its own + # interface, which Resolv::DNS has no way to name; skip it. + text = address.to_s + nameserver << text unless text.include?("%") + end + end + [search, nameserver] + end + private_class_method :get_info + end +end diff --git a/Src/StdLib/ruby/1.9.1/debug.rb b/Src/StdLib/ruby/1.9.1/debug.rb deleted file mode 100644 index 4ca027d7d..000000000 --- a/Src/StdLib/ruby/1.9.1/debug.rb +++ /dev/null @@ -1,907 +0,0 @@ -# Copyright (C) 2000 Network Applied Communication Laboratory, Inc. -# Copyright (C) 2000 Information-technology Promotion Agency, Japan -# Copyright (C) 2000-2003 NAKAMURA, Hiroshi - -require 'continuation' - -if $SAFE > 0 - STDERR.print "-r debug.rb is not available in safe mode\n" - exit 1 -end - -require 'tracer' -require 'pp' - -class Tracer - def Tracer.trace_func(*vars) - Single.trace_func(*vars) - end -end - -SCRIPT_LINES__ = {} unless defined? SCRIPT_LINES__ - -class DEBUGGER__ -MUTEX = Mutex.new - -class Context - DEBUG_LAST_CMD = [] - - begin - require 'readline' - def readline(prompt, hist) - Readline::readline(prompt, hist) - end - rescue LoadError - def readline(prompt, hist) - STDOUT.print prompt - STDOUT.flush - line = STDIN.gets - exit unless line - line.chomp! - line - end - USE_READLINE = false - end - - def initialize - if Thread.current == Thread.main - @stop_next = 1 - else - @stop_next = 0 - end - @last_file = nil - @file = nil - @line = nil - @no_step = nil - @frames = [] - @finish_pos = 0 - @trace = false - @catch = "StandardError" - @suspend_next = false - end - - def stop_next(n=1) - @stop_next = n - end - - def set_suspend - @suspend_next = true - end - - def clear_suspend - @suspend_next = false - end - - def suspend_all - DEBUGGER__.suspend - end - - def resume_all - DEBUGGER__.resume - end - - def check_suspend - while MUTEX.synchronize { - if @suspend_next - DEBUGGER__.waiting.push Thread.current - @suspend_next = false - true - end - } - end - end - - def trace? - @trace - end - - def set_trace(arg) - @trace = arg - end - - def stdout - DEBUGGER__.stdout - end - - def break_points - DEBUGGER__.break_points - end - - def display - DEBUGGER__.display - end - - def context(th) - DEBUGGER__.context(th) - end - - def set_trace_all(arg) - DEBUGGER__.set_trace(arg) - end - - def set_last_thread(th) - DEBUGGER__.set_last_thread(th) - end - - def debug_eval(str, binding) - begin - val = eval(str, binding) - rescue StandardError, ScriptError => e - at = eval("caller(1)", binding) - stdout.printf "%s:%s\n", at.shift, e.to_s.sub(/\(eval\):1:(in `.*?':)?/, '') - for i in at - stdout.printf "\tfrom %s\n", i - end - throw :debug_error - end - end - - def debug_silent_eval(str, binding) - begin - eval(str, binding) - rescue StandardError, ScriptError - nil - end - end - - def var_list(ary, binding) - ary.sort! - for v in ary - stdout.printf " %s => %s\n", v, eval(v, binding).inspect - end - end - - def debug_variable_info(input, binding) - case input - when /^\s*g(?:lobal)?\s*$/ - var_list(global_variables, binding) - - when /^\s*l(?:ocal)?\s*$/ - var_list(eval("local_variables", binding), binding) - - when /^\s*i(?:nstance)?\s+/ - obj = debug_eval($', binding) - var_list(obj.instance_variables, obj.instance_eval{binding()}) - - when /^\s*c(?:onst(?:ant)?)?\s+/ - obj = debug_eval($', binding) - unless obj.kind_of? Module - stdout.print "Should be Class/Module: ", $', "\n" - else - var_list(obj.constants, obj.module_eval{binding()}) - end - end - end - - def debug_method_info(input, binding) - case input - when /^i(:?nstance)?\s+/ - obj = debug_eval($', binding) - - len = 0 - for v in obj.methods.sort - len += v.size + 1 - if len > 70 - len = v.size + 1 - stdout.print "\n" - end - stdout.print v, " " - end - stdout.print "\n" - - else - obj = debug_eval(input, binding) - unless obj.kind_of? Module - stdout.print "Should be Class/Module: ", input, "\n" - else - len = 0 - for v in obj.instance_methods(false).sort - len += v.size + 1 - if len > 70 - len = v.size + 1 - stdout.print "\n" - end - stdout.print v, " " - end - stdout.print "\n" - end - end - end - - def thnum - num = DEBUGGER__.instance_eval{@thread_list[Thread.current]} - unless num - DEBUGGER__.make_thread_list - num = DEBUGGER__.instance_eval{@thread_list[Thread.current]} - end - num - end - - def debug_command(file, line, id, binding) - MUTEX.lock - unless defined?($debugger_restart) and $debugger_restart - callcc{|c| $debugger_restart = c} - end - set_last_thread(Thread.current) - frame_pos = 0 - binding_file = file - binding_line = line - previous_line = nil - if ENV['EMACS'] - stdout.printf "\032\032%s:%d:\n", binding_file, binding_line - else - stdout.printf "%s:%d:%s", binding_file, binding_line, - line_at(binding_file, binding_line) - end - @frames[0] = [binding, file, line, id] - display_expressions(binding) - prompt = true - while prompt and input = readline("(rdb:%d) "%thnum(), true) - catch(:debug_error) do - if input == "" - next unless DEBUG_LAST_CMD[0] - input = DEBUG_LAST_CMD[0] - stdout.print input, "\n" - else - DEBUG_LAST_CMD[0] = input - end - - case input - when /^\s*tr(?:ace)?(?:\s+(on|off))?(?:\s+(all))?$/ - if defined?( $2 ) - if $1 == 'on' - set_trace_all true - else - set_trace_all false - end - elsif defined?( $1 ) - if $1 == 'on' - set_trace true - else - set_trace false - end - end - if trace? - stdout.print "Trace on.\n" - else - stdout.print "Trace off.\n" - end - - when /^\s*b(?:reak)?\s+(?:(.+):)?([^.:]+)$/ - pos = $2 - if $1 - klass = debug_silent_eval($1, binding) - file = $1 - end - if pos =~ /^\d+$/ - pname = pos - pos = pos.to_i - else - pname = pos = pos.intern.id2name - end - break_points.push [true, 0, klass || file, pos] - stdout.printf "Set breakpoint %d at %s:%s\n", break_points.size, klass || file, pname - - when /^\s*b(?:reak)?\s+(.+)[#.]([^.:]+)$/ - pos = $2.intern.id2name - klass = debug_eval($1, binding) - break_points.push [true, 0, klass, pos] - stdout.printf "Set breakpoint %d at %s.%s\n", break_points.size, klass, pos - - when /^\s*wat(?:ch)?\s+(.+)$/ - exp = $1 - break_points.push [true, 1, exp] - stdout.printf "Set watchpoint %d:%s\n", break_points.size, exp - - when /^\s*b(?:reak)?$/ - if break_points.find{|b| b[1] == 0} - n = 1 - stdout.print "Breakpoints:\n" - break_points.each do |b| - if b[0] and b[1] == 0 - stdout.printf " %d %s:%s\n", n, b[2], b[3] - end - n += 1 - end - end - if break_points.find{|b| b[1] == 1} - n = 1 - stdout.print "\n" - stdout.print "Watchpoints:\n" - for b in break_points - if b[0] and b[1] == 1 - stdout.printf " %d %s\n", n, b[2] - end - n += 1 - end - end - if break_points.size == 0 - stdout.print "No breakpoints\n" - else - stdout.print "\n" - end - - when /^\s*del(?:ete)?(?:\s+(\d+))?$/ - pos = $1 - unless pos - input = readline("Clear all breakpoints? (y/n) ", false) - if input == "y" - for b in break_points - b[0] = false - end - end - else - pos = pos.to_i - if break_points[pos-1] - break_points[pos-1][0] = false - else - stdout.printf "Breakpoint %d is not defined\n", pos - end - end - - when /^\s*disp(?:lay)?\s+(.+)$/ - exp = $1 - display.push [true, exp] - stdout.printf "%d: ", display.size - display_expression(exp, binding) - - when /^\s*disp(?:lay)?$/ - display_expressions(binding) - - when /^\s*undisp(?:lay)?(?:\s+(\d+))?$/ - pos = $1 - unless pos - input = readline("Clear all expressions? (y/n) ", false) - if input == "y" - for d in display - d[0] = false - end - end - else - pos = pos.to_i - if display[pos-1] - display[pos-1][0] = false - else - stdout.printf "Display expression %d is not defined\n", pos - end - end - - when /^\s*c(?:ont)?$/ - prompt = false - - when /^\s*s(?:tep)?(?:\s+(\d+))?$/ - if $1 - lev = $1.to_i - else - lev = 1 - end - @stop_next = lev - prompt = false - - when /^\s*n(?:ext)?(?:\s+(\d+))?$/ - if $1 - lev = $1.to_i - else - lev = 1 - end - @stop_next = lev - @no_step = @frames.size - frame_pos - prompt = false - - when /^\s*w(?:here)?$/, /^\s*f(?:rame)?$/ - display_frames(frame_pos) - - when /^\s*l(?:ist)?(?:\s+(.+))?$/ - if not $1 - b = previous_line ? previous_line + 10 : binding_line - 5 - e = b + 9 - elsif $1 == '-' - b = previous_line ? previous_line - 10 : binding_line - 5 - e = b + 9 - else - b, e = $1.split(/[-,]/) - if e - b = b.to_i - e = e.to_i - else - b = b.to_i - 5 - e = b + 9 - end - end - previous_line = b - display_list(b, e, binding_file, binding_line) - - when /^\s*up(?:\s+(\d+))?$/ - previous_line = nil - if $1 - lev = $1.to_i - else - lev = 1 - end - frame_pos += lev - if frame_pos >= @frames.size - frame_pos = @frames.size - 1 - stdout.print "At toplevel\n" - end - binding, binding_file, binding_line = @frames[frame_pos] - stdout.print format_frame(frame_pos) - - when /^\s*down(?:\s+(\d+))?$/ - previous_line = nil - if $1 - lev = $1.to_i - else - lev = 1 - end - frame_pos -= lev - if frame_pos < 0 - frame_pos = 0 - stdout.print "At stack bottom\n" - end - binding, binding_file, binding_line = @frames[frame_pos] - stdout.print format_frame(frame_pos) - - when /^\s*fin(?:ish)?$/ - if frame_pos == @frames.size - stdout.print "\"finish\" not meaningful in the outermost frame.\n" - else - @finish_pos = @frames.size - frame_pos - frame_pos = 0 - prompt = false - end - - when /^\s*cat(?:ch)?(?:\s+(.+))?$/ - if $1 - excn = $1 - if excn == 'off' - @catch = nil - stdout.print "Clear catchpoint.\n" - else - @catch = excn - stdout.printf "Set catchpoint %s.\n", @catch - end - else - if @catch - stdout.printf "Catchpoint %s.\n", @catch - else - stdout.print "No catchpoint.\n" - end - end - - when /^\s*q(?:uit)?$/ - input = readline("Really quit? (y/n) ", false) - if input == "y" - exit! # exit -> exit!: No graceful way to stop threads... - end - - when /^\s*v(?:ar)?\s+/ - debug_variable_info($', binding) - - when /^\s*m(?:ethod)?\s+/ - debug_method_info($', binding) - - when /^\s*th(?:read)?\s+/ - if DEBUGGER__.debug_thread_info($', binding) == :cont - prompt = false - end - - when /^\s*pp\s+/ - PP.pp(debug_eval($', binding), stdout) - - when /^\s*p\s+/ - stdout.printf "%s\n", debug_eval($', binding).inspect - - when /^\s*r(?:estart)?$/ - $debugger_restart.call - - when /^\s*h(?:elp)?$/ - debug_print_help() - - else - v = debug_eval(input, binding) - stdout.printf "%s\n", v.inspect - end - end - end - MUTEX.unlock - resume_all - end - - def debug_print_help - stdout.print < - b[reak] [class.] - set breakpoint to some position - wat[ch] set watchpoint to some expression - cat[ch] (|off) set catchpoint to an exception - b[reak] list breakpoints - cat[ch] show catchpoint - del[ete][ nnn] delete some or all breakpoints - disp[lay] add expression into display expression list - undisp[lay][ nnn] delete one particular or all display expressions - c[ont] run until program ends or hit breakpoint - s[tep][ nnn] step (into methods) one line or till line nnn - n[ext][ nnn] go over one line or till line nnn - w[here] display frames - f[rame] alias for where - l[ist][ (-|nn-mm)] list program, - lists backwards - nn-mm lists given lines - up[ nn] move to higher frame - down[ nn] move to lower frame - fin[ish] return to outer frame - tr[ace] (on|off) set trace mode of current thread - tr[ace] (on|off) all set trace mode of all threads - q[uit] exit from debugger - v[ar] g[lobal] show global variables - v[ar] l[ocal] show local variables - v[ar] i[nstance] show instance variables of object - v[ar] c[onst] show constants of object - m[ethod] i[nstance] show methods of object - m[ethod] show instance methods of class or module - th[read] l[ist] list all threads - th[read] c[ur[rent]] show current thread - th[read] [sw[itch]] switch thread context to nnn - th[read] stop stop thread nnn - th[read] resume resume thread nnn - p expression evaluate expression and print its value - h[elp] print this help - evaluate -EOHELP - end - - def display_expressions(binding) - n = 1 - for d in display - if d[0] - stdout.printf "%d: ", n - display_expression(d[1], binding) - end - n += 1 - end - end - - def display_expression(exp, binding) - stdout.printf "%s = %s\n", exp, debug_silent_eval(exp, binding).to_s - end - - def frame_set_pos(file, line) - if @frames[0] - @frames[0][1] = file - @frames[0][2] = line - end - end - - def display_frames(pos) - 0.upto(@frames.size - 1) do |n| - if n == pos - stdout.print "--> " - else - stdout.print " " - end - stdout.print format_frame(n) - end - end - - def format_frame(pos) - bind, file, line, id = @frames[pos] - sprintf "#%d %s:%s%s\n", pos + 1, file, line, - (id ? ":in `#{id.id2name}'" : "") - end - - def display_list(b, e, file, line) - stdout.printf "[%d, %d] in %s\n", b, e, file - if lines = SCRIPT_LINES__[file] and lines != true - b.upto(e) do |n| - if n > 0 && lines[n-1] - if n == line - stdout.printf "=> %d %s\n", n, lines[n-1].chomp - else - stdout.printf " %d %s\n", n, lines[n-1].chomp - end - end - end - else - stdout.printf "No sourcefile available for %s\n", file - end - end - - def line_at(file, line) - lines = SCRIPT_LINES__[file] - if lines - return "\n" if lines == true - line = lines[line-1] - return "\n" unless line - return line - end - return "\n" - end - - def debug_funcname(id) - if id.nil? - "toplevel" - else - id.id2name - end - end - - def check_break_points(file, klass, pos, binding, id) - return false if break_points.empty? - n = 1 - for b in break_points - if b[0] # valid - if b[1] == 0 # breakpoint - if (b[2] == file and b[3] == pos) or - (klass and b[2] == klass and b[3] == pos) - stdout.printf "Breakpoint %d, %s at %s:%s\n", n, debug_funcname(id), file, pos - return true - end - elsif b[1] == 1 # watchpoint - if debug_silent_eval(b[2], binding) - stdout.printf "Watchpoint %d, %s at %s:%s\n", n, debug_funcname(id), file, pos - return true - end - end - end - n += 1 - end - return false - end - - def excn_handle(file, line, id, binding) - if $!.class <= SystemExit - set_trace_func nil - exit - end - - if @catch and ($!.class.ancestors.find { |e| e.to_s == @catch }) - stdout.printf "%s:%d: `%s' (%s)\n", file, line, $!, $!.class - fs = @frames.size - tb = caller(0)[-fs..-1] - if tb - for i in tb - stdout.printf "\tfrom %s\n", i - end - end - suspend_all - debug_command(file, line, id, binding) - end - end - - def trace_func(event, file, line, id, binding, klass) - Tracer.trace_func(event, file, line, id, binding, klass) if trace? - context(Thread.current).check_suspend - @file = file - @line = line - case event - when 'line' - frame_set_pos(file, line) - if !@no_step or @frames.size == @no_step - @stop_next -= 1 - @stop_next = -1 if @stop_next < 0 - elsif @frames.size < @no_step - @stop_next = 0 # break here before leaving... - else - # nothing to do. skipped. - end - if @stop_next == 0 or check_break_points(file, nil, line, binding, id) - @no_step = nil - suspend_all - debug_command(file, line, id, binding) - end - - when 'call' - @frames.unshift [binding, file, line, id] - if check_break_points(file, klass, id.id2name, binding, id) - suspend_all - debug_command(file, line, id, binding) - end - - when 'c-call' - frame_set_pos(file, line) - - when 'class' - @frames.unshift [binding, file, line, id] - - when 'return', 'end' - if @frames.size == @finish_pos - @stop_next = 1 - @finish_pos = 0 - end - @frames.shift - - when 'raise' - excn_handle(file, line, id, binding) - - end - @last_file = file - end -end - -trap("INT") { DEBUGGER__.interrupt } -@last_thread = Thread::main -@max_thread = 1 -@thread_list = {Thread::main => 1} -@break_points = [] -@display = [] -@waiting = [] -@stdout = STDOUT - -class << DEBUGGER__ - def stdout - @stdout - end - - def stdout=(s) - @stdout = s - end - - def display - @display - end - - def break_points - @break_points - end - - def waiting - @waiting - end - - def set_trace( arg ) - MUTEX.synchronize do - make_thread_list - for th, in @thread_list - context(th).set_trace arg - end - end - arg - end - - def set_last_thread(th) - @last_thread = th - end - - def suspend - MUTEX.synchronize do - make_thread_list - for th, in @thread_list - next if th == Thread.current - context(th).set_suspend - end - end - # Schedule other threads to suspend as soon as possible. - Thread.pass - end - - def resume - MUTEX.synchronize do - make_thread_list - @thread_list.each do |th,| - next if th == Thread.current - context(th).clear_suspend - end - waiting.each do |th| - th.run - end - waiting.clear - end - # Schedule other threads to restart as soon as possible. - Thread.pass - end - - def context(thread=Thread.current) - c = thread[:__debugger_data__] - unless c - thread[:__debugger_data__] = c = Context.new - end - c - end - - def interrupt - context(@last_thread).stop_next - end - - def get_thread(num) - th = @thread_list.key(num) - unless th - @stdout.print "No thread ##{num}\n" - throw :debug_error - end - th - end - - def thread_list(num) - th = get_thread(num) - if th == Thread.current - @stdout.print "+" - else - @stdout.print " " - end - @stdout.printf "%d ", num - @stdout.print th.inspect, "\t" - file = context(th).instance_eval{@file} - if file - @stdout.print file,":",context(th).instance_eval{@line} - end - @stdout.print "\n" - end - - def thread_list_all - for th in @thread_list.values.sort - thread_list(th) - end - end - - def make_thread_list - hash = {} - for th in Thread::list - if @thread_list.key? th - hash[th] = @thread_list[th] - else - @max_thread += 1 - hash[th] = @max_thread - end - end - @thread_list = hash - end - - def debug_thread_info(input, binding) - case input - when /^l(?:ist)?/ - make_thread_list - thread_list_all - - when /^c(?:ur(?:rent)?)?$/ - make_thread_list - thread_list(@thread_list[Thread.current]) - - when /^(?:sw(?:itch)?\s+)?(\d+)/ - make_thread_list - th = get_thread($1.to_i) - if th == Thread.current - @stdout.print "It's the current thread.\n" - else - thread_list(@thread_list[th]) - context(th).stop_next - th.run - return :cont - end - - when /^stop\s+(\d+)/ - make_thread_list - th = get_thread($1.to_i) - if th == Thread.current - @stdout.print "It's the current thread.\n" - elsif th.stop? - @stdout.print "Already stopped.\n" - else - thread_list(@thread_list[th]) - context(th).suspend - end - - when /^resume\s+(\d+)/ - make_thread_list - th = get_thread($1.to_i) - if th == Thread.current - @stdout.print "It's the current thread.\n" - elsif !th.stop? - @stdout.print "Already running." - else - thread_list(@thread_list[th]) - th.run - end - end - end -end - -stdout.printf "Debug.rb\n" -stdout.printf "Emacs support available.\n\n" -RubyVM::InstructionSequence.compile_option = { - trace_instruction: true -} -set_trace_func proc { |event, file, line, id, binding, klass, *rest| - DEBUGGER__.context.trace_func event, file, line, id, binding, klass -} -end diff --git a/Src/StdLib/ruby/1.9.1/profile.rb b/Src/StdLib/ruby/1.9.1/profile.rb deleted file mode 100644 index f93903891..000000000 --- a/Src/StdLib/ruby/1.9.1/profile.rb +++ /dev/null @@ -1,10 +0,0 @@ -require 'profiler' - -RubyVM::InstructionSequence.compile_option = { - :trace_instruction => true, - :specialized_instruction => false -} -END { - Profiler__::print_profile(STDERR) -} -Profiler__::start_profile diff --git a/Src/StdLib/ruby/1.9.1/profiler.rb b/Src/StdLib/ruby/1.9.1/profiler.rb deleted file mode 100644 index 44fd3eba2..000000000 --- a/Src/StdLib/ruby/1.9.1/profiler.rb +++ /dev/null @@ -1,59 +0,0 @@ -module Profiler__ - # internal values - @@start = @@stack = @@map = nil - PROFILE_PROC = proc{|event, file, line, id, binding, klass| - case event - when "call", "c-call" - now = Process.times[0] - @@stack.push [now, 0.0] - when "return", "c-return" - now = Process.times[0] - key = [klass, id] - if tick = @@stack.pop - data = (@@map[key] ||= [0, 0.0, 0.0, key]) - data[0] += 1 - cost = now - tick[0] - data[1] += cost - data[2] += cost - tick[1] - @@stack[-1][1] += cost if @@stack[-1] - end - end - } -module_function - def start_profile - @@start = Process.times[0] - @@stack = [] - @@map = {} - set_trace_func PROFILE_PROC - end - def stop_profile - set_trace_func nil - end - def print_profile(f) - stop_profile - total = Process.times[0] - @@start - if total == 0 then total = 0.01 end - data = @@map.values - data = data.sort_by{|x| -x[2]} - sum = 0 - f.printf " %% cumulative self self total\n" - f.printf " time seconds seconds calls ms/call ms/call name\n" - for d in data - sum += d[2] - f.printf "%6.2f %8.2f %8.2f %8d ", d[2]/total*100, sum, d[2], d[0] - f.printf "%8.2f %8.2f %s\n", d[2]*1000/d[0], d[1]*1000/d[0], get_name(*d[3]) - end - f.printf "%6.2f %8.2f %8.2f %8d ", 0.0, total, 0.0, 1 # ??? - f.printf "%8.2f %8.2f %s\n", 0.0, total*1000, "#toplevel" # ??? - end - def get_name(klass, id) - name = klass.to_s || "" - if klass.kind_of? Class - name += "#" - else - name += "." - end - name + id.id2name - end - private :get_name -end diff --git a/Src/StdLib/ruby/1.9.1/tracer.rb b/Src/StdLib/ruby/1.9.1/tracer.rb deleted file mode 100644 index 3e5d6e226..000000000 --- a/Src/StdLib/ruby/1.9.1/tracer.rb +++ /dev/null @@ -1,195 +0,0 @@ -# tracer.rb - -# $Release Version: 0.3$ -# $Revision: 1.12 $ -# by Keiju ISHITSUKA(keiju@ishitsuka.com) -# -# -- -# -# -# -require "thread" - -# -# tracer main class -# -class Tracer - class << self - attr_accessor :verbose - alias verbose? verbose - - attr_accessor :stdout - attr_reader :stdout_mutex - - # display process id? - attr_accessor :display_process_id - alias display_process_id? display_process_id - - # display thread id? - attr_accessor :display_thread_id - alias display_thread_id? display_thread_id - - # display builtin method call? - attr_accessor :display_c_call - alias display_c_call? display_c_call - end - Tracer::stdout = STDOUT - Tracer::verbose = false - Tracer::display_process_id = false - Tracer::display_thread_id = true - Tracer::display_c_call = false - - @stdout_mutex = Mutex.new - - EVENT_SYMBOL = { - "line" => "-", - "call" => ">", - "return" => "<", - "class" => "C", - "end" => "E", - "raise" => "^", - "c-call" => "}", - "c-return" => "{", - "unknown" => "?" - } - - def initialize - @threads = Hash.new - if defined? Thread.main - @threads[Thread.main.object_id] = 0 - else - @threads[Thread.current.object_id] = 0 - end - - @get_line_procs = {} - - @filters = [] - end - - def stdout - Tracer.stdout - end - - def on - if block_given? - on - begin - yield - ensure - off - end - else - set_trace_func method(:trace_func).to_proc - stdout.print "Trace on\n" if Tracer.verbose? - end - end - - def off - set_trace_func nil - stdout.print "Trace off\n" if Tracer.verbose? - end - - def add_filter(p = proc) - @filters.push p - end - - def set_get_line_procs(file, p = proc) - @get_line_procs[file] = p - end - - def get_line(file, line) - if p = @get_line_procs[file] - return p.call(line) - end - - unless list = SCRIPT_LINES__[file] - begin - f = File::open(file) - begin - SCRIPT_LINES__[file] = list = f.readlines - ensure - f.close - end - rescue - SCRIPT_LINES__[file] = list = [] - end - end - - if l = list[line - 1] - l - else - "-\n" - end - end - - def get_thread_no - if no = @threads[Thread.current.object_id] - no - else - @threads[Thread.current.object_id] = @threads.size - end - end - - def trace_func(event, file, line, id, binding, klass, *) - return if file == __FILE__ - - for p in @filters - return unless p.call event, file, line, id, binding, klass - end - - return unless Tracer::display_c_call? or - event != "c-call" && event != "c-return" - - Tracer::stdout_mutex.synchronize do - if EVENT_SYMBOL[event] - stdout.printf("<%d>", $$) if Tracer::display_process_id? - stdout.printf("#%d:", get_thread_no) if Tracer::display_thread_id? - if line == 0 - source = "?\n" - else - source = get_line(file, line) - end - printf("%s:%d:%s:%s: %s", - file, - line, - klass || '', - EVENT_SYMBOL[event], - source) - end - end - - end - - Single = new - def Tracer.on - if block_given? - Single.on{yield} - else - Single.on - end - end - - def Tracer.off - Single.off - end - - def Tracer.set_get_line_procs(file_name, p = proc) - Single.set_get_line_procs(file_name, p) - end - - def Tracer.add_filter(p = proc) - Single.add_filter(p) - end -end - -SCRIPT_LINES__ = {} unless defined? SCRIPT_LINES__ - -if $0 == __FILE__ - # direct call - - $0 = ARGV[0] - ARGV.shift - Tracer.on - require $0 -elsif caller.size <= 1 - Tracer.on -end diff --git a/Src/StdLib/ruby/1.9.1/win32/registry.rb b/Src/StdLib/ruby/1.9.1/win32/registry.rb deleted file mode 100644 index 356deea77..000000000 --- a/Src/StdLib/ruby/1.9.1/win32/registry.rb +++ /dev/null @@ -1,845 +0,0 @@ -require 'dl/import' -module Win32 - -=begin rdoc -= Win32 Registry - -win32/registry is registry accessor library for Win32 platform. -It uses dl/import to call Win32 Registry APIs. - -== example - Win32::Registry::HKEY_CURRENT_USER.open('SOFTWARE\foo') do |reg| - value = reg['foo'] # read a value - value = reg['foo', Win32::Registry::REG_SZ] # read a value with type - type, value = reg.read('foo') # read a value - reg['foo'] = 'bar' # write a value - reg['foo', Win32::Registry::REG_SZ] = 'bar' # write a value with type - reg.write('foo', Win32::Registry::REG_SZ, 'bar') # write a value - - reg.each_value { |name, type, data| ... } # Enumerate values - reg.each_key { |key, wtime| ... } # Enumerate subkeys - - reg.delete_value(name) # Delete a value - reg.delete_key(name) # Delete a subkey - reg.delete_key(name, true) # Delete a subkey recursively - end - -= Reference - -== Win32::Registry class - ---- info - ---- num_keys - ---- max_key_length - ---- num_values - ---- max_value_name_length - ---- max_value_length - ---- descriptor_length - ---- wtime - Returns an item of key information. - -=== constants ---- HKEY_CLASSES_ROOT - ---- HKEY_CURRENT_USER - ---- HKEY_LOCAL_MACHINE - ---- HKEY_PERFORMANCE_DATA - ---- HKEY_CURRENT_CONFIG - ---- HKEY_DYN_DATA - - Win32::Registry object whose key is predefined key. -For detail, see the MSDN[http://msdn.microsoft.com/library/en-us/sysinfo/base/predefined_keys.asp] article. - -=end rdoc - - class Registry - - # - # For detail, see the MSDN[http://msdn.microsoft.com/library/en-us/sysinfo/base/registry.asp]. - # - # --- HKEY_* - # - # Predefined key ((*handle*)). - # These are Integer, not Win32::Registry. - # - # --- REG_* - # - # Registry value type. - # - # --- KEY_* - # - # Security access mask. - # - # --- KEY_OPTIONS_* - # - # Key options. - # - # --- REG_CREATED_NEW_KEY - # - # --- REG_OPENED_EXISTING_KEY - # - # If the key is created newly or opened existing key. - # See also Registry#disposition method. - module Constants - HKEY_CLASSES_ROOT = 0x80000000 - HKEY_CURRENT_USER = 0x80000001 - HKEY_LOCAL_MACHINE = 0x80000002 - HKEY_USERS = 0x80000003 - HKEY_PERFORMANCE_DATA = 0x80000004 - HKEY_PERFORMANCE_TEXT = 0x80000050 - HKEY_PERFORMANCE_NLSTEXT = 0x80000060 - HKEY_CURRENT_CONFIG = 0x80000005 - HKEY_DYN_DATA = 0x80000006 - - REG_NONE = 0 - REG_SZ = 1 - REG_EXPAND_SZ = 2 - REG_BINARY = 3 - REG_DWORD = 4 - REG_DWORD_LITTLE_ENDIAN = 4 - REG_DWORD_BIG_ENDIAN = 5 - REG_LINK = 6 - REG_MULTI_SZ = 7 - REG_RESOURCE_LIST = 8 - REG_FULL_RESOURCE_DESCRIPTOR = 9 - REG_RESOURCE_REQUIREMENTS_LIST = 10 - REG_QWORD = 11 - REG_QWORD_LITTLE_ENDIAN = 11 - - STANDARD_RIGHTS_READ = 0x00020000 - STANDARD_RIGHTS_WRITE = 0x00020000 - KEY_QUERY_VALUE = 0x0001 - KEY_SET_VALUE = 0x0002 - KEY_CREATE_SUB_KEY = 0x0004 - KEY_ENUMERATE_SUB_KEYS = 0x0008 - KEY_NOTIFY = 0x0010 - KEY_CREATE_LINK = 0x0020 - KEY_READ = STANDARD_RIGHTS_READ | - KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS | KEY_NOTIFY - KEY_WRITE = STANDARD_RIGHTS_WRITE | - KEY_SET_VALUE | KEY_CREATE_SUB_KEY - KEY_EXECUTE = KEY_READ - KEY_ALL_ACCESS = KEY_READ | KEY_WRITE | KEY_CREATE_LINK - - REG_OPTION_RESERVED = 0x0000 - REG_OPTION_NON_VOLATILE = 0x0000 - REG_OPTION_VOLATILE = 0x0001 - REG_OPTION_CREATE_LINK = 0x0002 - REG_OPTION_BACKUP_RESTORE = 0x0004 - REG_OPTION_OPEN_LINK = 0x0008 - REG_LEGAL_OPTION = REG_OPTION_RESERVED | - REG_OPTION_NON_VOLATILE | REG_OPTION_CREATE_LINK | - REG_OPTION_BACKUP_RESTORE | REG_OPTION_OPEN_LINK - - REG_CREATED_NEW_KEY = 1 - REG_OPENED_EXISTING_KEY = 2 - - REG_WHOLE_HIVE_VOLATILE = 0x0001 - REG_REFRESH_HIVE = 0x0002 - REG_NO_LAZY_FLUSH = 0x0004 - REG_FORCE_RESTORE = 0x0008 - - MAX_KEY_LENGTH = 514 - MAX_VALUE_LENGTH = 32768 - end - include Constants - include Enumerable - - # - # Error - # - class Error < ::StandardError - module Kernel32 - extend DL::Importer - dlload "kernel32.dll" - end - FormatMessageA = Kernel32.extern "int FormatMessageA(int, void *, int, int, void *, int, void *)", :stdcall - def initialize(code) - @code = code - msg = "\0".force_encoding(Encoding::ASCII_8BIT) * 1024 - len = FormatMessageA.call(0x1200, 0, code, 0, msg, 1024, 0) - msg = msg[0, len].force_encoding(Encoding.find(Encoding.locale_charmap)) - super msg.tr("\r", '').chomp - end - attr_reader :code - end - - # - # Predefined Keys - # - class PredefinedKey < Registry - def initialize(hkey, keyname) - @hkey = hkey - @parent = nil - @keyname = keyname - @disposition = REG_OPENED_EXISTING_KEY - end - - # Predefined keys cannot be closed - def close - raise Error.new(5) ## ERROR_ACCESS_DENIED - end - - # Fake #class method for Registry#open, Registry#create - def class - Registry - end - - # Make all - Constants.constants.grep(/^HKEY_/) do |c| - Registry.const_set c, new(Constants.const_get(c), c.to_s) - end - end - - # - # Win32 APIs - # - module API - extend DL::Importer - dlload "advapi32.dll" - [ - "long RegOpenKeyExA(void *, void *, long, long, void *)", - "long RegCreateKeyExA(void *, void *, long, long, long, long, void *, void *)", - "long RegEnumValueA(void *, long, void *, void *, void *, void *, void *, void *)", - "long RegEnumKeyExA(void *, long, void *, void *, void *, void *, void *, void *)", - "long RegQueryValueExA(void *, void *, void *, void *, void *, void *)", - "long RegSetValueExA(void *, void *, long, long, void *, long)", - "long RegDeleteValue(void *, void *)", - "long RegDeleteKey(void *, void *)", - "long RegFlushKey(void *)", - "long RegCloseKey(void *)", - "long RegQueryInfoKey(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *)", - ].each do |fn| - cfunc = extern fn, :stdcall - const_set cfunc.name.intern, cfunc - end - - module_function - - def check(result) - raise Error, result, caller(2) if result != 0 - end - - def packdw(dw) - [dw].pack('V') - end - - def unpackdw(dw) - dw += [0].pack('V') - dw.unpack('V')[0] - end - - def packqw(qw) - [ qw & 0xFFFFFFFF, qw >> 32 ].pack('VV') - end - - def unpackqw(qw) - qw = qw.unpack('VV') - (qw[1] << 32) | qw[0] - end - - def OpenKey(hkey, name, opt, desired) - result = packdw(0) - check RegOpenKeyExA.call(hkey, name, opt, desired, result) - unpackdw(result) - end - - def CreateKey(hkey, name, opt, desired) - result = packdw(0) - disp = packdw(0) - check RegCreateKeyExA.call(hkey, name, 0, 0, opt, desired, - 0, result, disp) - [ unpackdw(result), unpackdw(disp) ] - end - - def EnumValue(hkey, index) - name = ' ' * Constants::MAX_KEY_LENGTH - size = packdw(Constants::MAX_KEY_LENGTH) - check RegEnumValueA.call(hkey, index, name, size, 0, 0, 0, 0) - name[0, unpackdw(size)] - end - - def EnumKey(hkey, index) - name = ' ' * Constants::MAX_KEY_LENGTH - size = packdw(Constants::MAX_KEY_LENGTH) - wtime = ' ' * 8 - check RegEnumKeyExA.call(hkey, index, name, size, 0, 0, 0, wtime) - [ name[0, unpackdw(size)], unpackqw(wtime) ] - end - - def QueryValue(hkey, name) - type = packdw(0) - size = packdw(0) - check RegQueryValueExA.call(hkey, name, 0, type, 0, size) - data = ' ' * unpackdw(size) - check RegQueryValueExA.call(hkey, name, 0, type, data, size) - [ unpackdw(type), data[0, unpackdw(size)] ] - end - - def SetValue(hkey, name, type, data, size) - check RegSetValueExA.call(hkey, name, 0, type, data, size) - end - - def DeleteValue(hkey, name) - check RegDeleteValue.call(hkey, name) - end - - def DeleteKey(hkey, name) - check RegDeleteKey.call(hkey, name) - end - - def FlushKey(hkey) - check RegFlushKey.call(hkey) - end - - def CloseKey(hkey) - check RegCloseKey.call(hkey) - end - - def QueryInfoKey(hkey) - subkeys = packdw(0) - maxsubkeylen = packdw(0) - values = packdw(0) - maxvaluenamelen = packdw(0) - maxvaluelen = packdw(0) - secdescs = packdw(0) - wtime = ' ' * 8 - check RegQueryInfoKey.call(hkey, 0, 0, 0, subkeys, maxsubkeylen, 0, - values, maxvaluenamelen, maxvaluelen, secdescs, wtime) - [ unpackdw(subkeys), unpackdw(maxsubkeylen), unpackdw(values), - unpackdw(maxvaluenamelen), unpackdw(maxvaluelen), - unpackdw(secdescs), unpackqw(wtime) ] - end - end - - # - # Replace %\w+% into the environment value of what is contained between the %'s - # This method is used for REG_EXPAND_SZ. - # - # For detail, see expandEnvironmentStrings[http://msdn.microsoft.com/library/en-us/sysinfo/base/expandenvironmentstrings.asp] \Win32 \API. - # - def self.expand_environ(str) - str.gsub(/%([^%]+)%/) { ENV[$1] || ENV[$1.upcase] || $& } - end - - @@type2name = { } - %w[ - REG_NONE REG_SZ REG_EXPAND_SZ REG_BINARY REG_DWORD - REG_DWORD_BIG_ENDIAN REG_LINK REG_MULTI_SZ - REG_RESOURCE_LIST REG_FULL_RESOURCE_DESCRIPTOR - REG_RESOURCE_REQUIREMENTS_LIST REG_QWORD - ].each do |type| - @@type2name[Constants.const_get(type)] = type - end - - # - # Convert registry type value to readable string. - # - def self.type2name(type) - @@type2name[type] || type.to_s - end - - # - # Convert 64-bit FILETIME integer into Time object. - # - def self.wtime2time(wtime) - Time.at((wtime - 116444736000000000) / 10000000) - end - - # - # Convert Time object or Integer object into 64-bit FILETIME. - # - def self.time2wtime(time) - time.to_i * 10000000 + 116444736000000000 - end - - # - # constructor - # - private_class_method :new - - # - # --- Registry.open(key, subkey, desired = KEY_READ, opt = REG_OPTION_RESERVED) - # - # --- Registry.open(key, subkey, desired = KEY_READ, opt = REG_OPTION_RESERVED) { |reg| ... } - # - # Open the registry key subkey under key. - # key is Win32::Registry object of parent key. - # You can use predefined key HKEY_* (see Constants) - # desired and opt is access mask and key option. - # For detail, see the MSDN[http://msdn.microsoft.com/library/en-us/sysinfo/base/regopenkeyex.asp]. - # If block is given, the key is closed automatically. - def self.open(hkey, subkey, desired = KEY_READ, opt = REG_OPTION_RESERVED) - subkey = subkey.chomp('\\') - newkey = API.OpenKey(hkey.hkey, subkey, opt, desired) - obj = new(newkey, hkey, subkey, REG_OPENED_EXISTING_KEY) - if block_given? - begin - yield obj - ensure - obj.close - end - else - obj - end - end - - # - # --- Registry.create(key, subkey, desired = KEY_ALL_ACCESS, opt = REG_OPTION_RESERVED) - # - # --- Registry.create(key, subkey, desired = KEY_ALL_ACCESS, opt = REG_OPTION_RESERVED) { |reg| ... } - # - # Create or open the registry key subkey under key. - # You can use predefined key HKEY_* (see Constants) - # - # If subkey is already exists, key is opened and Registry#created? - # method will return false. - # - # If block is given, the key is closed automatically. - # - def self.create(hkey, subkey, desired = KEY_ALL_ACCESS, opt = REG_OPTION_RESERVED) - newkey, disp = API.CreateKey(hkey.hkey, subkey, opt, desired) - obj = new(newkey, hkey, subkey, disp) - if block_given? - begin - yield obj - ensure - obj.close - end - else - obj - end - end - - # - # finalizer - # - @@final = proc { |hkey| proc { API.CloseKey(hkey[0]) if hkey[0] } } - - # - # initialize - # - def initialize(hkey, parent, keyname, disposition) - @hkey = hkey - @parent = parent - @keyname = keyname - @disposition = disposition - @hkeyfinal = [ hkey ] - ObjectSpace.define_finalizer self, @@final.call(@hkeyfinal) - end - - # Returns key handle value. - attr_reader :hkey - # Win32::Registry object of parent key, or nil if predefeined key. - attr_reader :parent - # Same as subkey value of Registry.open or - # Registry.create method. - attr_reader :keyname - # Disposition value (REG_CREATED_NEW_KEY or REG_OPENED_EXISTING_KEY). - attr_reader :disposition - - # - # Returns if key is created ((*newly*)). - # (see Registry.create) -- basically you call create - # then when you call created? on the instance returned - # it will tell if it was successful or not - # - def created? - @disposition == REG_CREATED_NEW_KEY - end - - # - # Returns if key is not closed. - # - def open? - !@hkey.nil? - end - - # - # Full path of key such as 'HKEY_CURRENT_USER\SOFTWARE\foo\bar'. - # - def name - parent = self - name = @keyname - while parent = parent.parent - name = parent.keyname + '\\' + name - end - name - end - - def inspect - "\#" - end - - # - # marshalling is not allowed - # - def _dump(depth) - raise TypeError, "can't dump Win32::Registry" - end - - # - # Same as Win32::Registry.open (self, subkey, desired, opt) - # - def open(subkey, desired = KEY_READ, opt = REG_OPTION_RESERVED, &blk) - self.class.open(self, subkey, desired, opt, &blk) - end - - # - # Same as Win32::Registry.create (self, subkey, desired, opt) - # - def create(subkey, desired = KEY_ALL_ACCESS, opt = REG_OPTION_RESERVED, &blk) - self.class.create(self, subkey, desired, opt, &blk) - end - - # - # Close key. - # - # After close, most method raise an error. - # - def close - API.CloseKey(@hkey) - @hkey = @parent = @keyname = nil - @hkeyfinal[0] = nil - end - - # - # Enumerate values. - # - def each_value - index = 0 - while true - begin - subkey = API.EnumValue(@hkey, index) - rescue Error - break - end - begin - type, data = read(subkey) - rescue Error - next - end - yield subkey, type, data - index += 1 - end - index - end - alias each each_value - - # - # Enumerate subkeys. - # - # subkey is String which contains name of subkey. - # wtime is last write time as FILETIME (64-bit integer). - # (see Registry.wtime2time) - # - def each_key - index = 0 - while true - begin - subkey, wtime = API.EnumKey(@hkey, index) - rescue Error - break - end - yield subkey, wtime - index += 1 - end - index - end - - # - # return keys as an array - # - def keys - keys_ary = [] - each_key { |key,| keys_ary << key } - keys_ary - end - - # Read a registry value named name and return array of - # [ type, data ]. - # When name is nil, the `default' value is read. - # type is value type. (see Win32::Registry::Constants module) - # data is value data, its class is: - # :REG_SZ, REG_EXPAND_SZ - # String - # :REG_MULTI_SZ - # Array of String - # :REG_DWORD, REG_DWORD_BIG_ENDIAN, REG_QWORD - # Integer - # :REG_BINARY - # String (contains binary data) - # - # When rtype is specified, the value type must be included by - # rtype array, or TypeError is raised. - def read(name, *rtype) - type, data = API.QueryValue(@hkey, name) - unless rtype.empty? or rtype.include?(type) - raise TypeError, "Type mismatch (expect #{rtype.inspect} but #{type} present)" - end - case type - when REG_SZ, REG_EXPAND_SZ - [ type, data.chop ] - when REG_MULTI_SZ - [ type, data.split(/\0/) ] - when REG_BINARY - [ type, data ] - when REG_DWORD - [ type, API.unpackdw(data) ] - when REG_DWORD_BIG_ENDIAN - [ type, data.unpack('N')[0] ] - when REG_QWORD - [ type, API.unpackqw(data) ] - else - raise TypeError, "Type #{type} is not supported." - end - end - - # - # Read a registry value named name and return its value data. - # The class of value is same as #read method returns. - # - # If the value type is REG_EXPAND_SZ, returns value data whose environment - # variables are replaced. - # If the value type is neither REG_SZ, REG_MULTI_SZ, REG_DWORD, - # REG_DWORD_BIG_ENDIAN, nor REG_QWORD, TypeError is raised. - # - # The meaning of rtype is same as #read method. - # - def [](name, *rtype) - type, data = read(name, *rtype) - case type - when REG_SZ, REG_DWORD, REG_QWORD, REG_MULTI_SZ - data - when REG_EXPAND_SZ - Registry.expand_environ(data) - else - raise TypeError, "Type #{type} is not supported." - end - end - - # Read a REG_SZ(read_s), REG_DWORD(read_i), or REG_BINARY(read_bin) - # registry value named name. - # - # If the values type does not match, TypeError is raised. - def read_s(name) - read(name, REG_SZ)[1] - end - - # - # Read a REG_SZ or REG_EXPAND_SZ registry value named name. - # - # If the value type is REG_EXPAND_SZ, environment variables are replaced. - # Unless the value type is REG_SZ or REG_EXPAND_SZ, TypeError is raised. - # - def read_s_expand(name) - type, data = read(name, REG_SZ, REG_EXPAND_SZ) - if type == REG_EXPAND_SZ - Registry.expand_environ(data) - else - data - end - end - - # - # Read a REG_SZ(read_s), REG_DWORD(read_i), or REG_BINARY(read_bin) - # registry value named name. - # - # If the values type does not match, TypeError is raised. - # - def read_i(name) - read(name, REG_DWORD, REG_DWORD_BIG_ENDIAN, REG_QWORD)[1] - end - - # - # Read a REG_SZ(read_s), REG_DWORD(read_i), or REG_BINARY(read_bin) - # registry value named name. - # - # If the values type does not match, TypeError is raised. - # - def read_bin(name) - read(name, REG_BINARY)[1] - end - - # - # Write data to a registry value named name. - # When name is nil, write to the `default' value. - # - # type is type value. (see Registry::Constants module) - # Class of data must be same as which #read - # method returns. - # - def write(name, type, data) - case type - when REG_SZ, REG_EXPAND_SZ - data = data.to_s + "\0" - when REG_MULTI_SZ - data = data.to_a.join("\0") + "\0\0" - when REG_BINARY - data = data.to_s - when REG_DWORD - data = API.packdw(data.to_i) - when REG_DWORD_BIG_ENDIAN - data = [data.to_i].pack('N') - when REG_QWORD - data = API.packqw(data.to_i) - else - raise TypeError, "Unsupported type #{type}" - end - API.SetValue(@hkey, name, type, data, data.length) - end - - # - # Write value to a registry value named name. - # - # If wtype is specified, the value type is it. - # Otherwise, the value type is depend on class of value: - # :Integer - # REG_DWORD - # :String - # REG_SZ - # :Array - # REG_MULTI_SZ - # - def []=(name, rtype, value = nil) - if value - write name, rtype, value - else - case value = rtype - when Integer - write name, REG_DWORD, value - when String - write name, REG_SZ, value - when Array - write name, REG_MULTI_SZ, value - else - raise TypeError, "Unexpected type #{value.class}" - end - end - value - end - - # - # Write value to a registry value named name. - # - # The value type is REG_SZ(write_s), REG_DWORD(write_i), or - # REG_BINARY(write_bin). - # - def write_s(name, value) - write name, REG_SZ, value.to_s - end - - # - # Write value to a registry value named name. - # - # The value type is REG_SZ(write_s), REG_DWORD(write_i), or - # REG_BINARY(write_bin). - # - def write_i(name, value) - write name, REG_DWORD, value.to_i - end - - # - # Write value to a registry value named name. - # - # The value type is REG_SZ(write_s), REG_DWORD(write_i), or - # REG_BINARY(write_bin). - # - def write_bin(name, value) - write name, REG_BINARY, value.to_s - end - - # - # Delete a registry value named name. - # We can not delete the `default' value. - # - def delete_value(name) - API.DeleteValue(@hkey, name) - end - alias delete delete_value - - # - # Delete a subkey named name and all its values. - # - # If recursive is false, the subkey must not have subkeys. - # Otherwise, this method deletes all subkeys and values recursively. - # - def delete_key(name, recursive = false) - if recursive - open(name, KEY_ALL_ACCESS) do |reg| - reg.keys.each do |key| - begin - reg.delete_key(key, true) - rescue Error - # - end - end - end - API.DeleteKey(@hkey, name) - else - begin - API.EnumKey @hkey, 0 - rescue Error - return API.DeleteKey(@hkey, name) - end - raise Error.new(5) ## ERROR_ACCESS_DENIED - end - end - - # - # Write all the attributes into the registry file. - # - def flush - API.FlushKey @hkey - end - - # - # Returns key information as Array of: - # :num_keys - # The number of subkeys. - # :max_key_length - # Maximum length of name of subkeys. - # :num_values - # The number of values. - # :max_value_name_length - # Maximum length of name of values. - # :max_value_length - # Maximum length of value of values. - # :descriptor_length - # Length of security descriptor. - # :wtime - # Last write time as FILETIME(64-bit integer) - # - # For detail, see RegQueryInfoKey[http://msdn.microsoft.com/library/en-us/sysinfo/base/regqueryinfokey.asp] Win32 API. - # - def info - API.QueryInfoKey(@hkey) - end - - # - # Returns an item of key information. - # - %w[ - num_keys max_key_length - num_values max_value_name_length max_value_length - descriptor_length wtime - ].each_with_index do |s, i| - eval <<-__END__ - def #{s} - info[#{i}] - end - __END__ - end - end -end diff --git a/Src/StdLib/ruby/1.9.1/win32/resolv.rb b/Src/StdLib/ruby/1.9.1/win32/resolv.rb deleted file mode 100644 index 80fc8a09c..000000000 --- a/Src/StdLib/ruby/1.9.1/win32/resolv.rb +++ /dev/null @@ -1,379 +0,0 @@ -=begin -= Win32 DNS and DHCP I/F - -=end - -require "dl/import" -require 'win32/registry' - -module Win32 - module Resolv - API = Registry::API - - def self.get_hosts_path - path = get_hosts_dir - path = File.expand_path('hosts', path) - File.exist?(path) ? path : nil - end - - def self.get_resolv_info - search, nameserver = get_info - if search.empty? - search = nil - else - search.delete("") - search.uniq! - end - if nameserver.empty? - nameserver = nil - else - nameserver.delete("") - nameserver.delete("0.0.0.0") - nameserver.uniq! - end - [ search, nameserver ] - end - -module Kernel32 - extend DL::Importer - dlload "kernel32" -end -getv = Kernel32.extern "int GetVersionExA(void *)", :stdcall -info = [ 148, 0, 0, 0, 0 ].pack('V5') + "\0" * 128 -getv.call(info) -if info.unpack('V5')[4] == 2 # VER_PLATFORM_WIN32_NT -#==================================================================== -# Windows NT -#==================================================================== - module_eval <<-'__EOS__', __FILE__, __LINE__+1 - TCPIP_NT = 'SYSTEM\CurrentControlSet\Services\Tcpip\Parameters' - - class << self - private - def get_hosts_dir - Registry::HKEY_LOCAL_MACHINE.open(TCPIP_NT) do |reg| - reg.read_s_expand('DataBasePath') - end - end - - def get_info - search = nil - nameserver = [] - Registry::HKEY_LOCAL_MACHINE.open(TCPIP_NT) do |reg| - begin - slist = reg.read_s('SearchList') - search = slist.split(/,\s*/) unless slist.empty? - rescue Registry::Error - end - - if add_search = search.nil? - search = [] - begin - nvdom = reg.read_s('NV Domain') - unless nvdom.empty? - @search = [ nvdom ] - if reg.read_i('UseDomainNameDevolution') != 0 - if /^[\w\d]+\./ =~ nvdom - devo = $' - end - end - end - rescue Registry::Error - end - end - - reg.open('Interfaces') do |h| - h.each_key do |iface,| - h.open(iface) do |regif| - begin - [ 'NameServer', 'DhcpNameServer' ].each do |key| - begin - ns = regif.read_s(key) - rescue - else - unless ns.empty? - nameserver.concat(ns.split(/[,\s]\s*/)) - break - end - end - end - rescue Registry::Error - end - - if add_search - begin - [ 'Domain', 'DhcpDomain' ].each do |key| - dom = regif.read_s(key) - unless dom.empty? - search.concat(dom.split(/,\s*/)) - break - end - end - rescue Registry::Error - end - end - end - end - end - search << devo if add_search and devo - end - [ search.uniq, nameserver.uniq ] - end - end - __EOS__ -else -#==================================================================== -# Windows 9x -#==================================================================== - module_eval <<-'__EOS__', __FILE__, __LINE__+1 - TCPIP_9X = 'SYSTEM\CurrentControlSet\Services\VxD\MSTCP' - DHCP_9X = 'SYSTEM\CurrentControlSet\Services\VxD\DHCP' - WINDOWS = 'Software\Microsoft\Windows\CurrentVersion' - - class << self - # private - - def get_hosts_dir - Registry::HKEY_LOCAL_MACHINE.open(WINDOWS) do |reg| - reg.read_s_expand('SystemRoot') - end - end - - def get_info - search = [] - nameserver = [] - begin - Registry::HKEY_LOCAL_MACHINE.open(TCPIP_9X) do |reg| - if reg.read_s("EnableDNS") == "1" - domain = reg.read_s("Domain") - ns = reg.read_s("NameServer") - slist = reg.read_s("SearchList") - search << domain unless domain.empty? - search.concat(slist.split(/,\s*/)) - nameserver.concat(ns.split(/[,\s]\s*/)) - end - end - rescue Registry::Error - end - - dhcpinfo = get_dhcpinfo - search.concat(dhcpinfo[0]) - nameserver.concat(dhcpinfo[1]) - [ search, nameserver ] - end - - def get_dhcpinfo - macaddrs = {} - ipaddrs = {} - WsControl.get_iflist.each do |index, macaddr, *ipaddr| - macaddrs[macaddr] = 1 - ipaddr.each { |ipaddr| ipaddrs[ipaddr] = 1 } - end - iflist = [ macaddrs, ipaddrs ] - - search = [] - nameserver = [] - version = -1 - Registry::HKEY_LOCAL_MACHINE.open(DHCP_9X) do |reg| - begin - version = API.unpackdw(reg.read_bin("Version")) - rescue Registry::Error - end - - reg.each_key do |key,| - catch(:not_used) do - reg.open(key) do |regdi| - dom, ns = get_dhcpinfo_key(version, regdi, iflist) - search << dom if dom - nameserver.concat(ns) if ns - end - end - end - end - [ search, nameserver ] - end - - def get_dhcpinfo_95(reg) - dhcp = reg.read_bin("DhcpInfo") - [ - API.unpackdw(dhcp[4..7]), - API.unpackdw(dhcp[8..11]), - 1, - dhcp[45..50], - reg.read_bin("OptionInfo"), - ] - end - - def get_dhcpinfo_98(reg) - [ - API.unpackdw(reg.read_bin("DhcpIPAddress")), - API.unpackdw(reg.read_bin("DhcpSubnetMask")), - API.unpackdw(reg.read_bin("HardwareType")), - reg.read_bin("HardwareAddress"), - reg.read_bin("OptionInfo"), - ] - end - - def get_dhcpinfo_key(version, reg, iflist) - info = case version - when 1 - get_dhcpinfo_95(reg) - when 2 - get_dhcpinfo_98(reg) - else - begin - get_dhcpinfo_98(reg) - rescue Registry::Error - get_dhcpinfo_95(reg) - end - end - ipaddr, netmask, hwtype, macaddr, opt = info - throw :not_used unless - ipaddr and ipaddr != 0 and - netmask and netmask != 0 and - macaddr and macaddr.size == 6 and - hwtype == 1 and - iflist[0][macaddr] and iflist[1][ipaddr] - - size = opt.size - idx = 0 - while idx <= size - opttype = opt[idx] - optsize = opt[idx + 1] - optval = opt[idx + 2, optsize] - case opttype - when 0xFF ## term - break - when 0x0F ## domain - domain = optval.chomp("\0") - when 0x06 ## dns - nameserver = optval.scan(/..../).collect { |addr| - "%d.%d.%d.%d" % addr.unpack('C4') - } - end - idx += optsize + 2 - end - [ domain, nameserver ] - rescue Registry::Error - throw :not_used - end - end - - module WsControl - module WSock32 - extend DL::Importer - dlload "wsock32.dll" - end - WsControl = WSock32.extern "int WsControl(int, int, void *, void *, void *, void *", :stdcall - WSAGetLastError = WSock32.extern "int WSAGetLastError(void)", :stdcall - - MAX_TDI_ENTITIES = 512 - IPPROTO_TCP = 6 - WSCTL_TCP_QUERY_INFORMATION = 0 - INFO_CLASS_GENERIC = 0x100 - INFO_CLASS_PROTOCOL = 0x200 - INFO_TYPE_PROVIDER = 0x100 - ENTITY_LIST_ID = 0 - GENERIC_ENTITY = 0 - CL_NL_ENTITY = 0x301 - IF_ENTITY = 0x200 - ENTITY_TYPE_ID = 1 - CL_NL_IP = 0x303 - IF_MIB = 0x202 - IF_MIB_STATS_ID = 1 - IP_MIB_ADDRTABLE_ENTRY_ID = 0x102 - - def self.wsctl(tei_entity, tei_instance, - toi_class, toi_type, toi_id, - buffsize) - reqinfo = [ - ## TDIEntityID - tei_entity, tei_instance, - ## TDIObjectID - toi_class, toi_type, toi_id, - ## TCP_REQUEST_INFORMATION_EX - "" - ].pack('VVVVVa16') - reqsize = API.packdw(reqinfo.size) - buff = "\0" * buffsize - buffsize = API.packdw(buffsize) - result = WsControl.call( - IPPROTO_TCP, - WSCTL_TCP_QUERY_INFORMATION, - reqinfo, reqsize, - buff, buffsize) - if result != 0 - raise RuntimeError, "WsControl failed.(#{result})" - end - [ buff, API.unpackdw(buffsize) ] - end - private_class_method :wsctl - - def self.get_iflist - # Get TDI Entity List - entities, size = - wsctl(GENERIC_ENTITY, 0, - INFO_CLASS_GENERIC, - INFO_TYPE_PROVIDER, - ENTITY_LIST_ID, - MAX_TDI_ENTITIES * 8) # sizeof(TDIEntityID) - entities = entities[0, size]. - scan(/.{8}/). - collect { |e| e.unpack('VV') } - - # Get MIB Interface List - iflist = [] - ifcount = 0 - entities.each do |entity, instance| - if( (entity & IF_ENTITY)>0 ) - ifcount += 1 - etype, = wsctl(entity, instance, - INFO_CLASS_GENERIC, - INFO_TYPE_PROVIDER, - ENTITY_TYPE_ID, - 4) - if( (API.unpackdw(etype) & IF_MIB)==IF_MIB ) - ifentry, = wsctl(entity, instance, - INFO_CLASS_PROTOCOL, - INFO_TYPE_PROVIDER, - IF_MIB_STATS_ID, - 21 * 4 + 8 + 130) # sizeof(IFEntry) - iflist << [ - API.unpackdw(ifentry[0,4]), - ifentry[20, 6] - ] - end - end - end - - # Get IP Addresses - entities.each do |entity, instance| - if entity == CL_NL_ENTITY - etype, = wsctl(entity, instance, - INFO_CLASS_GENERIC, - INFO_TYPE_PROVIDER, - ENTITY_TYPE_ID, - 4) - if API.unpackdw(etype) == CL_NL_IP - ipentries, = wsctl(entity, instance, - INFO_CLASS_PROTOCOL, - INFO_TYPE_PROVIDER, - IP_MIB_ADDRTABLE_ENTRY_ID, - 24 * (ifcount+1)) # sizeof(IPAddrEntry) - ipentries.scan(/.{24}/) do |ipentry| - ipaddr, index = ipentry.unpack('VV') - if ifitem = iflist.assoc(index) - ifitem << ipaddr - end - end - end - end - end - iflist - end - end - __EOS__ -end -#==================================================================== - end -end diff --git a/Src/StdLib/ruby/1.9.1/win32/sspi.rb b/Src/StdLib/ruby/1.9.1/win32/sspi.rb deleted file mode 100644 index 4c54e7221..000000000 --- a/Src/StdLib/ruby/1.9.1/win32/sspi.rb +++ /dev/null @@ -1,330 +0,0 @@ -# -# = win32/sspi.rb -# -# Copyright (c) 2006-2007 Justin Bailey -# -# Written and maintained by Justin Bailey . -# -# This program is free software. You can re-distribute and/or -# modify this program under the same terms of ruby itself --- -# Ruby Distribution License or GNU General Public License. -# - -require 'Win32API' - -# Implements bindings to Win32 SSPI functions, focused on authentication to a proxy server over HTTP. -module Win32 - module SSPI - # Specifies how credential structure requested will be used. Only SECPKG_CRED_OUTBOUND is used - # here. - SECPKG_CRED_INBOUND = 0x00000001 - SECPKG_CRED_OUTBOUND = 0x00000002 - SECPKG_CRED_BOTH = 0x00000003 - - # Format of token. NETWORK format is used here. - SECURITY_NATIVE_DREP = 0x00000010 - SECURITY_NETWORK_DREP = 0x00000000 - - # InitializeSecurityContext Requirement flags - ISC_REQ_REPLAY_DETECT = 0x00000004 - ISC_REQ_SEQUENCE_DETECT = 0x00000008 - ISC_REQ_CONFIDENTIALITY = 0x00000010 - ISC_REQ_USE_SESSION_KEY = 0x00000020 - ISC_REQ_PROMPT_FOR_CREDS = 0x00000040 - ISC_REQ_CONNECTION = 0x00000800 - - # Win32 API Functions. Uses Win32API to bind methods to constants contained in class. - module API - # Can be called with AcquireCredentialsHandle.call() - AcquireCredentialsHandle = Win32API.new("secur32", "AcquireCredentialsHandle", 'ppLpppppp', 'L') - # Can be called with InitializeSecurityContext.call() - InitializeSecurityContext = Win32API.new("secur32", "InitializeSecurityContext", 'pppLLLpLpppp', 'L') - # Can be called with DeleteSecurityContext.call() - DeleteSecurityContext = Win32API.new("secur32", "DeleteSecurityContext", 'P', 'L') - # Can be called with FreeCredentialsHandle.call() - FreeCredentialsHandle = Win32API.new("secur32", "FreeCredentialsHandle", 'P', 'L') - end - - # SecHandle struct - class SecurityHandle - def upper - @struct.unpack("LL")[1] - end - - def lower - @struct.unpack("LL")[0] - end - - def to_p - @struct ||= "\0" * 8 - end - end - - # Some familiar aliases for the SecHandle structure - CredHandle = CtxtHandle = SecurityHandle - - # TimeStamp struct - class TimeStamp - attr_reader :struct - - def to_p - @struct ||= "\0" * 8 - end - end - - # Creates binary representaiton of a SecBufferDesc structure, - # including the SecBuffer contained inside. - class SecurityBuffer - - SECBUFFER_TOKEN = 2 # Security token - - TOKENBUFSIZE = 12288 - SECBUFFER_VERSION = 0 - - def initialize(buffer = nil) - @buffer = buffer || "\0" * TOKENBUFSIZE - @bufferSize = @buffer.length - @type = SECBUFFER_TOKEN - end - - def bufferSize - unpack - @bufferSize - end - - def bufferType - unpack - @type - end - - def token - unpack - @buffer - end - - def to_p - # Assumption is that when to_p is called we are going to get a packed structure. Therefore, - # set @unpacked back to nil so we know to unpack when accessors are next accessed. - @unpacked = nil - # Assignment of inner structure to variable is very important here. Without it, - # will not be able to unpack changes to the structure. Alternative, nested unpacks, - # does not work (i.e. @struct.unpack("LLP12")[2].unpack("LLP12") results in "no associated pointer") - @sec_buffer ||= [@bufferSize, @type, @buffer].pack("LLP") - @struct ||= [SECBUFFER_VERSION, 1, @sec_buffer].pack("LLP") - end - - private - - # Unpacks the SecurityBufferDesc structure into member variables. We - # only want to do this once per struct, so the struct is deleted - # after unpacking. - def unpack - if ! @unpacked && @sec_buffer && @struct - @bufferSize, @type = @sec_buffer.unpack("LL") - @buffer = @sec_buffer.unpack("LLP#{@bufferSize}")[2] - @struct = nil - @sec_buffer = nil - @unpacked = true - end - end - end - - # SEC_WINNT_AUTH_IDENTITY structure - class Identity - SEC_WINNT_AUTH_IDENTITY_ANSI = 0x1 - - attr_accessor :user, :domain, :password - - def initialize(user = nil, domain = nil, password = nil) - @user = user - @domain = domain - @password = password - @flags = SEC_WINNT_AUTH_IDENTITY_ANSI - end - - def to_p - [@user, @user ? @user.length : 0, - @domain, @domain ? @domain.length : 0, - @password, @password ? @password.length : 0, - @flags].pack("PLPLPLL") - end - end - - # Takes a return result from an SSPI function and interprets the value. - class SSPIResult - # Good results - SEC_E_OK = 0x00000000 - SEC_I_CONTINUE_NEEDED = 0x00090312 - - # These are generally returned by InitializeSecurityContext - SEC_E_INSUFFICIENT_MEMORY = 0x80090300 - SEC_E_INTERNAL_ERROR = 0x80090304 - SEC_E_INVALID_HANDLE = 0x80090301 - SEC_E_INVALID_TOKEN = 0x80090308 - SEC_E_LOGON_DENIED = 0x8009030C - SEC_E_NO_AUTHENTICATING_AUTHORITY = 0x80090311 - SEC_E_NO_CREDENTIALS = 0x8009030E - SEC_E_TARGET_UNKNOWN = 0x80090303 - SEC_E_UNSUPPORTED_FUNCTION = 0x80090302 - SEC_E_WRONG_PRINCIPAL = 0x80090322 - - # These are generally returned by AcquireCredentialsHandle - SEC_E_NOT_OWNER = 0x80090306 - SEC_E_SECPKG_NOT_FOUND = 0x80090305 - SEC_E_UNKNOWN_CREDENTIALS = 0x8009030D - - @@map = {} - constants.each { |v| @@map[self.const_get(v.to_s)] = v } - - attr_reader :value - - def initialize(value) - # convert to unsigned long - value = [value].pack("L").unpack("L").first - raise "#{value.to_s(16)} is not a recognized result" unless @@map.has_key? value - @value = value - end - - def to_s - @@map[@value].to_s - end - - def ok? - @value == SEC_I_CONTINUE_NEEDED || @value == SEC_E_OK - end - - def ==(other) - if other.is_a?(SSPIResult) - @value == other.value - elsif other.is_a?(Integer) - @value == @@map[other] - else - false - end - end - end - - # Handles "Negotiate" type authentication. Geared towards authenticating with a proxy server over HTTP - class NegotiateAuth - attr_accessor :credentials, :context, :contextAttributes, :user, :domain - - # Default request flags for SSPI functions - REQUEST_FLAGS = ISC_REQ_CONFIDENTIALITY | ISC_REQ_REPLAY_DETECT | ISC_REQ_CONNECTION - - # NTLM tokens start with this header always. Encoding alone adds "==" and newline, so remove those - B64_TOKEN_PREFIX = ["NTLMSSP"].pack("m").delete("=\n") - - # Given a connection and a request path, performs authentication as the current user and returns - # the response from a GET request. The connnection should be a Net::HTTP object, and it should - # have been constructed using the Net::HTTP.Proxy method, but anything that responds to "get" will work. - # If a user and domain are given, will authenticate as the given user. - # Returns the response received from the get method (usually Net::HTTPResponse) - def NegotiateAuth.proxy_auth_get(http, path, user = nil, domain = nil) - raise "http must respond to :get" unless http.respond_to?(:get) - nego_auth = self.new user, domain - - resp = http.get path, { "Proxy-Authorization" => "Negotiate " + nego_auth.get_initial_token } - if resp["Proxy-Authenticate"] - resp = http.get path, { "Proxy-Authorization" => "Negotiate " + nego_auth.complete_authentication(resp["Proxy-Authenticate"].split(" ").last.strip) } - end - - resp - end - - # Creates a new instance ready for authentication as the given user in the given domain. - # Defaults to current user and domain as defined by ENV["USERDOMAIN"] and ENV["USERNAME"] if - # no arguments are supplied. - def initialize(user = nil, domain = nil) - if user.nil? && domain.nil? && ENV["USERNAME"].nil? && ENV["USERDOMAIN"].nil? - raise "A username or domain must be supplied since they cannot be retrieved from the environment" - end - - @user = user || ENV["USERNAME"] - @domain = domain || ENV["USERDOMAIN"] - end - - # Gets the initial Negotiate token. Returns it as a base64 encoded string suitable for use in HTTP. Can - # be easily decoded, however. - def get_initial_token - raise "This object is no longer usable because its resources have been freed." if @cleaned_up - get_credentials - - outputBuffer = SecurityBuffer.new - @context = CtxtHandle.new - @contextAttributes = "\0" * 4 - - result = SSPIResult.new(API::InitializeSecurityContext.call(@credentials.to_p, nil, nil, - REQUEST_FLAGS,0, SECURITY_NETWORK_DREP, nil, 0, @context.to_p, outputBuffer.to_p, @contextAttributes, TimeStamp.new.to_p)) - - if result.ok? then - return encode_token(outputBuffer.token) - else - raise "Error: #{result.to_s}" - end - end - - # Takes a token and gets the next token in the Negotiate authentication chain. Token can be Base64 encoded or not. - # The token can include the "Negotiate" header and it will be stripped. - # Does not indicate if SEC_I_CONTINUE or SEC_E_OK was returned. - # Token returned is Base64 encoded w/ all new lines removed. - def complete_authentication(token) - raise "This object is no longer usable because its resources have been freed." if @cleaned_up - - # Nil token OK, just set it to empty string - token = "" if token.nil? - - if token.include? "Negotiate" - # If the Negotiate prefix is passed in, assume we are seeing "Negotiate " and get the token. - token = token.split(" ").last - end - - if token.include? B64_TOKEN_PREFIX - # indicates base64 encoded token - token = token.strip.unpack("m")[0] - end - - outputBuffer = SecurityBuffer.new - result = SSPIResult.new(API::InitializeSecurityContext.call(@credentials.to_p, @context.to_p, nil, - REQUEST_FLAGS, 0, SECURITY_NETWORK_DREP, SecurityBuffer.new(token).to_p, 0, - @context.to_p, - outputBuffer.to_p, @contextAttributes, TimeStamp.new.to_p)) - - if result.ok? then - return encode_token(outputBuffer.token) - else - raise "Error: #{result.to_s}" - end - ensure - # need to make sure we don't clean up if we've already cleaned up. - clean_up unless @cleaned_up - end - - private - - def clean_up - # free structures allocated - @cleaned_up = true - API::FreeCredentialsHandle.call(@credentials.to_p) - API::DeleteSecurityContext.call(@context.to_p) - @context = nil - @credentials = nil - @contextAttributes = nil - end - - # Gets credentials based on user, domain or both. If both are nil, an error occurs - def get_credentials - @credentials = CredHandle.new - ts = TimeStamp.new - @identity = Identity.new @user, @domain - result = SSPIResult.new(API::AcquireCredentialsHandle.call(nil, "Negotiate", SECPKG_CRED_OUTBOUND, nil, @identity.to_p, - nil, nil, @credentials.to_p, ts.to_p)) - raise "Error acquire credentials: #{result}" unless result.ok? - end - - def encode_token(t) - # encode64 will add newlines every 60 characters so we need to remove those. - [t].pack("m").delete("\n") - end - end - end -end \ No newline at end of file diff --git a/Src/StdLib/ruby/1.9.1/win32ole/property.rb b/Src/StdLib/ruby/1.9.1/win32ole/property.rb deleted file mode 100644 index 18b971ba3..000000000 --- a/Src/StdLib/ruby/1.9.1/win32ole/property.rb +++ /dev/null @@ -1,16 +0,0 @@ -# OLEProperty -# helper class of Property with arguments. -class OLEProperty - def initialize(obj, dispid, gettypes, settypes) - @obj = obj - @dispid = dispid - @gettypes = gettypes - @settypes = settypes - end - def [](*args) - @obj._getproperty(@dispid, args, @gettypes) - end - def []=(*args) - @obj._setproperty(@dispid, args, @settypes) - end -end diff --git a/Tests/Libraries/ParseTreeTests/pt_testcase.rb b/Tests/Libraries/ParseTreeTests/pt_testcase.rb deleted file mode 100644 index 7c5c8109e..000000000 --- a/Tests/Libraries/ParseTreeTests/pt_testcase.rb +++ /dev/null @@ -1,4417 +0,0 @@ -$TESTING = true - -require 'minitest/unit' -require 'sexp_processor' # for deep_clone - -# key: -# wwtt = what were they thinking? - -# TODO: 1.8.7 support {|&b|} syntax - -class Examples - attr_reader :reader - attr_writer :writer - - def a_method(x); x+1; end - alias an_alias a_method - - define_method(:bmethod_noargs) do - x + 1 - end - - define_method(:unsplatted) do |x| - x + 1 - end - - define_method :splatted do |*args| - y = args.first - y + 42 - end - - define_method :dmethod_added, instance_method(:a_method) if - RUBY_VERSION < "1.9" -end - -class ParseTreeTestCase < MiniTest::Unit::TestCase - attr_accessor :processor # to be defined by subclass - - def setup - super - @processor = nil - end - - def after_process_hook klass, node, data, input_name, output_name - end - - def before_process_hook klass, node, data, input_name, output_name - end - - def self.add_test name, data, klass = self.name[4..-1] - name = name.to_s - klass = klass.to_s - - if testcases.has_key? name then - if testcases[name].has_key? klass then - warn "testcase #{klass}##{name} already has data" - else - testcases[name][klass] = data - end - else - warn "testcase #{name} does not exist" - end - end - - def self.add_tests name, hash - name = name.to_s - - hash.each do |klass, data| - warn "testcase #{klass}##{name} already has data" if - testcases[name].has_key? klass - testcases[name][klass] = data - end - end - - def self.clone_same - @@testcases.each do |node, data| - data.each do |key, val| - if val == :same then - prev_key = self.previous(key) - data[key] = data[prev_key].deep_clone - end - end - end - end - - def self.copy_test_case nonverbose, klass - verbose = nonverbose + "_mri_verbose_flag" - testcases[verbose][klass] = testcases[nonverbose][klass] - end - - def self.generate_test klass, node, data, input_name, output_name - klass.send(:define_method, "test_#{node}".to_sym) do - flunk "Processor is nil" if processor.nil? - - assert data.has_key?(input_name), "Unknown input data" - assert data.has_key?(output_name), "Missing test data" - - $missing[node] << output_name unless data.has_key? output_name - - input = data[input_name].deep_clone - expected = data[output_name].deep_clone - - case expected - when :unsupported then - assert_raises(UnsupportedNodeError) do - processor.process(input) - end - else - extra_expected = [] - extra_input = [] - - _, expected, extra_expected = *expected if - Array === expected and expected.first == :defx - _, input, extra_input = *input if - Array === input and input.first == :defx - - # OMG... I can't believe I have to do this this way. these - # hooks are here instead of refactoring this define_method - # body into an assertion. It'll allow subclasses to hook in - # and add behavior before or after the processor does it's - # thing. If you go the body refactor route, some of the - # RawParseTree test casese fail for completely bogus reasons. - - before_process_hook klass, node, data, input_name, output_name - refute_nil data[input_name], "testcase does not exist?" - @result = processor.process input - assert_equal(expected, @result, - "failed on input: #{data[input_name].inspect}") - after_process_hook klass, node, data, input_name, output_name - - extra_input.each do |extra| - processor.process(extra) - end - extra = processor.extra_methods rescue [] - assert_equal extra_expected, extra - end - end - end - - def self.generate_tests klass - install_missing_reporter - clone_same - - output_name = klass.name.to_s.sub(/^Test/, '') - - input_name = self.previous(output_name) - - @@testcases.each do |node, data| - next if [:skip, :unsupported].include? data[input_name] - next if data[output_name] == :skip - - generate_test klass, node, data, input_name, output_name - end - end - - def self.inherited klass - super - - generate_tests klass unless klass.name =~ /TestCase/ - end - - def self.install_missing_reporter - unless defined? $missing then - $missing = Hash.new { |h,k| h[k] = [] } - at_exit { - at_exit { - warn "" - $missing.sort.each do |name, klasses| - warn "add_tests(#{name.inspect}," - klasses.map! { |klass| " #{klass.inspect} => :same" } - warn klasses.join("\n") + ")" - end - warn "" - } - } - end - end - - def self.previous(key, extra=0) # FIX: remove R2C code - idx = @@testcase_order.index(key) - - raise "Unknown class #{key} in @@testcase_order" if idx.nil? - - case key - when "RubyToRubyC" then - idx -= 1 - end - @@testcase_order[idx - 1 - extra] - end - - def self.testcase_order; @@testcase_order; end - def self.testcases; @@testcases; end - - def self.unsupported_tests *tests - tests.flatten.each do |name| - add_test name, :unsupported - end - end - - ############################################################ - # Shared TestCases: - - @@testcase_order = %w(Ruby RawParseTree ParseTree) - - @@testcases = Hash.new { |h,k| h[k] = {} } - - add_tests("alias", - "Ruby" => "class X\n alias :y :x\nend", - "RawParseTree" => [:class, :X, nil, - [:scope, [:alias, [:lit, :y], [:lit, :x]]]], - "ParseTree" => s(:class, :X, nil, - s(:scope, s(:alias, s(:lit, :y), s(:lit, :x))))) - - add_tests("alias_ugh", - "Ruby" => "class X\n alias y x\nend", - "RawParseTree" => [:class, :X, nil, - [:scope, [:alias, [:lit, :y], [:lit, :x]]]], - "ParseTree" => s(:class, :X, nil, - s(:scope, s(:alias, s(:lit, :y), s(:lit, :x)))), - "Ruby2Ruby" => "class X\n alias :y :x\nend") - - add_tests("and", - "Ruby" => "(a and b)", - "RawParseTree" => [:and, [:vcall, :a], [:vcall, :b]], - "ParseTree" => s(:and, - s(:call, nil, :a, s(:arglist)), - s(:call, nil, :b, s(:arglist)))) - - add_tests("argscat_inside", - "Ruby" => "a = [b, *c]", - "RawParseTree" => [:lasgn, :a, - [:argscat, - [:array, [:vcall, :b]], [:vcall, :c]]], - "ParseTree" => s(:lasgn, :a, - s(:array, - s(:call, nil, :b, s(:arglist)), - s(:splat, s(:call, nil, :c, s(:arglist)))))) - - add_tests("argscat_svalue", - "Ruby" => "a = b, c, *d", - "RawParseTree" => [:lasgn, :a, - [:svalue, - [:argscat, - [:array, [:vcall, :b], [:vcall, :c]], - [:vcall, :d]]]], - "ParseTree" => s(:lasgn, :a, - s(:svalue, - s(:array, - s(:call, nil, :b, s(:arglist)), - s(:call, nil, :c, s(:arglist)), - s(:splat, - s(:call, nil, :d, s(:arglist))))))) - - add_tests("argspush", - "Ruby" => "a[*b] = c", - "RawParseTree" => [:attrasgn, - [:vcall, :a], - :[]=, - [:argspush, - [:splat, - [:vcall, :b]], - [:vcall, :c]]], - "ParseTree" => s(:attrasgn, - s(:call, nil, :a, s(:arglist)), - :[]=, - s(:arglist, - s(:splat, - s(:call, nil, :b, s(:arglist))), - s(:call, nil, :c, s(:arglist))))) - - add_tests("array", - "Ruby" => "[1, :b, \"c\"]", - "RawParseTree" => [:array, [:lit, 1], [:lit, :b], [:str, "c"]], - "ParseTree" => s(:array, s(:lit, 1), s(:lit, :b), s(:str, "c"))) - - add_tests("array_pct_W", - "Ruby" => "%W[a b c]", - "RawParseTree" => [:array, [:str, "a"], [:str, "b"], [:str, "c"]], - "ParseTree" => s(:array, - s(:str, "a"), s(:str, "b"), s(:str, "c")), - "Ruby2Ruby" => "[\"a\", \"b\", \"c\"]") - - add_tests("array_pct_W_dstr", - "Ruby" => "%W[a #\{@b} c]", - "RawParseTree" => [:array, - [:str, "a"], - [:dstr, "", [:evstr, [:ivar, :@b]]], - [:str, "c"]], - "ParseTree" => s(:array, - s(:str, "a"), - s(:dstr, "", s(:evstr, s(:ivar, :@b))), - s(:str, "c")), - "Ruby2Ruby" => "[\"a\", \"#\{@b}\", \"c\"]") - - add_tests("array_pct_w", - "Ruby" => "%w[a b c]", - "RawParseTree" => [:array, [:str, "a"], [:str, "b"], [:str, "c"]], - "ParseTree" => s(:array, - s(:str, "a"), s(:str, "b"), s(:str, "c")), - "Ruby2Ruby" => "[\"a\", \"b\", \"c\"]") - - add_tests("array_pct_w_dstr", - "Ruby" => "%w[a #\{@b} c]", - "RawParseTree" => [:array, - [:str, "a"], - [:str, "#\{@b}"], - [:str, "c"]], - "ParseTree" => s(:array, - s(:str, "a"), - s(:str, "#\{@b}"), - s(:str, "c")), - "Ruby2Ruby" => "[\"a\", \"\\\#{@b}\", \"c\"]") # TODO: huh? - - add_tests("attrasgn", - "Ruby" => "y = 0\n42.method = y\n", - "RawParseTree" => [:block, - [:lasgn, :y, [:lit, 0]], - [:attrasgn, [:lit, 42], :method=, - [:array, [:lvar, :y]]]], - "ParseTree" => s(:block, - s(:lasgn, :y, s(:lit, 0)), - s(:attrasgn, s(:lit, 42), :method=, - s(:arglist, s(:lvar, :y))))) - - add_tests("attrasgn_index_equals", - "Ruby" => "a[42] = 24", - "RawParseTree" => [:attrasgn, [:vcall, :a], :[]=, - [:array, [:lit, 42], [:lit, 24]]], - "ParseTree" => s(:attrasgn, - s(:call, nil, :a, s(:arglist)), - :[]=, - s(:arglist, s(:lit, 42), s(:lit, 24)))) - - add_tests("attrasgn_index_equals_space", - "Ruby" => "a = []; a [42] = 24", - "RawParseTree" => [:block, - [:lasgn, :a, [:zarray]], - [:attrasgn, [:lvar, :a], :[]=, - [:array, [:lit, 42], [:lit, 24]]]], - "ParseTree" => s(:block, - s(:lasgn, :a, s(:array)), - s(:attrasgn, s(:lvar, :a), :[]=, - s(:arglist, s(:lit, 42), s(:lit, 24)))), - "Ruby2Ruby" => "a = []\na[42] = 24\n") - - add_tests("attrset", - "Ruby" => [Examples, :writer=], - "RawParseTree" => [:defn, :writer=, [:attrset, :@writer]], - "ParseTree" => s(:defn, :writer=, - s(:args, :arg), - s(:attrset, :@writer)), - "Ruby2Ruby" => "attr_writer :writer") - - add_tests("back_ref", - "Ruby" => "[$&, $`, $', $+]", - "RawParseTree" => [:array, - [:back_ref, :&], - [:back_ref, :"`"], - [:back_ref, :"'"], - [:back_ref, :+]], - "ParseTree" => s(:array, - s(:back_ref, :&), - s(:back_ref, :"`"), - s(:back_ref, :"'"), - s(:back_ref, :+))) - - add_tests("begin", - "Ruby" => "begin\n (1 + 1)\nend", - "RawParseTree" => [:call, [:lit, 1], :+, [:array, [:lit, 1]]], - "ParseTree" => s(:call, s(:lit, 1), :+, - s(:arglist, s(:lit, 1))), - "Ruby2Ruby" => "(1 + 1)") - - add_tests("begin_def", - "Ruby" => "def m\n begin\n\n end\nend", - "RawParseTree" => [:defn, :m, [:scope, [:block, [:args], [:nil]]]], - "ParseTree" => s(:defn, :m, s(:args), - s(:scope, s(:block, s(:nil)))), - "Ruby2Ruby" => "def m\n # do nothing\nend") - - add_tests("begin_rescue_ensure", - "Ruby" => "begin\n a\nrescue\n # do nothing\nensure\n # do nothing\nend", - "RawParseTree" => [:ensure, - [:rescue, - [:vcall, :a], - [:resbody, nil]], - [:nil]], - "ParseTree" => s(:ensure, - s(:rescue, - s(:call, nil, :a, s(:arglist)), - s(:resbody, s(:array), nil)), - s(:nil))) - - add_tests("begin_rescue_ensure_all_empty", - "Ruby" => "begin\n # do nothing\nrescue\n # do nothing\nensure\n # do nothing\nend", - "RawParseTree" => [:ensure, - [:rescue, - [:resbody, nil]], - [:nil]], - "ParseTree" => s(:ensure, - s(:rescue, - s(:resbody, s(:array), nil)), - s(:nil))) - - add_tests("begin_rescue_twice", - "Ruby" => "begin\n a\nrescue => mes\n # do nothing\nend\nbegin\n b\nrescue => mes\n # do nothing\nend\n", - "RawParseTree" => [:block, - [:rescue, - [:vcall, :a], - [:resbody, nil, - [:lasgn, :mes, [:gvar, :$!]]]], - [:rescue, - [:vcall, :b], - [:resbody, nil, - [:lasgn, :mes, [:gvar, :$!]]]]], - "ParseTree" => s(:block, - s(:rescue, - s(:call, nil, :a, s(:arglist)), - s(:resbody, - s(:array, s(:lasgn, :mes, s(:gvar, :$!))), - nil)), - s(:rescue, - s(:call, nil, :b, s(:arglist)), - s(:resbody, - s(:array, - s(:lasgn, :mes, s(:gvar, :$!))), - nil)))) - - add_tests("begin_rescue_twice_mri_verbose_flag", - "RawParseTree" => [:block, - [:rescue, # no begin - [:vcall, :a], - [:resbody, nil, - [:lasgn, :mes, [:gvar, :$!]]]], - [:rescue, - [:vcall, :b], - [:resbody, nil, - [:lasgn, :mes, [:gvar, :$!]]]]]) - - copy_test_case "begin_rescue_twice", "Ruby" - copy_test_case "begin_rescue_twice", "ParseTree" - - add_tests("block_attrasgn", - "Ruby" => "def self.setup(ctx)\n bind = allocate\n bind.context = ctx\n return bind\nend", - "RawParseTree" => [:defs, [:self], :setup, - [:scope, - [:block, - [:args, :ctx], - [:lasgn, :bind, [:vcall, :allocate]], - [:attrasgn, [:lvar, :bind], :context=, - [:array, [:lvar, :ctx]]], - [:return, [:lvar, :bind]]]]], - "ParseTree" => s(:defs, s(:self), :setup, - s(:args, :ctx), - s(:scope, - s(:block, - s(:lasgn, :bind, - s(:call, nil, :allocate, s(:arglist))), - s(:attrasgn, s(:lvar, :bind), :context=, - s(:arglist, s(:lvar, :ctx))), - s(:return, s(:lvar, :bind)))))) - - - add_tests("block_lasgn", - "Ruby" => "x = (y = 1\n(y + 2))", - "RawParseTree" => [:lasgn, :x, - [:block, - [:lasgn, :y, [:lit, 1]], - [:call, [:lvar, :y], :+, [:array, [:lit, 2]]]]], - "ParseTree" => s(:lasgn, :x, - s(:block, - s(:lasgn, :y, s(:lit, 1)), - s(:call, s(:lvar, :y), :+, - s(:arglist, s(:lit, 2)))))) - - add_tests("block_mystery_block", - "Ruby" => "a(b) do\n if b then\n true\n else\n c = false\n d { |x| c = true }\n c\n end\nend", - "RawParseTree" => [:iter, - [:fcall, :a, [:array, [:vcall, :b]]], - nil, - [:if, - [:vcall, :b], - [:true], - [:block, - [:dasgn_curr, :c, [:false]], - [:iter, - [:fcall, :d], - [:dasgn_curr, :x], - [:dasgn, :c, [:true]]], - [:dvar, :c]]]], - "ParseTree" => s(:iter, - s(:call, nil, :a, - s(:arglist, s(:call, nil, :b, s(:arglist)))), - nil, - s(:if, - s(:call, nil, :b, s(:arglist)), - s(:true), - s(:block, - s(:lasgn, :c, s(:false)), - s(:iter, - s(:call, nil, :d, s(:arglist)), - s(:lasgn, :x), - s(:lasgn, :c, s(:true))), - s(:lvar, :c))))) - - add_tests("block_pass_args_and_splat", - "Ruby" => "def blah(*args, &block)\n other(42, *args, &block)\nend", - "RawParseTree" => [:defn, :blah, - [:scope, - [:block, - [:args, :"*args"], - [:block_arg, :block], - [:block_pass, - [:lvar, :block], - [:fcall, :other, - [:argscat, - [:array, [:lit, 42]], [:lvar, :args]]]]]]], - "ParseTree" => s(:defn, :blah, - s(:args, :"*args", :"&block"), - s(:scope, - s(:block, - s(:call, nil, :other, - s(:arglist, - s(:lit, 42), - s(:splat, s(:lvar, :args)), - s(:block_pass, s(:lvar, :block)))))))) - - add_tests("block_pass_call_0", - "Ruby" => "a.b(&c)", - "RawParseTree" => [:block_pass, - [:vcall, :c], [:call, [:vcall, :a], :b]], - "ParseTree" => s(:call, - s(:call, nil, :a, s(:arglist)), - :b, - s(:arglist, - s(:block_pass, - s(:call, nil, :c, s(:arglist)))))) - - add_tests("block_pass_call_1", - "Ruby" => "a.b(4, &c)", - "RawParseTree" => [:block_pass, - [:vcall, :c], - [:call, [:vcall, :a], :b, [:array, [:lit, 4]]]], - "ParseTree" => s(:call, - s(:call, nil, :a, s(:arglist)), - :b, - s(:arglist, - s(:lit, 4), - s(:block_pass, - s(:call, nil, :c, s(:arglist)))))) - - add_tests("block_pass_call_n", - "Ruby" => "a.b(1, 2, 3, &c)", - "RawParseTree" => [:block_pass, - [:vcall, :c], - [:call, [:vcall, :a], :b, - [:array, [:lit, 1], [:lit, 2], [:lit, 3]]]], - "ParseTree" => s(:call, - s(:call, nil, :a, s(:arglist)), - :b, - s(:arglist, - s(:lit, 1), s(:lit, 2), s(:lit, 3), - s(:block_pass, - s(:call, nil, :c, s(:arglist)))))) - - add_tests("block_pass_fcall_0", - "Ruby" => "a(&b)", - "RawParseTree" => [:block_pass, [:vcall, :b], [:fcall, :a]], - "ParseTree" => s(:call, nil, :a, - s(:arglist, - s(:block_pass, - s(:call, nil, :b, s(:arglist)))))) - - add_tests("block_pass_fcall_1", - "Ruby" => "a(4, &b)", - "RawParseTree" => [:block_pass, - [:vcall, :b], - [:fcall, :a, [:array, [:lit, 4]]]], - "ParseTree" => s(:call, nil, :a, - s(:arglist, - s(:lit, 4), - s(:block_pass, - s(:call, nil, :b, s(:arglist)))))) - - add_tests("block_pass_fcall_n", - "Ruby" => "a(1, 2, 3, &b)", - "RawParseTree" => [:block_pass, - [:vcall, :b], - [:fcall, :a, - [:array, [:lit, 1], [:lit, 2], [:lit, 3]]]], - "ParseTree" => s(:call, nil, :a, - s(:arglist, - s(:lit, 1), s(:lit, 2), s(:lit, 3), - s(:block_pass, - s(:call, nil, :b, s(:arglist)))))) - - add_tests("block_pass_omgwtf", - "Ruby" => "define_attr_method(:x, :sequence_name, &Proc.new { |*args| nil })", - "RawParseTree" => [:block_pass, - [:iter, - [:call, [:const, :Proc], :new], - [:masgn, nil, [:dasgn_curr, :args], nil], - [:nil]], - [:fcall, :define_attr_method, - [:array, [:lit, :x], [:lit, :sequence_name]]]], - "ParseTree" => s(:call, nil, :define_attr_method, - s(:arglist, - s(:lit, :x), - s(:lit, :sequence_name), - s(:block_pass, - s(:iter, - s(:call, s(:const, :Proc), :new, - s(:arglist)), - s(:masgn, - s(:array, s(:splat, s(:lasgn, :args)))), - s(:nil)))))) - - add_tests("block_pass_splat", - "Ruby" => "def blah(*args, &block)\n other(*args, &block)\nend", - "RawParseTree" => [:defn, :blah, - [:scope, - [:block, - [:args, :"*args"], - [:block_arg, :block], - [:block_pass, - [:lvar, :block], - [:fcall, :other, - [:splat, [:lvar, :args]]]]]]], - "ParseTree" => s(:defn, :blah, - s(:args, :"*args", :"&block"), - s(:scope, - s(:block, - s(:call, nil, :other, - s(:arglist, - s(:splat, s(:lvar, :args)), - s(:block_pass, s(:lvar, :block)))))))) - - add_tests("block_pass_thingy", - "Ruby" => "r.read_body(dest, &block)", - "RawParseTree" => [:block_pass, - [:vcall, :block], - [:call, [:vcall, :r], :read_body, - [:array, [:vcall, :dest]]]], - "ParseTree" => s(:call, - s(:call, nil, :r, s(:arglist)), - :read_body, - s(:arglist, - s(:call, nil, :dest, s(:arglist)), - s(:block_pass, - s(:call, nil, :block, s(:arglist)))))) - - add_tests("block_stmt_after", - "Ruby" => "def f\n begin\n b\n rescue\n c\n end\n\n d\nend", - "RawParseTree" => [:defn, :f, - [:scope, - [:block, - [:args], - [:rescue, - [:vcall, :b], - [:resbody, nil, [:vcall, :c]]], - [:vcall, :d]]]], - "ParseTree" => s(:defn, :f, - s(:args), - s(:scope, - s(:block, - s(:rescue, - s(:call, nil, :b, s(:arglist)), - s(:resbody, - s(:array), - s(:call, nil, :c, s(:arglist)))), - s(:call, nil, :d, s(:arglist))))), - "Ruby2Ruby" => "def f\n b rescue c\n d\nend") - - add_tests("block_stmt_after_mri_verbose_flag", - "RawParseTree" => [:defn, :f, - [:scope, - [:block, - [:args], - [:rescue, # no begin - [:vcall, :b], - [:resbody, nil, [:vcall, :c]]], - [:vcall, :d]]]]) - - copy_test_case "block_stmt_after", "Ruby" - copy_test_case "block_stmt_after", "ParseTree" - copy_test_case "block_stmt_after", "Ruby2Ruby" - - add_tests("block_stmt_before", - "Ruby" => "def f\n a\n begin\n b\n rescue\n c\n end\nend", - "RawParseTree" => [:defn, :f, - [:scope, - [:block, - [:args], - [:vcall, :a], - [:rescue, [:vcall, :b], - [:resbody, nil, [:vcall, :c]]]]]], - "ParseTree" => s(:defn, :f, - s(:args), - s(:scope, - s(:block, - s(:call, nil, :a, s(:arglist)), - s(:rescue, s(:call, nil, :b, s(:arglist)), - s(:resbody, - s(:array), - s(:call, nil, :c, s(:arglist))))))), - "Ruby2Ruby" => "def f\n a\n b rescue c\nend") - - # oddly... this one doesn't HAVE any differences when verbose... new? - copy_test_case "block_stmt_before", "Ruby" - copy_test_case "block_stmt_before", "ParseTree" - copy_test_case "block_stmt_before", "RawParseTree" - copy_test_case "block_stmt_before", "Ruby2Ruby" - - add_tests("block_stmt_both", - "Ruby" => "def f\n a\n begin\n b\n rescue\n c\n end\n d\nend", - "RawParseTree" => [:defn, :f, - [:scope, - [:block, - [:args], - [:vcall, :a], - [:rescue, - [:vcall, :b], - [:resbody, - nil, - [:vcall, :c]]], - [:vcall, :d]]]], - "ParseTree" => s(:defn, :f, s(:args), - s(:scope, - s(:block, - s(:call, nil, :a, s(:arglist)), - s(:rescue, - s(:call, nil, :b, s(:arglist)), - s(:resbody, - s(:array), - s(:call, nil, :c, s(:arglist)))), - s(:call, nil, :d, s(:arglist))))), - "Ruby2Ruby" => "def f\n a\n b rescue c\n d\nend") - - add_tests("block_stmt_both_mri_verbose_flag", - "RawParseTree" => [:defn, :f, - [:scope, - [:block, - [:args], - [:vcall, :a], - [:rescue, # no begin - [:vcall, :b], - [:resbody, - nil, - [:vcall, :c]]], - [:vcall, :d]]]]) - - copy_test_case "block_stmt_both", "Ruby" - copy_test_case "block_stmt_both", "ParseTree" - copy_test_case "block_stmt_both", "Ruby2Ruby" - - add_tests("bmethod", - "Ruby" => [Examples, :unsplatted], - "RawParseTree" => [:defn, :unsplatted, - [:bmethod, - [:dasgn_curr, :x], - [:call, [:dvar, :x], :+, [:array, [:lit, 1]]]]], - "ParseTree" => s(:defn, :unsplatted, - s(:args, :x), - s(:scope, - s(:block, - s(:call, - s(:lvar, :x), - :+, - s(:arglist, s(:lit, 1)))))), - "Ruby2Ruby" => "def unsplatted(x)\n (x + 1)\nend") - - add_tests("bmethod_noargs", - "Ruby" => [Examples, :bmethod_noargs], - "RawParseTree" => [:defn, :bmethod_noargs, - [:bmethod, - nil, - [:call, - [:vcall, :x], :"+", [:array, [:lit, 1]]]]], - "ParseTree" => s(:defn, :bmethod_noargs, - s(:args), - s(:scope, - s(:block, - s(:call, - s(:call, nil, :x, s(:arglist)), - :"+", - s(:arglist, s(:lit, 1)))))), - "Ruby2Ruby" => "def bmethod_noargs\n (x + 1)\nend") - - add_tests("bmethod_splat", - "Ruby" => [Examples, :splatted], - "RawParseTree" => [:defn, :splatted, - [:bmethod, - [:masgn, nil, [:dasgn_curr, :args], nil], - [:block, - [:dasgn_curr, :y, - [:call, [:dvar, :args], :first]], - [:call, [:dvar, :y], :+, - [:array, [:lit, 42]]]]]], - "ParseTree" => s(:defn, :splatted, - s(:args, :"*args"), - s(:scope, - s(:block, - s(:lasgn, :y, - s(:call, s(:lvar, :args), :first, - s(:arglist))), - s(:call, s(:lvar, :y), :+, - s(:arglist, s(:lit, 42)))))), - "Ruby2Ruby" => "def splatted(*args)\n y = args.first\n (y + 42)\nend") - - add_tests("break", - "Ruby" => "loop { break if true }", - "RawParseTree" => [:iter, - [:fcall, :loop], nil, - [:if, [:true], [:break], nil]], - "ParseTree" => s(:iter, - s(:call, nil, :loop, s(:arglist)), nil, - s(:if, s(:true), s(:break), nil))) - - add_tests("break_arg", - "Ruby" => "loop { break 42 if true }", - "RawParseTree" => [:iter, - [:fcall, :loop], nil, - [:if, [:true], [:break, [:lit, 42]], nil]], - "ParseTree" => s(:iter, - s(:call, nil, :loop, s(:arglist)), nil, - s(:if, s(:true), s(:break, s(:lit, 42)), nil))) - - add_tests("call", - "Ruby" => "self.method", - "RawParseTree" => [:call, [:self], :method], - "ParseTree" => s(:call, s(:self), :method, s(:arglist))) - - add_tests("call_arglist", - "Ruby" => "o.puts(42)", - "RawParseTree" => [:call, [:vcall, :o], :puts, - [:array, [:lit, 42]]], - "ParseTree" => s(:call, s(:call, nil, :o, s(:arglist)), :puts, - s(:arglist, s(:lit, 42)))) - - add_tests("call_arglist_hash", - "Ruby" => "o.m(:a => 1, :b => 2)", - "RawParseTree" => [:call, - [:vcall, :o], :m, - [:array, - [:hash, - [:lit, :a], [:lit, 1], - [:lit, :b], [:lit, 2]]]], - "ParseTree" => s(:call, - s(:call, nil, :o, s(:arglist)), :m, - s(:arglist, - s(:hash, - s(:lit, :a), s(:lit, 1), - s(:lit, :b), s(:lit, 2))))) - - add_tests("call_arglist_norm_hash", - "Ruby" => "o.m(42, :a => 1, :b => 2)", - "RawParseTree" => [:call, - [:vcall, :o], :m, - [:array, - [:lit, 42], - [:hash, - [:lit, :a], [:lit, 1], - [:lit, :b], [:lit, 2]]]], - "ParseTree" => s(:call, - s(:call, nil, :o, s(:arglist)), :m, - s(:arglist, - s(:lit, 42), - s(:hash, - s(:lit, :a), s(:lit, 1), - s(:lit, :b), s(:lit, 2))))) - - add_tests("call_arglist_norm_hash_splat", - "Ruby" => "o.m(42, :a => 1, :b => 2, *c)", - "RawParseTree" => [:call, - [:vcall, :o], :m, - [:argscat, - [:array, - [:lit, 42], - [:hash, - [:lit, :a], [:lit, 1], - [:lit, :b], [:lit, 2]]], - [:vcall, :c]]], - "ParseTree" => s(:call, - s(:call, nil, :o, s(:arglist)), :m, - s(:arglist, - s(:lit, 42), - s(:hash, - s(:lit, :a), s(:lit, 1), - s(:lit, :b), s(:lit, 2)), - s(:splat, s(:call, nil, :c, s(:arglist)))))) - - add_tests("call_arglist_space", - "Ruby" => "a (1,2,3)", - "RawParseTree" => [:fcall, :a, - [:array, [:lit, 1], [:lit, 2], [:lit, 3]]], - "ParseTree" => s(:call, nil, :a, - s(:arglist, - s(:lit, 1), s(:lit, 2), s(:lit, 3))), - "Ruby2Ruby" => "a(1, 2, 3)") - - add_tests("call_command", - "Ruby" => "1.b(c)", - "RawParseTree" => [:call, [:lit, 1], :b, [:array, [:vcall, :c]]], - "ParseTree" => s(:call, - s(:lit, 1), - :b, - s(:arglist, s(:call, nil, :c, s(:arglist))))) - - add_tests("call_expr", - "Ruby" => "(v = (1 + 1)).zero?", - "RawParseTree" => [:call, - [:lasgn, :v, - [:call, [:lit, 1], :+, [:array, [:lit, 1]]]], - :zero?], - "ParseTree" => s(:call, - s(:lasgn, :v, - s(:call, s(:lit, 1), :+, - s(:arglist, s(:lit, 1)))), - :zero?, s(:arglist))) - - add_tests("call_index", - "Ruby" => "a = []\na[42]\n", - "RawParseTree" => [:block, - [:lasgn, :a, [:zarray]], - [:call, [:lvar, :a], :[], [:array, [:lit, 42]]]], - "ParseTree" => s(:block, - s(:lasgn, :a, s(:array)), - s(:call, s(:lvar, :a), :[], - s(:arglist, s(:lit, 42))))) - - add_tests("call_index_no_args", - "Ruby" => "a[]", - "RawParseTree" => [:call, [:vcall, :a], :[]], - "ParseTree" => s(:call, s(:call, nil, :a, s(:arglist)), - :[], s(:arglist))) - - add_tests("call_index_space", - "Ruby" => "a = []\na [42]\n", - "RawParseTree" => [:block, - [:lasgn, :a, [:zarray]], - [:call, [:lvar, :a], :[], [:array, [:lit, 42]]]], - "ParseTree" => s(:block, - s(:lasgn, :a, s(:array)), - s(:call, s(:lvar, :a), :[], - s(:arglist, s(:lit, 42)))), - "Ruby2Ruby" => "a = []\na[42]\n") - - add_tests("call_unary_neg", - "Ruby" => "-2**31", - "RawParseTree" => [:call, - [:call, [:lit, 2], :**, [:array, [:lit, 31]]], - :-@], - "ParseTree" => s(:call, - s(:call, - s(:lit, 2), - :**, - s(:arglist, s(:lit, 31))), - :-@, s(:arglist)), - "Ruby2Ruby" => "-(2 ** 31)") - - add_tests("case", - "Ruby" => "var = 2\nresult = \"\"\ncase var\nwhen 1 then\n puts(\"something\")\n result = \"red\"\nwhen 2, 3 then\n result = \"yellow\"\nwhen 4 then\n # do nothing\nelse\n result = \"green\"\nend\ncase result\nwhen \"red\" then\n var = 1\nwhen \"yellow\" then\n var = 2\nwhen \"green\" then\n var = 3\nelse\n # do nothing\nend\n", - "RawParseTree" => [:block, - [:lasgn, :var, [:lit, 2]], - [:lasgn, :result, [:str, ""]], - [:case, - [:lvar, :var], - [:when, - [:array, [:lit, 1]], - [:block, - [:fcall, :puts, - [:array, [:str, "something"]]], - [:lasgn, :result, [:str, "red"]]]], - [:when, - [:array, [:lit, 2], [:lit, 3]], - [:lasgn, :result, [:str, "yellow"]]], - [:when, [:array, [:lit, 4]], nil], - [:lasgn, :result, [:str, "green"]]], - [:case, - [:lvar, :result], - [:when, [:array, [:str, "red"]], - [:lasgn, :var, [:lit, 1]]], - [:when, [:array, [:str, "yellow"]], - [:lasgn, :var, [:lit, 2]]], - [:when, [:array, [:str, "green"]], - [:lasgn, :var, [:lit, 3]]], - nil]], - "ParseTree" => s(:block, - s(:lasgn, :var, s(:lit, 2)), - s(:lasgn, :result, s(:str, "")), - s(:case, - s(:lvar, :var), - s(:when, - s(:array, s(:lit, 1)), - s(:block, - s(:call, nil, :puts, - s(:arglist, s(:str, "something"))), - s(:lasgn, :result, s(:str, "red")))), - s(:when, - s(:array, s(:lit, 2), s(:lit, 3)), - s(:lasgn, :result, s(:str, "yellow"))), - s(:when, s(:array, s(:lit, 4)), nil), - s(:lasgn, :result, s(:str, "green"))), - s(:case, - s(:lvar, :result), - s(:when, s(:array, s(:str, "red")), - s(:lasgn, :var, s(:lit, 1))), - s(:when, s(:array, s(:str, "yellow")), - s(:lasgn, :var, s(:lit, 2))), - s(:when, s(:array, s(:str, "green")), - s(:lasgn, :var, s(:lit, 3))), - nil))) - - add_tests("case_nested", - "Ruby" => "var1 = 1\nvar2 = 2\nresult = nil\ncase var1\nwhen 1 then\n case var2\n when 1 then\n result = 1\n when 2 then\n result = 2\n else\n result = 3\n end\nwhen 2 then\n case var2\n when 1 then\n result = 4\n when 2 then\n result = 5\n else\n result = 6\n end\nelse\n result = 7\nend\n", - "RawParseTree" => [:block, - [:lasgn, :var1, [:lit, 1]], - [:lasgn, :var2, [:lit, 2]], - [:lasgn, :result, [:nil]], - [:case, - [:lvar, :var1], - [:when, [:array, [:lit, 1]], - [:case, - [:lvar, :var2], - [:when, [:array, [:lit, 1]], - [:lasgn, :result, [:lit, 1]]], - [:when, [:array, [:lit, 2]], - [:lasgn, :result, [:lit, 2]]], - [:lasgn, :result, [:lit, 3]]]], - [:when, [:array, [:lit, 2]], - [:case, - [:lvar, :var2], - [:when, [:array, [:lit, 1]], - [:lasgn, :result, [:lit, 4]]], - [:when, [:array, [:lit, 2]], - [:lasgn, :result, [:lit, 5]]], - [:lasgn, :result, [:lit, 6]]]], - [:lasgn, :result, [:lit, 7]]]], - "ParseTree" => s(:block, - s(:lasgn, :var1, s(:lit, 1)), - s(:lasgn, :var2, s(:lit, 2)), - s(:lasgn, :result, s(:nil)), - s(:case, - s(:lvar, :var1), - s(:when, s(:array, s(:lit, 1)), - s(:case, - s(:lvar, :var2), - s(:when, s(:array, s(:lit, 1)), - s(:lasgn, :result, s(:lit, 1))), - s(:when, s(:array, s(:lit, 2)), - s(:lasgn, :result, s(:lit, 2))), - s(:lasgn, :result, s(:lit, 3)))), - s(:when, s(:array, s(:lit, 2)), - s(:case, - s(:lvar, :var2), - s(:when, s(:array, s(:lit, 1)), - s(:lasgn, :result, s(:lit, 4))), - s(:when, s(:array, s(:lit, 2)), - s(:lasgn, :result, s(:lit, 5))), - s(:lasgn, :result, s(:lit, 6)))), - s(:lasgn, :result, s(:lit, 7))))) - - add_tests("case_nested_inner_no_expr", - "Ruby" => "case a\nwhen b then\n case\n when (d and e) then\n f\n else\n # do nothing\n end\nelse\n # do nothing\nend", - "RawParseTree" => [:case, [:vcall, :a], - [:when, [:array, [:vcall, :b]], - [:case, nil, - [:when, - [:array, [:and, [:vcall, :d], [:vcall, :e]]], - [:vcall, :f]], - nil]], - nil], - "ParseTree" => s(:case, s(:call, nil, :a, s(:arglist)), - s(:when, - s(:array, s(:call, nil, :b, s(:arglist))), - s(:case, nil, - s(:when, - s(:array, - s(:and, - s(:call, nil, :d, s(:arglist)), - s(:call, nil, :e, s(:arglist)))), - s(:call, nil, :f, s(:arglist))), - nil)), - nil)) - - add_tests("case_no_expr", - "Ruby" => "case\nwhen (a == 1) then\n :a\nwhen (a == 2) then\n :b\nelse\n :c\nend", - "RawParseTree" => [:case, nil, - [:when, - [:array, - [:call, [:vcall, :a], :==, - [:array, [:lit, 1]]]], - [:lit, :a]], - [:when, - [:array, - [:call, [:vcall, :a], :==, - [:array, [:lit, 2]]]], - [:lit, :b]], - [:lit, :c]], - "ParseTree" => s(:case, nil, - s(:when, - s(:array, - s(:call, - s(:call, nil, :a, s(:arglist)), - :==, - s(:arglist, s(:lit, 1)))), - s(:lit, :a)), - s(:when, - s(:array, - s(:call, - s(:call, nil, :a, s(:arglist)), - :==, - s(:arglist, s(:lit, 2)))), - s(:lit, :b)), - s(:lit, :c))) - - add_tests("case_splat", - "Ruby" => "case a\nwhen :b, *c then\n d\nelse\n e\nend", - "RawParseTree" => [:case, [:vcall, :a], - [:when, - [:array, - [:lit, :b], [:when, [:vcall, :c], nil]], # wtf? - [:vcall, :d]], - [:vcall, :e]], - "ParseTree" => s(:case, s(:call, nil, :a, s(:arglist)), - s(:when, - s(:array, - s(:lit, :b), - s(:when, - s(:call, nil, :c, s(:arglist)), - nil)), # wtf? - s(:call, nil, :d, s(:arglist))), - s(:call, nil, :e, s(:arglist)))) - - add_tests("cdecl", - "Ruby" => "X = 42", - "RawParseTree" => [:cdecl, :X, [:lit, 42]], - "ParseTree" => s(:cdecl, :X, s(:lit, 42))) - - add_tests("class_plain", - "Ruby" => "class X\n puts((1 + 1))\n def blah\n puts(\"hello\")\n end\nend", - "RawParseTree" => [:class, - :X, - nil, - [:scope, - [:block, - [:fcall, :puts, - [:array, - [:call, [:lit, 1], :+, - [:array, [:lit, 1]]]]], - [:defn, :blah, - [:scope, - [:block, - [:args], - [:fcall, :puts, - [:array, [:str, "hello"]]]]]]]]], - "ParseTree" => s(:class, - :X, - nil, - s(:scope, - s(:block, - s(:call, nil, :puts, - s(:arglist, - s(:call, s(:lit, 1), :+, - s(:arglist, s(:lit, 1))))), - s(:defn, :blah, - s(:args), - s(:scope, - s(:block, - s(:call, nil, :puts, - s(:arglist, - s(:str, "hello")))))))))) - - add_tests("class_scoped", - "Ruby" => "class X::Y\n c\nend", - "RawParseTree" => [:class, [:colon2, [:const, :X], :Y], nil, - [:scope, [:vcall, :c]]], - "ParseTree" => s(:class, s(:colon2, s(:const, :X), :Y), nil, - s(:scope, s(:call, nil, :c, s(:arglist))))) - - add_tests("class_scoped3", - "Ruby" => "class ::Y\n c\nend", - "RawParseTree" => [:class, [:colon3, :Y], nil, - [:scope, [:vcall, :c]]], - "ParseTree" => s(:class, s(:colon3, :Y), nil, - s(:scope, s(:call, nil, :c, s(:arglist))))) - - add_tests("class_super_array", - "Ruby" => "class X < Array\nend", - "RawParseTree" => [:class, - :X, - [:const, :Array], - [:scope]], - "ParseTree" => s(:class, - :X, - s(:const, :Array), - s(:scope))) - - add_tests("class_super_expr", - "Ruby" => "class X < expr\nend", - "RawParseTree" => [:class, - :X, - [:vcall, :expr], - [:scope]], - "ParseTree" => s(:class, - :X, - s(:call, nil, :expr, s(:arglist)), - s(:scope))) - - add_tests("class_super_object", - "Ruby" => "class X < Object\nend", - "RawParseTree" => [:class, - :X, - [:const, :Object], - [:scope]], - "ParseTree" => s(:class, - :X, - s(:const, :Object), - s(:scope))) - - add_tests("colon2", - "Ruby" => "X::Y", - "RawParseTree" => [:colon2, [:const, :X], :Y], - "ParseTree" => s(:colon2, s(:const, :X), :Y)) - - add_tests("colon3", - "Ruby" => "::X", - "RawParseTree" => [:colon3, :X], - "ParseTree" => s(:colon3, :X)) - - add_tests("const", - "Ruby" => "X", - "RawParseTree" => [:const, :X], - "ParseTree" => s(:const, :X)) - - add_tests("constX", - "Ruby" => "X = 1", - "RawParseTree" => [:cdecl, :X, [:lit, 1]], - "ParseTree" => s(:cdecl, :X, s(:lit, 1))) - - add_tests("constY", - "Ruby" => "::X = 1", - "RawParseTree" => [:cdecl, [:colon3, :X], [:lit, 1]], - "ParseTree" => s(:cdecl, s(:colon3, :X), s(:lit, 1))) - - add_tests("constZ", - "Ruby" => "X::Y = 1", - "RawParseTree" => [:cdecl, [:colon2, [:const, :X], :Y], [:lit, 1]], - "ParseTree" => s(:cdecl, - s(:colon2, s(:const, :X), :Y), - s(:lit, 1))) - - add_tests("cvar", - "Ruby" => "@@x", - "RawParseTree" => [:cvar, :@@x], - "ParseTree" => s(:cvar, :@@x)) - - add_tests("cvasgn", - "Ruby" => "def x\n @@blah = 1\nend", - "RawParseTree" => [:defn, :x, - [:scope, - [:block, [:args], - [:cvasgn, :@@blah, [:lit, 1]]]]], - "ParseTree" => s(:defn, :x, - s(:args), - s(:scope, - s(:block, - s(:cvasgn, :@@blah, s(:lit, 1)))))) - - add_tests("cvasgn_cls_method", - "Ruby" => "def self.quiet_mode=(boolean)\n @@quiet_mode = boolean\nend", - "RawParseTree" => [:defs, [:self], :quiet_mode=, - [:scope, - [:block, - [:args, :boolean], - [:cvasgn, :@@quiet_mode, [:lvar, :boolean]]]]], - "ParseTree" => s(:defs, s(:self), :quiet_mode=, - s(:args, :boolean), - s(:scope, - s(:block, - s(:cvasgn, :@@quiet_mode, - s(:lvar, :boolean)))))) - - add_tests("cvdecl", - "Ruby" => "class X\n @@blah = 1\nend", - "RawParseTree" => [:class, :X, nil, - [:scope, [:cvdecl, :@@blah, [:lit, 1]]]], - "ParseTree" => s(:class, :X, nil, - s(:scope, s(:cvdecl, :@@blah, s(:lit, 1))))) - - add_tests("dasgn_0", - "Ruby" => "a.each { |x| b.each { |y| x = (x + 1) } if true }", - "RawParseTree" => [:iter, - [:call, [:vcall, :a], :each], - [:dasgn_curr, :x], - [:if, [:true], - [:iter, - [:call, [:vcall, :b], :each], - [:dasgn_curr, :y], - [:dasgn, :x, - [:call, [:dvar, :x], :+, - [:array, [:lit, 1]]]]], - nil]], - "ParseTree" => s(:iter, - s(:call, s(:call, nil, :a, s(:arglist)), :each, - s(:arglist)), - s(:lasgn, :x), - s(:if, s(:true), - s(:iter, - s(:call, s(:call, nil, :b, s(:arglist)), - :each, - s(:arglist)), - s(:lasgn, :y), - s(:lasgn, :x, - s(:call, s(:lvar, :x), :+, - s(:arglist, s(:lit, 1))))), - nil))) - - add_tests("dasgn_1", - "Ruby" => "a.each { |x| b.each { |y| c = (c + 1) } if true }", - "RawParseTree" => [:iter, - [:call, [:vcall, :a], :each], - [:dasgn_curr, :x], - [:if, [:true], - [:iter, - [:call, [:vcall, :b], :each], - [:dasgn_curr, :y], - [:dasgn_curr, :c, - [:call, [:dvar, :c], :+, - [:array, [:lit, 1]]]]], - nil]], - "ParseTree" => s(:iter, - s(:call, s(:call, nil, :a, s(:arglist)), :each, - s(:arglist)), - s(:lasgn, :x), - s(:if, s(:true), - s(:iter, - s(:call, s(:call, nil, :b, s(:arglist)), - :each, - s(:arglist)), - s(:lasgn, :y), - s(:lasgn, :c, - s(:call, s(:lvar, :c), :+, - s(:arglist, s(:lit, 1))))), - nil))) - - add_tests("dasgn_2", - "Ruby" => "a.each do |x|\n if true then\n c = 0\n b.each { |y| c = (c + 1) }\n end\nend", # FIX: hate that extra newline! - "RawParseTree" => [:iter, - [:call, [:vcall, :a], :each], - [:dasgn_curr, :x], - [:if, [:true], - [:block, - [:dasgn_curr, :c, [:lit, 0]], - [:iter, - [:call, [:vcall, :b], :each], - [:dasgn_curr, :y], - [:dasgn, :c, - [:call, [:dvar, :c], :+, - [:array, [:lit, 1]]]]]], - nil]], - "ParseTree" => s(:iter, - s(:call, s(:call, nil, :a, s(:arglist)), :each, - s(:arglist)), - s(:lasgn, :x), - s(:if, s(:true), - s(:block, - s(:lasgn, :c, s(:lit, 0)), - s(:iter, - s(:call, s(:call, nil, :b, s(:arglist)), - :each, - s(:arglist)), - s(:lasgn, :y), - s(:lasgn, :c, - s(:call, s(:lvar, :c), :+, - s(:arglist, s(:lit, 1)))))), - nil))) - - add_tests("dasgn_curr", - "Ruby" => "data.each do |x, y|\n a = 1\n b = a\n b = a = x\nend", - "RawParseTree" => [:iter, - [:call, [:vcall, :data], :each], - [:masgn, - [:array, [:dasgn_curr, :x], [:dasgn_curr, :y]], - nil, nil], - [:block, - [:dasgn_curr, :a, [:lit, 1]], - [:dasgn_curr, :b, [:dvar, :a]], - [:dasgn_curr, :b, - [:dasgn_curr, :a, [:dvar, :x]]]]], - "ParseTree" => s(:iter, - s(:call, s(:call, nil, :data, - s(:arglist)), :each, s(:arglist)), - s(:masgn, - s(:array, s(:lasgn, :x), s(:lasgn, :y))), - s(:block, - s(:lasgn, :a, s(:lit, 1)), - s(:lasgn, :b, s(:lvar, :a)), - s(:lasgn, :b, s(:lasgn, :a, s(:lvar, :x)))))) - - add_tests("dasgn_icky", - "Ruby" => "a do\n v = nil\n assert_block(full_message) do\n begin\n yield\n rescue Exception => v\n break\n end\n end\nend", - "RawParseTree" => [:iter, - [:fcall, :a], - nil, - [:block, - [:dasgn_curr, :v, [:nil]], - [:iter, - [:fcall, :assert_block, - [:array, [:vcall, :full_message]]], - nil, - [:rescue, - [:yield], - [:resbody, - [:array, [:const, :Exception]], - [:block, - [:dasgn, :v, - [:gvar, :$!]], [:break]]]]]]], - "ParseTree" => s(:iter, - s(:call, nil, :a, s(:arglist)), - nil, - s(:block, - s(:lasgn, :v, s(:nil)), - s(:iter, - s(:call, nil, :assert_block, - s(:arglist, - s(:call, nil, :full_message, - s(:arglist)))), - nil, - s(:rescue, - s(:yield), - s(:resbody, - s(:array, - s(:const, :Exception), - s(:lasgn, :v, s(:gvar, :$!))), - s(:break))))))) - - add_tests("dasgn_mixed", - "Ruby" => "t = 0\nns.each { |n| t += n }\n", - "RawParseTree" => [:block, - [:lasgn, :t, [:lit, 0]], - [:iter, - [:call, [:vcall, :ns], :each], - [:dasgn_curr, :n], - [:lasgn, :t, - [:call, [:lvar, :t], :+, - [:array, [:dvar, :n]]]]]], - "ParseTree" => s(:block, - s(:lasgn, :t, s(:lit, 0)), - s(:iter, - s(:call, s(:call, nil, :ns, - s(:arglist)), :each, s(:arglist)), - s(:lasgn, :n), - s(:lasgn, :t, - s(:call, s(:lvar, :t), :+, - s(:arglist, s(:lvar, :n)))))), - "Ruby2Ruby" => "t = 0\nns.each { |n| t = (t + n) }\n") - - add_tests("defined", - "Ruby" => "defined? $x", - "RawParseTree" => [:defined, [:gvar, :$x]], - "ParseTree" => s(:defined, s(:gvar, :$x))) - - # TODO: make all the defn_args* p their arglist - add_tests("defn_args_block", - "Ruby" => "def f(&block)\n # do nothing\nend", - "RawParseTree" => [:defn, :f, - [:scope, - [:block, - [:args], - [:block_arg, :block], - [:nil]]]], - "ParseTree" => s(:defn, :f, - s(:args, :"&block"), - s(:scope, s(:block, s(:nil))))) - - add_tests("defn_args_mand", - "Ruby" => "def f(mand)\n # do nothing\nend", - "RawParseTree" => [:defn, :f, - [:scope, - [:block, - [:args, :mand], - [:nil]]]], - "ParseTree" => s(:defn, :f, - s(:args, :mand), - s(:scope, s(:block, s(:nil))))) - - add_tests("defn_args_mand_block", - "Ruby" => "def f(mand, &block)\n # do nothing\nend", - "RawParseTree" => [:defn, :f, - [:scope, - [:block, - [:args, :mand], - [:block_arg, :block], - [:nil]]]], - "ParseTree" => s(:defn, :f, - s(:args, :mand, :"&block"), - s(:scope, s(:block, s(:nil))))) - - add_tests("defn_args_mand_opt", - "Ruby" => "def f(mand, opt = 42)\n # do nothing\nend", - "RawParseTree" => [:defn, :f, - [:scope, - [:block, - [:args, :mand, :opt, - [:block, - [:lasgn, :opt, [:lit, 42]]]], - [:nil]]]], - "ParseTree" => s(:defn, :f, - s(:args, :mand, :opt, - s(:block, - s(:lasgn, :opt, s(:lit, 42)))), - s(:scope, s(:block, s(:nil))))) - - add_tests("defn_args_mand_opt_block", - "Ruby" => "def f(mand, opt = 42, &block)\n # do nothing\nend", - "RawParseTree" => [:defn, :f, - [:scope, - [:block, - [:args, :mand, :opt, - [:block, - [:lasgn, :opt, [:lit, 42]]]], - [:block_arg, :block], - [:nil]]]], - "ParseTree" => s(:defn, :f, - s(:args, :mand, :opt, :"&block", - s(:block, - s(:lasgn, :opt, s(:lit, 42)))), - s(:scope, s(:block, s(:nil))))) - - add_tests("defn_args_mand_opt_splat", - "Ruby" => "def f(mand, opt = 42, *rest)\n # do nothing\nend", - "RawParseTree" => [:defn, :f, - [:scope, - [:block, - [:args, :mand, :opt, :"*rest", - [:block, - [:lasgn, :opt, [:lit, 42]]]], - [:nil]]]], - "ParseTree" => s(:defn, :f, - s(:args, :mand, :opt, :"*rest", - s(:block, - s(:lasgn, :opt, s(:lit, 42)))), - s(:scope, s(:block, s(:nil))))) - - add_tests("defn_args_mand_opt_splat_block", - "Ruby" => "def f(mand, opt = 42, *rest, &block)\n # do nothing\nend", - "RawParseTree" => [:defn, :f, - [:scope, - [:block, - [:args, :mand, :opt, :"*rest", - [:block, - [:lasgn, :opt, [:lit, 42]]]], - [:block_arg, :block], - [:nil]]]], - "ParseTree" => s(:defn, :f, - s(:args, :mand, :opt, :"*rest", :"&block", - s(:block, - s(:lasgn, :opt, s(:lit, 42)))), - s(:scope, s(:block, s(:nil))))) - - add_tests("defn_args_mand_opt_splat_no_name", - "Ruby" => "def x(a, b = 42, *)\n # do nothing\nend", - "RawParseTree" => [:defn, :x, - [:scope, - [:block, - [:args, :a, :b, :"*", - [:block, [:lasgn, :b, [:lit, 42]]]], - [:nil]]]], - "ParseTree" => s(:defn, :x, - s(:args, :a, :b, :"*", - s(:block, s(:lasgn, :b, s(:lit, 42)))), - s(:scope, - s(:block, - s(:nil))))) - - add_tests("defn_args_mand_splat", - "Ruby" => "def f(mand, *rest)\n # do nothing\nend", - "RawParseTree" => [:defn, :f, - [:scope, - [:block, - [:args, :mand, :"*rest"], - [:nil]]]], - "ParseTree" => s(:defn, :f, - s(:args, :mand, :"*rest"), - s(:scope, s(:block, s(:nil))))) - - add_tests("defn_args_mand_splat_block", - "Ruby" => "def f(mand, *rest, &block)\n # do nothing\nend", - "RawParseTree" => [:defn, :f, - [:scope, - [:block, - [:args, :mand, :"*rest"], - [:block_arg, :block], - [:nil]]]], - "ParseTree" => s(:defn, :f, - s(:args, :mand, :"*rest", :"&block"), - s(:scope, s(:block, s(:nil))))) - - add_tests("defn_args_mand_splat_no_name", - "Ruby" => "def x(a, *args)\n p(a, args)\nend", - "RawParseTree" => [:defn, :x, - [:scope, - [:block, - [:args, :a, :"*args"], - [:fcall, :p, - [:array, [:lvar, :a], [:lvar, :args]]]]]], - "ParseTree" => s(:defn, :x, - s(:args, :a, :"*args"), - s(:scope, - s(:block, - s(:call, nil, :p, - s(:arglist, s(:lvar, :a), s(:lvar, :args))))))) - - add_tests("defn_args_none", - "Ruby" => "def empty\n # do nothing\nend", - "RawParseTree" => [:defn, :empty, - [:scope, [:block, [:args], [:nil]]]], - "ParseTree" => s(:defn, :empty, - s(:args), - s(:scope, s(:block, s(:nil))))) - - add_tests("defn_args_opt", - "Ruby" => "def f(opt = 42)\n # do nothing\nend", - "RawParseTree" => [:defn, :f, - [:scope, - [:block, - [:args, :opt, - [:block, - [:lasgn, :opt, [:lit, 42]]]], - [:nil]]]], - "ParseTree" => s(:defn, :f, - s(:args, :opt, - s(:block, - s(:lasgn, :opt, s(:lit, 42)))), - s(:scope, s(:block, s(:nil))))) - - add_tests("defn_args_opt_block", - "Ruby" => "def f(opt = 42, &block)\n # do nothing\nend", - "RawParseTree" => [:defn, :f, - [:scope, - [:block, - [:args, :opt, - [:block, - [:lasgn, :opt, [:lit, 42]]]], - [:block_arg, :block], - [:nil]]]], - "ParseTree" => s(:defn, :f, - s(:args, :opt, :"&block", - s(:block, - s(:lasgn, :opt, s(:lit, 42)))), - s(:scope, s(:block, s(:nil))))) - - add_tests("defn_args_opt_splat", - "Ruby" => "def f(opt = 42, *rest)\n # do nothing\nend", - "RawParseTree" => [:defn, :f, - [:scope, - [:block, - [:args, :opt, :"*rest", - [:block, - [:lasgn, :opt, [:lit, 42]]]], - [:nil]]]], - "ParseTree" => s(:defn, :f, - s(:args, :opt, :"*rest", - s(:block, - s(:lasgn, :opt, s(:lit, 42)))), - s(:scope, s(:block, s(:nil))))) - - add_tests("defn_args_opt_splat_block", - "Ruby" => "def f(opt = 42, *rest, &block)\n # do nothing\nend", - "RawParseTree" => [:defn, :f, - [:scope, - [:block, - [:args, :opt, :"*rest", - [:block, - [:lasgn, :opt, [:lit, 42]]]], - [:block_arg, :block], - [:nil]]]], - "ParseTree" => s(:defn, :f, - s(:args, :opt, :"*rest", :"&block", - s(:block, - s(:lasgn, :opt, s(:lit, 42)))), - s(:scope, s(:block, s(:nil))))) - - add_tests("defn_args_opt_splat_no_name", - "Ruby" => "def x(b = 42, *)\n # do nothing\nend", - "RawParseTree" => [:defn, :x, - [:scope, - [:block, - [:args, :b, :"*", - [:block, [:lasgn, :b, [:lit, 42]]]], - [:nil]]]], - "ParseTree" => s(:defn, :x, - s(:args, :b, :"*", - s(:block, s(:lasgn, :b, s(:lit, 42)))), - s(:scope, - s(:block, - s(:nil))))) - - add_tests("defn_args_splat", - "Ruby" => "def f(*rest)\n # do nothing\nend", - "RawParseTree" => [:defn, :f, - [:scope, - [:block, - [:args, :"*rest"], - [:nil]]]], - "ParseTree" => s(:defn, :f, - s(:args, :"*rest"), - s(:scope, s(:block, s(:nil))))) - - add_tests("defn_args_splat_no_name", - "Ruby" => "def x(*)\n # do nothing\nend", - "RawParseTree" => [:defn, :x, - [:scope, - [:block, - [:args, :"*"], - [:nil]]]], - "ParseTree" => s(:defn, :x, - s(:args, :"*"), - s(:scope, - s(:block, - s(:nil))))) - - add_tests("defn_or", - "Ruby" => "def |(o)\n # do nothing\nend", - "RawParseTree" => [:defn, :|, - [:scope, [:block, [:args, :o], [:nil]]]], - "ParseTree" => s(:defn, :|, - s(:args, :o), - s(:scope, s(:block, s(:nil))))) - - add_tests("defn_rescue", - "Ruby" => "def eql?(resource)\n (self.uuid == resource.uuid)\nrescue\n false\nend", - "RawParseTree" => [:defn, :eql?, - [:scope, - [:block, - [:args, :resource], - [:rescue, - [:call, - [:call, [:self], :uuid], - :==, - [:array, - [:call, [:lvar, :resource], :uuid]]], - [:resbody, nil, [:false]]]]]], - "ParseTree" => s(:defn, :eql?, - s(:args, :resource), - s(:scope, - s(:block, - s(:rescue, - s(:call, - s(:call, s(:self), :uuid, s(:arglist)), - :==, - s(:arglist, - s(:call, s(:lvar, :resource), - :uuid, s(:arglist)))), - s(:resbody, s(:array), s(:false)))))), - "Ruby2Ruby" => "def eql?(resource)\n (self.uuid == resource.uuid) rescue false\nend") - - add_tests("defn_rescue_mri_verbose_flag", - "Ruby" => "def eql?(resource)\n (self.uuid == resource.uuid)\nrescue\n false\nend", - "RawParseTree" => [:defn, :eql?, - [:scope, - [:block, - [:args, :resource], - [:rescue, - [:call, - [:call, [:self], :uuid], - :==, - [:array, - [:call, [:lvar, :resource], :uuid]]], - [:resbody, nil, [:false]]]]]], - "ParseTree" => s(:defn, :eql?, - s(:args, :resource), - s(:scope, - s(:block, - s(:rescue, - s(:call, - s(:call, s(:self), :uuid, s(:arglist)), - :==, - s(:arglist, - s(:call, s(:lvar, :resource), - :uuid, s(:arglist)))), - s(:resbody, s(:array), s(:false)))))), - "Ruby2Ruby" => "def eql?(resource)\n (self.uuid == resource.uuid) rescue false\nend") - - add_tests("defn_something_eh", - "Ruby" => "def something?\n # do nothing\nend", - "RawParseTree" => [:defn, :something?, - [:scope, [:block, [:args], [:nil]]]], - "ParseTree" => s(:defn, :something?, - s(:args), - s(:scope, s(:block, s(:nil))))) - - add_tests("defn_splat_no_name", - "Ruby" => "def x(a, *)\n p(a)\nend", - "RawParseTree" => [:defn, :x, - [:scope, - [:block, - [:args, :a, :"*"], - [:fcall, :p, - [:array, [:lvar, :a]]]]]], - "ParseTree" => s(:defn, :x, - s(:args, :a, :"*"), - s(:scope, - s(:block, - s(:call, nil, :p, - s(:arglist, s(:lvar, :a))))))) - - add_tests("defn_zarray", - "Ruby" => "def zarray\n a = []\n return a\nend", - "RawParseTree" => [:defn, :zarray, - [:scope, - [:block, [:args], - [:lasgn, :a, [:zarray]], - [:return, [:lvar, :a]]]]], - "ParseTree" => s(:defn, :zarray, - s(:args), - s(:scope, - s(:block, - s(:lasgn, :a, s(:array)), - s(:return, s(:lvar, :a)))))) - - add_tests("defs", - "Ruby" => "def self.x(y)\n (y + 1)\nend", - "RawParseTree" => [:defs, [:self], :x, - [:scope, - [:block, - [:args, :y], - [:call, [:lvar, :y], :+, - [:array, [:lit, 1]]]]]], - "ParseTree" => s(:defs, s(:self), :x, - s(:args, :y), - s(:scope, - s(:block, - s(:call, s(:lvar, :y), :+, - s(:arglist, s(:lit, 1))))))) - - add_tests("defs_empty", - "Ruby" => "def self.empty\n # do nothing\nend", - "RawParseTree" => [:defs, [:self], :empty, - [:scope, [:args]]], - "ParseTree" => s(:defs, s(:self), :empty, - s(:args), - s(:scope, s(:block)))) - - add_tests("defs_empty_args", - "Ruby" => "def self.empty(*)\n # do nothing\nend", - "RawParseTree" => [:defs, [:self], :empty, - [:scope, [:args, :*]]], - "ParseTree" => s(:defs, s(:self), :empty, - s(:args, :*), - s(:scope, s(:block)))) - - add_tests("defs_expr_wtf", - "Ruby" => "def (a.b).empty(*)\n # do nothing\nend", - "RawParseTree" => [:defs, - [:call, [:vcall, :a], :b], - :empty, - [:scope, [:args, :*]]], - "ParseTree" => s(:defs, - s(:call, - s(:call, nil, :a, s(:arglist)), - :b, s(:arglist)), - :empty, - s(:args, :*), - s(:scope, s(:block)))) - - add_tests("dmethod", - "Ruby" => [Examples, :dmethod_added], - "RawParseTree" => [:defn, :dmethod_added, - [:dmethod, - :a_method, - [:scope, - [:block, - [:args, :x], - [:call, [:lvar, :x], :+, - [:array, [:lit, 1]]]]]]], - "ParseTree" => s(:defn, :dmethod_added, - s(:args, :x), - s(:scope, - s(:block, - s(:call, s(:lvar, :x), :+, - s(:arglist, s(:lit, 1)))))), - "Ruby2Ruby" => "def dmethod_added(x)\n (x + 1)\nend") - - add_tests("dot2", - "Ruby" => "(a..b)", - "RawParseTree" => [:dot2, [:vcall, :a], [:vcall, :b]], - "ParseTree" => s(:dot2, - s(:call, nil, :a, s(:arglist)), - s(:call, nil, :b, s(:arglist)))) - - add_tests("dot3", - "Ruby" => "(a...b)", - "RawParseTree" => [:dot3, [:vcall, :a], [:vcall, :b]], - "ParseTree" => s(:dot3, - s(:call, nil, :a, s(:arglist)), - s(:call, nil, :b, s(:arglist)))) - - add_tests("dregx", - "Ruby" => "/x#\{(1 + 1)}y/", - "RawParseTree" => [:dregx, "x", - [:evstr, - [:call, [:lit, 1], :+, [:array, [:lit, 1]]]], - [:str, "y"]], - "ParseTree" => s(:dregx, "x", - s(:evstr, - s(:call, s(:lit, 1), :+, - s(:arglist, s(:lit, 1)))), - s(:str, "y"))) - - add_tests("dregx_interp", - "Ruby" => "/#\{@rakefile}/", - "RawParseTree" => [:dregx, '', [:evstr, [:ivar, :@rakefile]]], - "ParseTree" => s(:dregx, '', s(:evstr, s(:ivar, :@rakefile)))) - - add_tests("dregx_interp_empty", - "Ruby" => "/a#\{}b/", - "RawParseTree" => [:dregx, 'a', [:evstr], [:str, "b"]], - "ParseTree" => s(:dregx, 'a', s(:evstr), s(:str, "b"))) - - add_tests("dregx_n", - "Ruby" => '/#{1}/n', - "RawParseTree" => [:dregx, '', [:evstr, [:lit, 1]], /x/n.options], - "ParseTree" => s(:dregx, '', - s(:evstr, s(:lit, 1)), /x/n.options), - "Ruby2Ruby" => "/#\{1}/") # HACK - need to support regexp flag - - add_tests("dregx_once", - "Ruby" => "/x#\{(1 + 1)}y/o", - "RawParseTree" => [:dregx_once, "x", - [:evstr, - [:call, [:lit, 1], :+, [:array, [:lit, 1]]]], - [:str, "y"]], - "ParseTree" => s(:dregx_once, "x", - s(:evstr, - s(:call, s(:lit, 1), :+, - s(:arglist, s(:lit, 1)))), - s(:str, "y"))) - - add_tests("dregx_once_n_interp", - "Ruby" => "/#\{IAC}#\{SB}/no", - "RawParseTree" => [:dregx_once, '', - [:evstr, [:const, :IAC]], - [:evstr, [:const, :SB]], /x/n.options], - "ParseTree" => s(:dregx_once, '', - s(:evstr, s(:const, :IAC)), - s(:evstr, s(:const, :SB)), /x/n.options), - "Ruby2Ruby" => "/#\{IAC}#\{SB}/o") # HACK - - add_tests("dstr", - "Ruby" => "argl = 1\n\"x#\{argl}y\"\n", - "RawParseTree" => [:block, - [:lasgn, :argl, [:lit, 1]], - [:dstr, "x", [:evstr, [:lvar, :argl]], - [:str, "y"]]], - "ParseTree" => s(:block, - s(:lasgn, :argl, s(:lit, 1)), - s(:dstr, "x", s(:evstr, s(:lvar, :argl)), - s(:str, "y")))) - - add_tests("dstr_2", - "Ruby" => "argl = 1\n\"x#\{(\"%.2f\" % 3.14159)}y\"\n", - "RawParseTree" => [:block, - [:lasgn, :argl, [:lit, 1]], - [:dstr, - "x", - [:evstr, - [:call, [:str, "%.2f"], :%, - [:array, [:lit, 3.14159]]]], - [:str, "y"]]], - "ParseTree" => s(:block, - s(:lasgn, :argl, s(:lit, 1)), - s(:dstr, - "x", - s(:evstr, - s(:call, s(:str, "%.2f"), :%, - s(:arglist, s(:lit, 3.14159)))), - s(:str, "y")))) - - add_tests("dstr_3", - "Ruby" => "max = 2\nargl = 1\n\"x#\{(\"%.#\{max}f\" % 3.14159)}y\"\n", - "RawParseTree" => [:block, - [:lasgn, :max, [:lit, 2]], - [:lasgn, :argl, [:lit, 1]], - [:dstr, "x", - [:evstr, - [:call, - [:dstr, "%.", - [:evstr, [:lvar, :max]], - [:str, "f"]], - :%, - [:array, [:lit, 3.14159]]]], - [:str, "y"]]], - "ParseTree" => s(:block, - s(:lasgn, :max, s(:lit, 2)), - s(:lasgn, :argl, s(:lit, 1)), - s(:dstr, "x", - s(:evstr, - s(:call, - s(:dstr, "%.", - s(:evstr, s(:lvar, :max)), - s(:str, "f")), - :%, - s(:arglist, s(:lit, 3.14159)))), - s(:str, "y")))) - - add_tests("dstr_concat", - "Ruby" => '"#{22}aa" "cd#{44}" "55" "#{66}"', - "RawParseTree" => [:dstr, - "", - [:evstr, [:lit, 22]], - [:str, "aa"], - [:str, "cd"], - [:evstr, [:lit, 44]], - [:str, "55"], - [:evstr, [:lit, 66]]], - "ParseTree" => s(:dstr, - "", - s(:evstr, s(:lit, 22)), - s(:str, "aa"), - s(:str, "cd"), - s(:evstr, s(:lit, 44)), - s(:str, "55"), - s(:evstr, s(:lit, 66))), - "Ruby2Ruby" => '"#{22}aacd#{44}55#{66}"') - - add_tests("dstr_gross", - "Ruby" => '"a #$global b #@ivar c #@@cvar d"', - "RawParseTree" => [:dstr, "a ", - [:evstr, [:gvar, :$global]], - [:str, " b "], - [:evstr, [:ivar, :@ivar]], - [:str, " c "], - [:evstr, [:cvar, :@@cvar]], - [:str, " d"]], - "ParseTree" => s(:dstr, "a ", - s(:evstr, s(:gvar, :$global)), - s(:str, " b "), - s(:evstr, s(:ivar, :@ivar)), - s(:str, " c "), - s(:evstr, s(:cvar, :@@cvar)), - s(:str, " d")), - "Ruby2Ruby" => '"a #{$global} b #{@ivar} c #{@@cvar} d"') - - add_tests("dstr_heredoc_expand", - "Ruby" => "< [:dstr, " blah\n", - [:evstr, [:call, [:lit, 1], :+, - [:array, [:lit, 1]]]], - [:str, "blah\n"]], - "ParseTree" => s(:dstr, " blah\n", - s(:evstr, s(:call, s(:lit, 1), :+, - s(:arglist, s(:lit, 1)))), - s(:str, "blah\n")), - "Ruby2Ruby" => "\" blah\\n#\{(1 + 1)}blah\\n\"") - - add_tests("dstr_heredoc_windoze_sucks", - "Ruby" => "<<-EOF\r\ndef test_#\{action}_valid_feed\r\n EOF\r\n", - "RawParseTree" => [:dstr, - 'def test_', - [:evstr, [:vcall, :action]], - [:str, "_valid_feed\n"]], - "ParseTree" => s(:dstr, - 'def test_', - s(:evstr, s(:call, nil, :action, s(:arglist))), - s(:str, "_valid_feed\n")), - "Ruby2Ruby" => "\"def test_#\{action}_valid_feed\\n\"") - - add_tests("dstr_heredoc_yet_again", - "Ruby" => "<<-EOF\ns1 '#\{RUBY_PLATFORM}' s2\n#\{__FILE__}\n EOF\n", - "RawParseTree" => [:dstr, "s1 '", - [:evstr, [:const, :RUBY_PLATFORM]], - [:str, "' s2\n"], - [:str, "(string)"], - [:str, "\n"]], - "ParseTree" => s(:dstr, "s1 '", - s(:evstr, s(:const, :RUBY_PLATFORM)), - s(:str, "' s2\n"), - s(:str, "(string)"), - s(:str, "\n")), - "Ruby2Ruby" => "\"s1 '#\{RUBY_PLATFORM}' s2\\n(string)\\n\"") - - add_tests("dstr_nest", - "Ruby" => "%Q[before [#\{nest}] after]", - "RawParseTree" => [:dstr, "before [", - [:evstr, [:vcall, :nest]], [:str, "] after"]], - "ParseTree" => s(:dstr, "before [", - s(:evstr, s(:call, nil, :nest, s(:arglist))), - s(:str, "] after")), - "Ruby2Ruby" => "\"before [#\{nest}] after\"") - - add_tests("dstr_str_lit_start", - "Ruby" => '"#{"blah"}#{__FILE__}:#{__LINE__}: warning: #{$!.message} (#{$!.class})"', - "RawParseTree" => [:dstr, - "blah(string):", - [:evstr, [:lit, 1]], - [:str, ": warning: "], - [:evstr, [:call, [:gvar, :$!], :message]], - [:str, " ("], - [:evstr, [:call, [:gvar, :$!], :class]], - [:str, ")"]], - "ParseTree" => s(:dstr, - "blah(string):", - s(:evstr, s(:lit, 1)), - s(:str, ": warning: "), - s(:evstr, s(:call, s(:gvar, :$!), :message, - s(:arglist))), - s(:str, " ("), - s(:evstr, s(:call, s(:gvar, :$!), :class, - s(:arglist))), - s(:str, ")")), - "Ruby2Ruby" => '"blah(string):#{1}: warning: #{$!.message} (#{$!.class})"') - - add_tests("dstr_the_revenge", - "Ruby" => '"before #{from} middle #{to} (#{__FILE__}:#{__LINE__})"', - "RawParseTree" => [:dstr, - "before ", - [:evstr, [:vcall, :from]], - [:str, " middle "], - [:evstr, [:vcall, :to]], - [:str, " ("], - [:str, "(string)"], - [:str, ":"], - [:evstr, [:lit, 1]], - [:str, ")"]], - "ParseTree" => s(:dstr, - "before ", - s(:evstr, s(:call, nil, :from, s(:arglist))), - s(:str, " middle "), - s(:evstr, s(:call, nil, :to, s(:arglist))), - s(:str, " ("), - s(:str, "(string)"), - s(:str, ":"), - s(:evstr, s(:lit, 1)), - s(:str, ")")), - "Ruby2Ruby" => '"before #{from} middle #{to} ((string):#{1})"') - - add_tests("dsym", - "Ruby" => ":\"x#\{(1 + 1)}y\"", - "RawParseTree" => [:dsym, "x", - [:evstr, [:call, [:lit, 1], :+, - [:array, [:lit, 1]]]], [:str, "y"]], - "ParseTree" => s(:dsym, "x", - s(:evstr, s(:call, s(:lit, 1), :+, - s(:arglist, s(:lit, 1)))), s(:str, "y"))) - - add_tests("dxstr", - "Ruby" => "t = 5\n`touch #\{t}`\n", - "RawParseTree" => [:block, - [:lasgn, :t, [:lit, 5]], - [:dxstr, 'touch ', [:evstr, [:lvar, :t]]]], - "ParseTree" => s(:block, - s(:lasgn, :t, s(:lit, 5)), - s(:dxstr, 'touch ', s(:evstr, s(:lvar, :t))))) - - add_tests("ensure", - "Ruby" => "begin\n (1 + 1)\nrescue SyntaxError => e1\n 2\nrescue Exception => e2\n 3\nelse\n 4\nensure\n 5\nend", - "RawParseTree" => [:ensure, - [:rescue, - [:call, [:lit, 1], :+, [:array, [:lit, 1]]], - [:resbody, - [:array, [:const, :SyntaxError]], - [:block, - [:lasgn, :e1, [:gvar, :$!]], [:lit, 2]], - [:resbody, - [:array, [:const, :Exception]], - [:block, - [:lasgn, :e2, [:gvar, :$!]], [:lit, 3]]]], - [:lit, 4]], - [:lit, 5]], - "ParseTree" => s(:ensure, - s(:rescue, - s(:call, s(:lit, 1), :+, - s(:arglist, s(:lit, 1))), - s(:resbody, - s(:array, - s(:const, :SyntaxError), - s(:lasgn, :e1, s(:gvar, :$!))), - s(:lit, 2)), - s(:resbody, - s(:array, - s(:const, :Exception), - s(:lasgn, :e2, s(:gvar, :$!))), - s(:lit, 3)), - s(:lit, 4)), - s(:lit, 5))) - - add_tests("false", - "Ruby" => "false", - "RawParseTree" => [:false], - "ParseTree" => s(:false)) - - add_tests("fbody", - "Ruby" => [Examples, :an_alias], - "RawParseTree" => [:defn, :an_alias, - [:fbody, - [:scope, - [:block, - [:args, :x], - [:call, [:lvar, :x], :+, - [:array, [:lit, 1]]]]]]], - "ParseTree" => s(:defn, :an_alias, - s(:args, :x), - s(:scope, - s(:block, - s(:call, s(:lvar, :x), :+, - s(:arglist, s(:lit, 1)))))), - "Ruby2Ruby" => "def an_alias(x)\n (x + 1)\nend") - - add_tests("fcall_arglist", - "Ruby" => "m(42)", - "RawParseTree" => [:fcall, :m, [:array, [:lit, 42]]], - "ParseTree" => s(:call, nil, :m, s(:arglist, s(:lit, 42)))) - - add_tests("fcall_arglist_hash", - "Ruby" => "m(:a => 1, :b => 2)", - "RawParseTree" => [:fcall, :m, - [:array, - [:hash, - [:lit, :a], [:lit, 1], - [:lit, :b], [:lit, 2]]]], - "ParseTree" => s(:call, nil, :m, - s(:arglist, - s(:hash, - s(:lit, :a), s(:lit, 1), - s(:lit, :b), s(:lit, 2))))) - - add_tests("fcall_arglist_norm_hash", - "Ruby" => "m(42, :a => 1, :b => 2)", - "RawParseTree" => [:fcall, :m, - [:array, - [:lit, 42], - [:hash, - [:lit, :a], [:lit, 1], - [:lit, :b], [:lit, 2]]]], - "ParseTree" => s(:call, nil, :m, - s(:arglist, - s(:lit, 42), - s(:hash, - s(:lit, :a), s(:lit, 1), - s(:lit, :b), s(:lit, 2))))) - - add_tests("fcall_arglist_norm_hash_splat", - "Ruby" => "m(42, :a => 1, :b => 2, *c)", - "RawParseTree" => [:fcall, :m, - [:argscat, - [:array, - [:lit, 42], - [:hash, - [:lit, :a], [:lit, 1], - [:lit, :b], [:lit, 2]]], - [:vcall, :c]]], - "ParseTree" => s(:call, nil, :m, - s(:arglist, - s(:lit, 42), - s(:hash, - s(:lit, :a), s(:lit, 1), - s(:lit, :b), s(:lit, 2)), - s(:splat, s(:call, nil, :c, s(:arglist)))))) - - add_tests("fcall_block", - "Ruby" => "a(:b) { :c }", - "RawParseTree" => [:iter, - [:fcall, :a, [:array, [:lit, :b]]], nil, - [:lit, :c]], - "ParseTree" => s(:iter, - s(:call, nil, :a, - s(:arglist, s(:lit, :b))), nil, - s(:lit, :c))) - - add_tests("fcall_index_space", - "Ruby" => "a [42]", - "RawParseTree" => [:fcall, :a, [:array, [:array, [:lit, 42]]]], - "ParseTree" => s(:call, nil, :a, - s(:arglist, s(:array, s(:lit, 42)))), - "Ruby2Ruby" => "a([42])") - - add_tests("fcall_keyword", - "Ruby" => "42 if block_given?", - "RawParseTree" => [:if, [:fcall, :block_given?], [:lit, 42], nil], - "ParseTree" => s(:if, - s(:call, nil, :block_given?, s(:arglist)), - s(:lit, 42), nil)) - - add_tests("flip2", - "Ruby" => "x = if ((i % 4) == 0)..((i % 3) == 0) then\n i\nelse\n nil\nend", - "RawParseTree" => [:lasgn, - :x, - [:if, - [:flip2, - [:call, - [:call, [:vcall, :i], :%, - [:array, [:lit, 4]]], - :==, - [:array, [:lit, 0]]], - [:call, - [:call, [:vcall, :i], :%, - [:array, [:lit, 3]]], - :==, - [:array, [:lit, 0]]]], - [:vcall, :i], - [:nil]]], - "ParseTree" => s(:lasgn, - :x, - s(:if, - s(:flip2, - s(:call, - s(:call, s(:call, nil, :i, s(:arglist)), - :%, - s(:arglist, s(:lit, 4))), - :==, - s(:arglist, s(:lit, 0))), - s(:call, - s(:call, s(:call, nil, :i, s(:arglist)), - :%, - s(:arglist, s(:lit, 3))), - :==, - s(:arglist, s(:lit, 0)))), - s(:call, nil, :i, s(:arglist)), - s(:nil)))) - - add_tests("flip2_method", - "Ruby" => "if 1..2.a?(b) then\n nil\nend", - "RawParseTree" => [:if, - [:flip2, - [:call, [:lit, 1], :==, - [:array, [:gvar, :$.]]], - [:call, [:lit, 2], :a?, - [:array, [:vcall, :b]]]], - [:nil], - nil], - "ParseTree" => s(:if, - s(:flip2, - s(:lit, 1), - s(:call, s(:lit, 2), :a?, - s(:arglist, - s(:call, nil, :b, s(:arglist))))), - s(:nil), - nil)) - - add_tests("flip3", - "Ruby" => "x = if ((i % 4) == 0)...((i % 3) == 0) then\n i\nelse\n nil\nend", - "RawParseTree" => [:lasgn, - :x, - [:if, - [:flip3, - [:call, - [:call, [:vcall, :i], :%, - [:array, [:lit, 4]]], - :==, - [:array, [:lit, 0]]], - [:call, - [:call, [:vcall, :i], :%, - [:array, [:lit, 3]]], - :==, - [:array, [:lit, 0]]]], - [:vcall, :i], - [:nil]]], - "ParseTree" => s(:lasgn, - :x, - s(:if, - s(:flip3, - s(:call, - s(:call, s(:call, nil, :i, s(:arglist)), - :%, - s(:arglist, s(:lit, 4))), - :==, - s(:arglist, s(:lit, 0))), - s(:call, - s(:call, s(:call, nil, :i, s(:arglist)), - :%, - s(:arglist, s(:lit, 3))), - :==, - s(:arglist, s(:lit, 0)))), - s(:call, nil, :i, s(:arglist)), - s(:nil)))) - - add_tests("for", - "Ruby" => "for o in ary do\n puts(o)\nend", - "RawParseTree" => [:for, - [:vcall, :ary], - [:lasgn, :o], - [:fcall, :puts, [:array, [:lvar, :o]]]], - "ParseTree" => s(:for, - s(:call, nil, :ary, s(:arglist)), - s(:lasgn, :o), - s(:call, nil, :puts, - s(:arglist, s(:lvar, :o))))) - - add_tests("for_no_body", - "Ruby" => "for i in (0..max) do\n # do nothing\nend", - "RawParseTree" => [:for, - [:dot2, [:lit, 0], [:vcall, :max]], - [:lasgn, :i]], - "ParseTree" => s(:for, - s(:dot2, - s(:lit, 0), - s(:call, nil, :max, s(:arglist))), - s(:lasgn, :i))) - - add_tests("gasgn", - "Ruby" => "$x = 42", - "RawParseTree" => [:gasgn, :$x, [:lit, 42]], - "ParseTree" => s(:gasgn, :$x, s(:lit, 42))) - - add_tests("global", - "Ruby" => "$stderr", - "RawParseTree" => [:gvar, :$stderr], - "ParseTree" => s(:gvar, :$stderr)) - - add_tests("gvar", - "Ruby" => "$x", - "RawParseTree" => [:gvar, :$x], - "ParseTree" => s(:gvar, :$x)) - - add_tests("gvar_underscore", - "Ruby" => "$_", - "RawParseTree" => [:gvar, :$_], - "ParseTree" => s(:gvar, :$_)) - - add_tests("gvar_underscore_blah", - "Ruby" => "$__blah", - "RawParseTree" => [:gvar, :$__blah], - "ParseTree" => s(:gvar, :$__blah)) - - add_tests("hash", - "Ruby" => "{ 1 => 2, 3 => 4 }", - "RawParseTree" => [:hash, - [:lit, 1], [:lit, 2], - [:lit, 3], [:lit, 4]], - "ParseTree" => s(:hash, - s(:lit, 1), s(:lit, 2), - s(:lit, 3), s(:lit, 4))) - - add_tests("hash_rescue", - "Ruby" => "{ 1 => (2 rescue 3) }", - "RawParseTree" => [:hash, - [:lit, 1], - [:rescue, - [:lit, 2], - [:resbody, nil, [:lit, 3]]]], - "ParseTree" => s(:hash, - s(:lit, 1), - s(:rescue, - s(:lit, 2), - s(:resbody, s(:array), s(:lit, 3))))) - - add_tests("iasgn", - "Ruby" => "@a = 4", - "RawParseTree" => [:iasgn, :@a, [:lit, 4]], - "ParseTree" => s(:iasgn, :@a, s(:lit, 4))) - - add_tests("if_block_condition", - "Ruby" => "if (x = 5\n(x + 1)) then\n nil\nend", - "RawParseTree" => [:if, - [:block, - [:lasgn, :x, [:lit, 5]], - [:call, - [:lvar, :x], - :+, - [:array, [:lit, 1]]]], - [:nil], - nil], - "ParseTree" => s(:if, - s(:block, - s(:lasgn, :x, s(:lit, 5)), - s(:call, - s(:lvar, :x), - :+, - s(:arglist, s(:lit, 1)))), - s(:nil), - nil)) - - add_tests("if_lasgn_short", - "Ruby" => "if x = obj.x then\n x.do_it\nend", - "RawParseTree" => [:if, - [:lasgn, :x, - [:call, [:vcall, :obj], :x]], - [:call, - [:lvar, :x], :do_it], - nil], - "ParseTree" => s(:if, - s(:lasgn, :x, - s(:call, - s(:call, nil, :obj, s(:arglist)), - :x, s(:arglist))), - s(:call, s(:lvar, :x), :do_it, s(:arglist)), - nil)) - - add_tests("if_nested", - "Ruby" => "return if false unless true", - "RawParseTree" => [:if, [:true], nil, - [:if, [:false], [:return], nil]], - "ParseTree" => s(:if, s(:true), nil, - s(:if, s(:false), s(:return), nil))) - - add_tests("if_post", - "Ruby" => "a if b", - "RawParseTree" => [:if, [:vcall, :b], [:vcall, :a], nil], - "ParseTree" => s(:if, s(:call, nil, :b, s(:arglist)), - s(:call, nil, :a, s(:arglist)), nil)) - - add_tests("if_post_not", - "Ruby" => "a if not b", - "RawParseTree" => [:if, [:vcall, :b], nil, [:vcall, :a]], - "ParseTree" => s(:if, s(:call, nil, :b, s(:arglist)), nil, - s(:call, nil, :a, s(:arglist))), - "Ruby2Ruby" => "a unless b") - - add_tests("if_pre", - "Ruby" => "if b then a end", - "RawParseTree" => [:if, [:vcall, :b], [:vcall, :a], nil], - "ParseTree" => s(:if, s(:call, nil, :b, s(:arglist)), - s(:call, nil, :a, s(:arglist)), nil), - "Ruby2Ruby" => "a if b") - - add_tests("if_pre_not", - "Ruby" => "if not b then a end", - "RawParseTree" => [:if, [:vcall, :b], nil, [:vcall, :a]], - "ParseTree" => s(:if, s(:call, nil, :b, s(:arglist)), nil, - s(:call, nil, :a, s(:arglist))), - "Ruby2Ruby" => "a unless b") - - add_tests("iter_call_arglist_space", - "Ruby" => "a (1) {|c|d}", - "RawParseTree" => [:iter, - [:fcall, :a, [:array, [:lit, 1]]], - [:dasgn_curr, :c], - [:vcall, :d]], - "ParseTree" => s(:iter, - s(:call, nil, :a, s(:arglist, s(:lit, 1))), - s(:lasgn, :c), - s(:call, nil, :d, s(:arglist))), - "Ruby2Ruby" => "a(1) { |c| d }") - - add_tests("iter_dasgn_curr_dasgn_madness", - "Ruby" => "as.each { |a|\n b += a.b(false) }", - "RawParseTree" => [:iter, - [:call, [:vcall, :as], :each], - [:dasgn_curr, :a], - [:dasgn_curr, - :b, - [:call, - [:dvar, :b], - :+, - [:array, - [:call, [:dvar, :a], :b, - [:array, [:false]]]]]]], - "ParseTree" => s(:iter, - s(:call, - s(:call, nil, :as, s(:arglist)), - :each, s(:arglist)), - s(:lasgn, :a), - s(:lasgn, :b, - s(:call, - s(:lvar, :b), - :+, - s(:arglist, - s(:call, s(:lvar, :a), :b, - s(:arglist, s(:false))))))), - "Ruby2Ruby" => "as.each { |a| b = (b + a.b(false)) }") - - add_tests("iter_downto", - "Ruby" => "3.downto(1) { |n| puts(n.to_s) }", - "RawParseTree" => [:iter, - [:call, [:lit, 3], :downto, [:array, [:lit, 1]]], - [:dasgn_curr, :n], - [:fcall, :puts, - [:array, [:call, [:dvar, :n], :to_s]]]], - "ParseTree" => s(:iter, - s(:call, s(:lit, 3), :downto, - s(:arglist, s(:lit, 1))), - s(:lasgn, :n), - s(:call, nil, :puts, - s(:arglist, - s(:call, s(:lvar, :n), - :to_s, s(:arglist)))))) - - add_tests("iter_each_lvar", - "Ruby" => "array = [1, 2, 3]\narray.each { |x| puts(x.to_s) }\n", - "RawParseTree" => [:block, - [:lasgn, :array, - [:array, [:lit, 1], [:lit, 2], [:lit, 3]]], - [:iter, - [:call, [:lvar, :array], :each], - [:dasgn_curr, :x], - [:fcall, :puts, - [:array, [:call, [:dvar, :x], :to_s]]]]], - "ParseTree" => s(:block, - s(:lasgn, :array, - s(:array, - s(:lit, 1), s(:lit, 2), s(:lit, 3))), - s(:iter, - s(:call, s(:lvar, :array), :each, - s(:arglist)), - s(:lasgn, :x), - s(:call, nil, :puts, - s(:arglist, s(:call, s(:lvar, :x), - :to_s, s(:arglist))))))) - - add_tests("iter_each_nested", - "Ruby" => "array1 = [1, 2, 3]\narray2 = [4, 5, 6, 7]\narray1.each do |x|\n array2.each do |y|\n puts(x.to_s)\n puts(y.to_s)\n end\nend\n", - "RawParseTree" => [:block, - [:lasgn, :array1, - [:array, [:lit, 1], [:lit, 2], [:lit, 3]]], - [:lasgn, :array2, - [:array, - [:lit, 4], [:lit, 5], [:lit, 6], [:lit, 7]]], - [:iter, - [:call, - [:lvar, :array1], :each], - [:dasgn_curr, :x], - [:iter, - [:call, - [:lvar, :array2], :each], - [:dasgn_curr, :y], - [:block, - [:fcall, :puts, - [:array, [:call, [:dvar, :x], :to_s]]], - [:fcall, :puts, - [:array, [:call, [:dvar, :y], :to_s]]]]]]], - "ParseTree" => s(:block, - s(:lasgn, :array1, - s(:array, - s(:lit, 1), s(:lit, 2), s(:lit, 3))), - s(:lasgn, :array2, - s(:array, - s(:lit, 4), s(:lit, 5), - s(:lit, 6), s(:lit, 7))), - s(:iter, - s(:call, - s(:lvar, :array1), :each, s(:arglist)), - s(:lasgn, :x), - s(:iter, - s(:call, - s(:lvar, :array2), :each, s(:arglist)), - s(:lasgn, :y), - s(:block, - s(:call, nil, :puts, - s(:arglist, - s(:call, s(:lvar, :x), - :to_s, s(:arglist)))), - s(:call, nil, :puts, - s(:arglist, - s(:call, s(:lvar, :y), - :to_s, s(:arglist))))))))) - - add_tests("iter_loop_empty", - "Ruby" => "loop { }", - "RawParseTree" => [:iter, [:fcall, :loop], nil], - "ParseTree" => s(:iter, s(:call, nil, :loop, s(:arglist)), nil)) - - add_tests("iter_masgn_2", - "Ruby" => "a { |b, c| p(c) }", - "RawParseTree" => [:iter, - [:fcall, :a], - [:masgn, - [:array, [:dasgn_curr, :b], [:dasgn_curr, :c]], - nil, nil], - [:fcall, :p, [:array, [:dvar, :c]]]], - "ParseTree" => s(:iter, - s(:call, nil, :a, s(:arglist)), - s(:masgn, - s(:array, s(:lasgn, :b), s(:lasgn, :c))), - s(:call, nil, :p, s(:arglist, s(:lvar, :c))))) - - add_tests("iter_masgn_args_splat", - "Ruby" => "a { |b, c, *d| p(c) }", - "RawParseTree" => [:iter, - [:fcall, :a], - [:masgn, - [:array, [:dasgn_curr, :b], [:dasgn_curr, :c]], - [:dasgn_curr, :d], nil], - [:fcall, :p, [:array, [:dvar, :c]]]], - "ParseTree" => s(:iter, - s(:call, nil, :a, s(:arglist)), - s(:masgn, - s(:array, - s(:lasgn, :b), - s(:lasgn, :c), - s(:splat, s(:lasgn, :d)))), - s(:call, nil, :p, s(:arglist, s(:lvar, :c))))) - - add_tests("iter_masgn_args_splat_no_name", - "Ruby" => "a { |b, c, *| p(c) }", - "RawParseTree" => [:iter, - [:fcall, :a], - [:masgn, - [:array, [:dasgn_curr, :b], [:dasgn_curr, :c]], - [:splat], nil], - [:fcall, :p, [:array, [:dvar, :c]]]], - "ParseTree" => s(:iter, - s(:call, nil, :a, s(:arglist)), - s(:masgn, - s(:array, - s(:lasgn, :b), - s(:lasgn, :c), - s(:splat))), - s(:call, nil, :p, s(:arglist, s(:lvar, :c))))) - - add_tests("iter_masgn_splat", - "Ruby" => "a { |*c| p(c) }", - "RawParseTree" => [:iter, - [:fcall, :a], - [:masgn, nil, [:dasgn_curr, :c], nil], - [:fcall, :p, [:array, [:dvar, :c]]]], - "ParseTree" => s(:iter, - s(:call, nil, :a, s(:arglist)), - s(:masgn, s(:array, s(:splat, s(:lasgn, :c)))), - s(:call, nil, :p, s(:arglist, s(:lvar, :c))))) - - add_tests("iter_masgn_splat_no_name", - "Ruby" => "a { |*| p(c) }", - "RawParseTree" => [:iter, - [:fcall, :a], - [:masgn, nil, [:splat], nil], - [:fcall, :p, [:array, [:vcall, :c]]]], - "ParseTree" => s(:iter, - s(:call, nil, :a, s(:arglist)), - s(:masgn, s(:array, s(:splat))), - s(:call, nil, :p, - s(:arglist, s(:call, nil, :c, s(:arglist)))))) - - add_tests("iter_shadowed_var", - "Ruby" => "a do |x|\n b do |x|\n puts x\n end\nend", - "RawParseTree" => [:iter, - [:fcall, :a], - [:dasgn_curr, :x], - [:iter, - [:fcall, :b], - [:dasgn, :x], - [:fcall, :puts, [:array, [:dvar, :x]]]]], - "ParseTree" => s(:iter, - s(:call, nil, :a, s(:arglist)), - s(:lasgn, :x), - s(:iter, - s(:call, nil, :b, s(:arglist)), - s(:lasgn, :x), - s(:call, nil, :puts, - s(:arglist, s(:lvar, :x))))), - "Ruby2Ruby" => "a { |x| b { |x| puts(x) } }") - - add_tests("iter_upto", - "Ruby" => "1.upto(3) { |n| puts(n.to_s) }", - "RawParseTree" => [:iter, - [:call, [:lit, 1], :upto, [:array, [:lit, 3]]], - [:dasgn_curr, :n], - [:fcall, :puts, - [:array, [:call, [:dvar, :n], :to_s]]]], - "ParseTree" => s(:iter, - s(:call, s(:lit, 1), :upto, - s(:arglist, s(:lit, 3))), - s(:lasgn, :n), - s(:call, nil, :puts, - s(:arglist, - s(:call, s(:lvar, :n), :to_s, - s(:arglist)))))) - - add_tests("iter_while", - "Ruby" => "argl = 10\nwhile (argl >= 1) do\n puts(\"hello\")\n argl = (argl - 1)\nend\n", - "RawParseTree" => [:block, - [:lasgn, :argl, [:lit, 10]], - [:while, - [:call, [:lvar, :argl], :">=", - [:array, [:lit, 1]]], - [:block, - [:fcall, :puts, [:array, [:str, "hello"]]], - [:lasgn, - :argl, - [:call, [:lvar, :argl], - :"-", [:array, [:lit, 1]]]]], true]], - "ParseTree" => s(:block, - s(:lasgn, :argl, s(:lit, 10)), - s(:while, - s(:call, s(:lvar, :argl), :">=", - s(:arglist, s(:lit, 1))), - s(:block, - s(:call, nil, :puts, - s(:arglist, s(:str, "hello"))), - s(:lasgn, - :argl, - s(:call, s(:lvar, :argl), :"-", - s(:arglist, s(:lit, 1))))), true))) - - add_tests("ivar", - "Ruby" => [Examples, :reader], - "RawParseTree" => [:defn, :reader, [:ivar, :@reader]], - "ParseTree" => s(:defn, :reader, # FIX should be unified? - s(:args), - s(:ivar, :@reader)), - "Ruby2Ruby" => "attr_reader :reader") - - add_tests("lasgn_array", - "Ruby" => "var = [\"foo\", \"bar\"]", - "RawParseTree" => [:lasgn, :var, - [:array, - [:str, "foo"], - [:str, "bar"]]], - "ParseTree" => s(:lasgn, :var, - s(:array, - s(:str, "foo"), - s(:str, "bar")))) - - add_tests("lasgn_call", - "Ruby" => "c = (2 + 3)", - "RawParseTree" => [:lasgn, :c, [:call, [:lit, 2], :+, - [:array, [:lit, 3]]]], - "ParseTree" => s(:lasgn, :c, s(:call, s(:lit, 2), :+, - s(:arglist, s(:lit, 3))))) - - add_tests("lit_bool_false", - "Ruby" => "false", - "RawParseTree" => [:false], - "ParseTree" => s(:false)) - - add_tests("lit_bool_true", - "Ruby" => "true", - "RawParseTree" => [:true], - "ParseTree" => s(:true)) - - add_tests("lit_float", - "Ruby" => "1.1", - "RawParseTree" => [:lit, 1.1], - "ParseTree" => s(:lit, 1.1)) - - add_tests("lit_long", - "Ruby" => "1", - "RawParseTree" => [:lit, 1], - "ParseTree" => s(:lit, 1)) - - add_tests("lit_long_negative", - "Ruby" => "-1", - "RawParseTree" => [:lit, -1], - "ParseTree" => s(:lit, -1)) - - add_tests("lit_range2", - "Ruby" => "(1..10)", - "RawParseTree" => [:lit, 1..10], - "ParseTree" => s(:lit, 1..10)) - - add_tests("lit_range3", - "Ruby" => "(1...10)", - "RawParseTree" => [:lit, 1...10], - "ParseTree" => s(:lit, 1...10)) - -# TODO: discuss and decide which lit we like -# it "converts a regexp to an sexp" do -# "/blah/".to_sexp.should == s(:regex, "blah", 0) -# "/blah/i".to_sexp.should == s(:regex, "blah", 1) -# "/blah/u".to_sexp.should == s(:regex, "blah", 64) -# end - - add_tests("lit_regexp", - "Ruby" => "/x/", - "RawParseTree" => [:lit, /x/], - "ParseTree" => s(:lit, /x/)) - - add_tests("lit_regexp_i_wwtt", - "Ruby" => 'str.split(//i)', - "RawParseTree" => [:call, [:vcall, :str], :split, - [:array, [:lit, //i]]], - "ParseTree" => s(:call, s(:call, nil, :str, s(:arglist)), :split, - s(:arglist, s(:lit, //i)))) - - add_tests("lit_regexp_n", - "Ruby" => "/x/n", # HACK differs on 1.9 - this is easiest - "RawParseTree" => [:lit, /x/n], - "ParseTree" => s(:lit, /x/n), - "Ruby2Ruby" => /x/n.inspect) - - add_tests("lit_regexp_once", - "Ruby" => "/x/o", - "RawParseTree" => [:lit, /x/], - "ParseTree" => s(:lit, /x/), - "Ruby2Ruby" => "/x/") - - add_tests("lit_sym", - "Ruby" => ":x", - "RawParseTree" => [:lit, :x], - "ParseTree" => s(:lit, :x)) - - add_tests("lit_sym_splat", - "Ruby" => ":\"*args\"", - "RawParseTree" => [:lit, :"*args"], - "ParseTree" => s(:lit, :"*args")) - - add_tests("lvar_def_boundary", - "Ruby" => "b = 42\ndef a\n c do\n begin\n do_stuff\n rescue RuntimeError => b\n puts(b)\n end\n end\nend\n", - "RawParseTree" => [:block, - [:lasgn, :b, [:lit, 42]], - [:defn, :a, - [:scope, - [:block, - [:args], - [:iter, - [:fcall, :c], - nil, - [:rescue, - [:vcall, :do_stuff], - [:resbody, - [:array, [:const, :RuntimeError]], - [:block, - [:dasgn_curr, :b, [:gvar, :$!]], - [:fcall, :puts, - [:array, [:dvar, :b]]]]]]]]]]], - "ParseTree" => s(:block, - s(:lasgn, :b, s(:lit, 42)), - s(:defn, :a, - s(:args), - s(:scope, - s(:block, - s(:iter, - s(:call, nil, :c, s(:arglist)), - nil, - s(:rescue, - s(:call, nil, :do_stuff, s(:arglist)), - s(:resbody, - s(:array, - s(:const, :RuntimeError), - s(:lasgn, :b, s(:gvar, :$!))), - s(:call, nil, :puts, - s(:arglist, - s(:lvar, :b))))))))))) - - add_tests("masgn", - "Ruby" => "a, b = c, d", - "RawParseTree" => [:masgn, - [:array, [:lasgn, :a], [:lasgn, :b]], nil, - [:array, [:vcall, :c], [:vcall, :d]]], - "ParseTree" => s(:masgn, - s(:array, s(:lasgn, :a), s(:lasgn, :b)), - s(:array, s(:call, nil, :c, s(:arglist)), - s(:call, nil, :d, s(:arglist))))) - - add_tests("masgn_argscat", - "Ruby" => "a, b, *c = 1, 2, *[3, 4]", - "RawParseTree" => [:masgn, - [:array, [:lasgn, :a], [:lasgn, :b]], - [:lasgn, :c], - [:argscat, - [:array, [:lit, 1], [:lit, 2]], - [:array, [:lit, 3], [:lit, 4]]]], - "ParseTree" => s(:masgn, - s(:array, - s(:lasgn, :a), - s(:lasgn, :b), - s(:splat, s(:lasgn, :c))), - s(:array, - s(:lit, 1), s(:lit, 2), - s(:splat, - s(:array, s(:lit, 3), s(:lit, 4)))))) - - add_tests("masgn_attrasgn", - "Ruby" => "a, b.c = d, e", - "RawParseTree" => [:masgn, - [:array, [:lasgn, :a], - [:attrasgn, [:vcall, :b], :c=]], nil, - [:array, [:vcall, :d], [:vcall, :e]]], - "ParseTree" => s(:masgn, - s(:array, - s(:lasgn, :a), - s(:attrasgn, - s(:call, nil, :b, s(:arglist)), - :c=, s(:arglist))), - s(:array, - s(:call, nil, :d, s(:arglist)), - s(:call, nil, :e, s(:arglist))))) - - add_tests("masgn_attrasgn_array_rhs", - "Ruby" => "a.b, a.c, _ = q", - "RawParseTree" => [:masgn, - [:array, - [:attrasgn, [:vcall, :a], :b=], - [:attrasgn, [:vcall, :a], :c=], - [:lasgn, :_]], nil, - [:to_ary, [:vcall, :q]]], - "ParseTree" => s(:masgn, - s(:array, - s(:attrasgn, - s(:call, nil, :a, s(:arglist)), - :b=, s(:arglist)), - s(:attrasgn, - s(:call, nil, :a, s(:arglist)), - :c=, s(:arglist)), - s(:lasgn, :_)), - s(:to_ary, - s(:call, nil, :q, s(:arglist))))) - - add_tests("masgn_attrasgn_idx", - "Ruby" => "a, i, j = [], 1, 2\na[i], a[j] = a[j], a[i]\n", - "RawParseTree" => [:block, - [:masgn, - [:array, - [:lasgn, :a], [:lasgn, :i], [:lasgn, :j]], nil, - [:array, [:zarray], [:lit, 1], [:lit, 2]]], - [:masgn, - [:array, - [:attrasgn, - [:lvar, :a], :[]=, [:array, [:lvar, :i]]], - [:attrasgn, - [:lvar, :a], :[]=, [:array, [:lvar, :j]]]], - nil, - [:array, - [:call, [:lvar, :a], :[], - [:array, [:lvar, :j]]], - [:call, [:lvar, :a], :[], - [:array, [:lvar, :i]]]]]], - "ParseTree" => s(:block, - s(:masgn, - s(:array, - s(:lasgn, :a), - s(:lasgn, :i), s(:lasgn, :j)), - s(:array, s(:array), s(:lit, 1), s(:lit, 2))), - s(:masgn, - s(:array, - s(:attrasgn, s(:lvar, :a), :[]=, - s(:arglist, s(:lvar, :i))), - s(:attrasgn, s(:lvar, :a), :[]=, - s(:arglist, s(:lvar, :j)))), - s(:array, - s(:call, s(:lvar, :a), :[], - s(:arglist, s(:lvar, :j))), - s(:call, s(:lvar, :a), :[], - s(:arglist, s(:lvar, :i))))))) - - add_tests("masgn_cdecl", - "Ruby" => "A, B, C = 1, 2, 3", - "RawParseTree" => [:masgn, - [:array, [:cdecl, :A], [:cdecl, :B], - [:cdecl, :C]], nil, - [:array, [:lit, 1], [:lit, 2], [:lit, 3]]], - "ParseTree" => s(:masgn, - s(:array, s(:cdecl, :A), s(:cdecl, :B), - s(:cdecl, :C)), - s(:array, s(:lit, 1), s(:lit, 2), s(:lit, 3)))) - - - add_tests("masgn_iasgn", - "Ruby" => "a, @b = c, d", - "RawParseTree" => [:masgn, - [:array, [:lasgn, :a], [:iasgn, :"@b"]], nil, - [:array, [:vcall, :c], [:vcall, :d]]], - "ParseTree" => s(:masgn, - s(:array, s(:lasgn, :a), s(:iasgn, :"@b")), - s(:array, - s(:call, nil, :c, s(:arglist)), - s(:call, nil, :d, s(:arglist))))) - - add_tests("masgn_masgn", - "Ruby" => "a, (b, c) = [1, [2, 3]]", - "RawParseTree" => [:masgn, - [:array, - [:lasgn, :a], - [:masgn, - [:array, - [:lasgn, :b], - [:lasgn, :c]], nil, nil]], - nil, - [:to_ary, - [:array, - [:lit, 1], - [:array, - [:lit, 2], - [:lit, 3]]]]], - "ParseTree" => s(:masgn, - s(:array, - s(:lasgn, :a), - s(:masgn, - s(:array, - s(:lasgn, :b), - s(:lasgn, :c)))), - s(:to_ary, - s(:array, - s(:lit, 1), - s(:array, - s(:lit, 2), - s(:lit, 3)))))) - - add_tests("masgn_splat_lhs", - "Ruby" => "a, b, *c = d, e, f, g", - "RawParseTree" => [:masgn, - [:array, [:lasgn, :a], [:lasgn, :b]], - [:lasgn, :c], - [:array, - [:vcall, :d], [:vcall, :e], - [:vcall, :f], [:vcall, :g]]], - "ParseTree" => s(:masgn, - s(:array, - s(:lasgn, :a), - s(:lasgn, :b), - s(:splat, s(:lasgn, :c))), - s(:array, - s(:call, nil, :d, s(:arglist)), - s(:call, nil, :e, s(:arglist)), - s(:call, nil, :f, s(:arglist)), - s(:call, nil, :g, s(:arglist))))) - - add_tests("masgn_splat_rhs_1", - "Ruby" => "a, b = *c", - "RawParseTree" => [:masgn, - [:array, [:lasgn, :a], [:lasgn, :b]], - nil, - [:splat, [:vcall, :c]]], - "ParseTree" => s(:masgn, - s(:array, - s(:lasgn, :a), - s(:lasgn, :b)), - s(:splat, s(:call, nil, :c, s(:arglist))))) - - add_tests("masgn_splat_rhs_n", - "Ruby" => "a, b = c, d, *e", - "RawParseTree" => [:masgn, - [:array, [:lasgn, :a], [:lasgn, :b]], - nil, - [:argscat, - [:array, [:vcall, :c], [:vcall, :d]], - [:vcall, :e]]], - "ParseTree" => s(:masgn, - s(:array, - s(:lasgn, :a), - s(:lasgn, :b)), - s(:array, - s(:call, nil, :c, s(:arglist)), - s(:call, nil, :d, s(:arglist)), - s(:splat, s(:call, nil, :e, s(:arglist)))))) - - add_tests("masgn_splat_no_name_to_ary", - "Ruby" => "a, b, * = c", - "RawParseTree" => [:masgn, - [:array, [:lasgn, :a], [:lasgn, :b]], - [:splat], - [:to_ary, [:vcall, :c]]], - "ParseTree" => s(:masgn, - s(:array, - s(:lasgn, :a), - s(:lasgn, :b), - s(:splat)), - s(:to_ary, s(:call, nil, :c, s(:arglist))))) - - add_tests("masgn_splat_no_name_trailing", - "Ruby" => "a, b, = c", - "RawParseTree" => [:masgn, - [:array, [:lasgn, :a], [:lasgn, :b]], nil, - [:to_ary, [:vcall, :c]]], - "ParseTree" => s(:masgn, - s(:array, s(:lasgn, :a), s(:lasgn, :b)), - s(:to_ary, s(:call, nil, :c, s(:arglist)))), - "Ruby2Ruby" => "a, b = c") # TODO: check this is right - - add_tests("masgn_splat_to_ary", - "Ruby" => "a, b, *c = d", - "RawParseTree" => [:masgn, - [:array, [:lasgn, :a], [:lasgn, :b]], - [:lasgn, :c], - [:to_ary, [:vcall, :d]]], - "ParseTree" => s(:masgn, - s(:array, - s(:lasgn, :a), - s(:lasgn, :b), - s(:splat, s(:lasgn, :c))), - s(:to_ary, s(:call, nil, :d, s(:arglist))))) - - add_tests("masgn_splat_to_ary2", - "Ruby" => "a, b, *c = d.e(\"f\")", - "RawParseTree" => [:masgn, - [:array, [:lasgn, :a], [:lasgn, :b]], - [:lasgn, :c], - [:to_ary, - [:call, [:vcall, :d], :e, - [:array, [:str, 'f']]]]], - "ParseTree" => s(:masgn, - s(:array, - s(:lasgn, :a), - s(:lasgn, :b), - s(:splat, s(:lasgn, :c))), - s(:to_ary, - s(:call, - s(:call, nil, :d, s(:arglist)), - :e, - s(:arglist, s(:str, 'f')))))) - - add_tests("match", - "Ruby" => "1 if /x/", - "RawParseTree" => [:if, [:match, [:lit, /x/]], [:lit, 1], nil], - "ParseTree" => s(:if, s(:match, s(:lit, /x/)), s(:lit, 1), nil)) - - add_tests("match2", - "Ruby" => "/x/ =~ \"blah\"", - "RawParseTree" => [:match2, [:lit, /x/], [:str, "blah"]], - "ParseTree" => s(:match2, s(:lit, /x/), s(:str, "blah"))) - - add_tests("match3", - "Ruby" => "\"blah\" =~ /x/", - "RawParseTree" => [:match3, [:lit, /x/], [:str, "blah"]], - "ParseTree" => s(:match3, s(:lit, /x/), s(:str, "blah"))) - - add_tests("module", - "Ruby" => "module X\n def y\n # do nothing\n end\nend", - "RawParseTree" => [:module, :X, - [:scope, - [:defn, :y, - [:scope, [:block, [:args], [:nil]]]]]], - "ParseTree" => s(:module, :X, - s(:scope, - s(:defn, :y, - s(:args), - s(:scope, s(:block, s(:nil))))))) - - add_tests("module_scoped", - "Ruby" => "module X::Y\n c\nend", - "RawParseTree" => [:module, [:colon2, [:const, :X], :Y], - [:scope, [:vcall, :c]]], - "ParseTree" => s(:module, s(:colon2, s(:const, :X), :Y), - s(:scope, s(:call, nil, :c, s(:arglist))))) - - add_tests("module_scoped3", - "Ruby" => "module ::Y\n c\nend", - "RawParseTree" => [:module, [:colon3, :Y], [:scope, [:vcall, :c]]], - "ParseTree" => s(:module, - s(:colon3, :Y), - s(:scope, s(:call, nil, :c, s(:arglist))))) - - add_tests("next", - "Ruby" => "loop { next if false }", - "RawParseTree" => [:iter, - [:fcall, :loop], - nil, - [:if, [:false], [:next], nil]], - "ParseTree" => s(:iter, - s(:call, nil, :loop, s(:arglist)), - nil, - s(:if, s(:false), s(:next), nil))) - - add_tests("next_arg", - "Ruby" => "loop { next 42 if false }", - "RawParseTree" => [:iter, - [:fcall, :loop], - nil, - [:if, [:false], [:next, [:lit, 42]], nil]], - "ParseTree" => s(:iter, - s(:call, nil, :loop, s(:arglist)), - nil, - s(:if, s(:false), s(:next, s(:lit, 42)), nil))) - - add_tests("not", - "Ruby" => "(not true)", - "RawParseTree" => [:not, [:true]], - "ParseTree" => s(:not, s(:true))) - - add_tests("nth_ref", - "Ruby" => "$1", - "RawParseTree" => [:nth_ref, 1], - "ParseTree" => s(:nth_ref, 1)) - - add_tests("op_asgn1", - "Ruby" => "b = []\nb[1] ||= 10\nb[2] &&= 11\nb[3] += 12\n", - "RawParseTree" => [:block, - [:lasgn, :b, [:zarray]], - [:op_asgn1, [:lvar, :b], - [:array, [:lit, 1]], :"||", [:lit, 10]], - [:op_asgn1, [:lvar, :b], - [:array, [:lit, 2]], :"&&", [:lit, 11]], - [:op_asgn1, [:lvar, :b], - [:array, [:lit, 3]], :+, [:lit, 12]]], - "ParseTree" => s(:block, - s(:lasgn, :b, s(:array)), - s(:op_asgn1, s(:lvar, :b), - s(:arglist, s(:lit, 1)), :"||", s(:lit, 10)), - s(:op_asgn1, s(:lvar, :b), - s(:arglist, s(:lit, 2)), :"&&", s(:lit, 11)), - s(:op_asgn1, s(:lvar, :b), - s(:arglist, s(:lit, 3)), :+, s(:lit, 12)))) - - add_tests("op_asgn1_ivar", - "Ruby" => "@b = []\n@b[1] ||= 10\n@b[2] &&= 11\n@b[3] += 12\n", - "RawParseTree" => [:block, - [:iasgn, :@b, [:zarray]], - [:op_asgn1, [:ivar, :@b], - [:array, [:lit, 1]], :"||", [:lit, 10]], - [:op_asgn1, [:ivar, :@b], - [:array, [:lit, 2]], :"&&", [:lit, 11]], - [:op_asgn1, [:ivar, :@b], - [:array, [:lit, 3]], :+, [:lit, 12]]], - "ParseTree" => s(:block, - s(:iasgn, :@b, s(:array)), - s(:op_asgn1, s(:ivar, :@b), - s(:arglist, s(:lit, 1)), :"||", s(:lit, 10)), - s(:op_asgn1, s(:ivar, :@b), - s(:arglist, s(:lit, 2)), :"&&", s(:lit, 11)), - s(:op_asgn1, s(:ivar, :@b), - s(:arglist, s(:lit, 3)), :+, s(:lit, 12)))) - - add_tests("op_asgn2", - "Ruby" => "s = Struct.new(:var)\nc = s.new(nil)\nc.var ||= 20\nc.var &&= 21\nc.var += 22\nc.d.e.f ||= 42\n", - "RawParseTree" => [:block, - [:lasgn, :s, - [:call, [:const, :Struct], - :new, [:array, [:lit, :var]]]], - [:lasgn, :c, - [:call, [:lvar, :s], :new, [:array, [:nil]]]], - - [:op_asgn2, [:lvar, :c], :var=, :"||", - [:lit, 20]], - [:op_asgn2, [:lvar, :c], :var=, :"&&", - [:lit, 21]], - [:op_asgn2, [:lvar, :c], :var=, :+, [:lit, 22]], - - [:op_asgn2, - [:call, - [:call, [:lvar, :c], :d], :e], :f=, :"||", - [:lit, 42]]], - "ParseTree" => s(:block, - s(:lasgn, :s, - s(:call, s(:const, :Struct), - :new, s(:arglist, s(:lit, :var)))), - s(:lasgn, :c, - s(:call, s(:lvar, :s), - :new, s(:arglist, s(:nil)))), - s(:op_asgn2, s(:lvar, :c), - :var=, :"||", s(:lit, 20)), - s(:op_asgn2, s(:lvar, :c), - :var=, :"&&", s(:lit, 21)), - s(:op_asgn2, s(:lvar, :c), - :var=, :+, s(:lit, 22)), - s(:op_asgn2, - s(:call, - s(:call, s(:lvar, :c), :d, s(:arglist)), - :e, s(:arglist)), - :f=, :"||", s(:lit, 42)))) - - add_tests("op_asgn2_self", - "Ruby" => "self.Bag ||= Bag.new", - "RawParseTree" => [:op_asgn2, [:self], :"Bag=", :"||", - [:call, [:const, :Bag], :new]], - "ParseTree" => s(:op_asgn2, s(:self), :"Bag=", :"||", - s(:call, s(:const, :Bag), :new, s(:arglist)))) - - add_tests("op_asgn_and", - "Ruby" => "a = 0\na &&= 2\n", - "RawParseTree" => [:block, - [:lasgn, :a, [:lit, 0]], - [:op_asgn_and, - [:lvar, :a], [:lasgn, :a, [:lit, 2]]]], - "ParseTree" => s(:block, - s(:lasgn, :a, s(:lit, 0)), - s(:op_asgn_and, - s(:lvar, :a), s(:lasgn, :a, s(:lit, 2))))) - - add_tests("op_asgn_and_ivar2", - "Ruby" => "@fetcher &&= new(Gem.configuration[:http_proxy])", - "RawParseTree" => [:op_asgn_and, - [:ivar, :@fetcher], - [:iasgn, - :@fetcher, - [:fcall, - :new, - [:array, - [:call, - [:call, [:const, :Gem], :configuration], - :[], - [:array, [:lit, :http_proxy]]]]]]], - "ParseTree" => s(:op_asgn_and, - s(:ivar, :@fetcher), - s(:iasgn, - :@fetcher, - s(:call, nil, - :new, - s(:arglist, - s(:call, - s(:call, s(:const, :Gem), - :configuration, - s(:arglist)), - :[], - s(:arglist, s(:lit, :http_proxy)))))))) - - add_tests("op_asgn_or", - "Ruby" => "a = 0\na ||= 1\n", - "RawParseTree" => [:block, - [:lasgn, :a, [:lit, 0]], - [:op_asgn_or, - [:lvar, :a], [:lasgn, :a, [:lit, 1]]]], - "ParseTree" => s(:block, - s(:lasgn, :a, s(:lit, 0)), - s(:op_asgn_or, - s(:lvar, :a), s(:lasgn, :a, s(:lit, 1))))) - - add_tests("op_asgn_or_block", - "Ruby" => "a ||= begin\n b\n rescue\n c\n end", - "RawParseTree" => [:op_asgn_or, - [:lvar, :a], - [:lasgn, :a, - [:rescue, - [:vcall, :b], - [:resbody, nil, [:vcall, :c]]]]], - "ParseTree" => s(:op_asgn_or, - s(:lvar, :a), - s(:lasgn, :a, - s(:rescue, - s(:call, nil, :b, s(:arglist)), - s(:resbody, s(:array), - s(:call, nil, :c, s(:arglist)))))), - "Ruby2Ruby" => "a ||= b rescue c") - - add_tests("op_asgn_or_ivar", - "Ruby" => "@v ||= { }", - "RawParseTree" => [:op_asgn_or, - [:ivar, :@v], - [:iasgn, :@v, [:hash]]], - "ParseTree" => s(:op_asgn_or, - s(:ivar, :@v), - s(:iasgn, :@v, s(:hash)))) - - add_tests("op_asgn_or_ivar2", - "Ruby" => "@fetcher ||= new(Gem.configuration[:http_proxy])", - "RawParseTree" => [:op_asgn_or, - [:ivar, :@fetcher], - [:iasgn, - :@fetcher, - [:fcall, - :new, - [:array, - [:call, - [:call, [:const, :Gem], :configuration], - :[], - [:array, [:lit, :http_proxy]]]]]]], - "ParseTree" => s(:op_asgn_or, - s(:ivar, :@fetcher), - s(:iasgn, - :@fetcher, - s(:call, nil, :new, - s(:arglist, - s(:call, - s(:call, s(:const, :Gem), - :configuration, - s(:arglist)), - :[], - s(:arglist, s(:lit, :http_proxy)))))))) - - add_tests("or", - "Ruby" => "(a or b)", - "RawParseTree" => [:or, [:vcall, :a], [:vcall, :b]], - "ParseTree" => s(:or, - s(:call, nil, :a, s(:arglist)), - s(:call, nil, :b, s(:arglist)))) - - add_tests("or_big", - "Ruby" => "((a or b) or (c and d))", - "RawParseTree" => [:or, - [:or, [:vcall, :a], [:vcall, :b]], - [:and, [:vcall, :c], [:vcall, :d]]], - "ParseTree" => s(:or, - s(:or, - s(:call, nil, :a, s(:arglist)), - s(:call, nil, :b, s(:arglist))), - s(:and, - s(:call, nil, :c, s(:arglist)), - s(:call, nil, :d, s(:arglist))))) - - add_tests("or_big2", - "Ruby" => "((a || b) || (c && d))", - "RawParseTree" => [:or, - [:or, [:vcall, :a], [:vcall, :b]], - [:and, [:vcall, :c], [:vcall, :d]]], - "ParseTree" => s(:or, - s(:or, - s(:call, nil, :a, s(:arglist)), - s(:call, nil, :b, s(:arglist))), - s(:and, - s(:call, nil, :c, s(:arglist)), - s(:call, nil, :d, s(:arglist)))), - "Ruby2Ruby" => "((a or b) or (c and d))") - - add_tests("parse_floats_as_args", - "Ruby" => "def x(a=0.0,b=0.0)\n a+b\nend", - "RawParseTree" => [:defn, :x, - [:scope, - [:block, - [:args, :a, :b, - [:block, - [:lasgn, :a, [:lit, 0.0]], - [:lasgn, :b, [:lit, 0.0]]]], - [:call, [:lvar, :a], :+, - [:array, [:lvar, :b]]]]]], - "ParseTree" => s(:defn, :x, - s(:args, :a, :b, - s(:block, - s(:lasgn, :a, s(:lit, 0.0)), - s(:lasgn, :b, s(:lit, 0.0)))), - s(:scope, - s(:block, - s(:call, s(:lvar, :a), :+, - s(:arglist, s(:lvar, :b)))))), - "Ruby2Ruby" => "def x(a = 0.0, b = 0.0)\n (a + b)\nend") - - add_tests("postexe", - "Ruby" => "END { 1 }", - "RawParseTree" => [:iter, [:postexe], nil, [:lit, 1]], - "ParseTree" => s(:iter, s(:postexe), nil, s(:lit, 1))) - - add_tests("proc_args_0", - "Ruby" => "proc { || (x + 1) }", - "RawParseTree" => [:iter, - [:fcall, :proc], - 0, - [:call, [:vcall, :x], :+, [:array, [:lit, 1]]]], - "ParseTree" => s(:iter, - s(:call, nil, :proc, s(:arglist)), - 0, - s(:call, - s(:call, nil, :x, s(:arglist)), - :+, - s(:arglist, s(:lit, 1))))) - - add_tests("proc_args_1", - "Ruby" => "proc { |x| (x + 1) }", - "RawParseTree" => [:iter, - [:fcall, :proc], - [:dasgn_curr, :x], - [:call, [:dvar, :x], :+, [:array, [:lit, 1]]]], - "ParseTree" => s(:iter, - s(:call, nil, :proc, s(:arglist)), - s(:lasgn, :x), - s(:call, s(:lvar, :x), :+, - s(:arglist, s(:lit, 1))))) - - add_tests("proc_args_2", - "Ruby" => "proc { |x, y| (x + y) }", - "RawParseTree" => [:iter, - [:fcall, :proc], - [:masgn, [:array, - [:dasgn_curr, :x], - [:dasgn_curr, :y]], nil, nil], - [:call, [:dvar, :x], :+, [:array, [:dvar, :y]]]], - "ParseTree" => s(:iter, - s(:call, nil, :proc, s(:arglist)), - s(:masgn, - s(:array, - s(:lasgn, :x), - s(:lasgn, :y))), - s(:call, s(:lvar, :x), :+, - s(:arglist, s(:lvar, :y))))) - - add_tests("proc_args_no", - "Ruby" => "proc { (x + 1) }", - "RawParseTree" => [:iter, - [:fcall, :proc], - nil, - [:call, [:vcall, :x], :+, [:array, [:lit, 1]]]], - "ParseTree" => s(:iter, - s(:call, nil, :proc, s(:arglist)), - nil, - s(:call, s(:call, nil, :x, s(:arglist)), - :+, s(:arglist, s(:lit, 1))))) - - add_tests("redo", - "Ruby" => "loop { redo if false }", - "RawParseTree" => [:iter, - [:fcall, :loop], nil, - [:if, [:false], [:redo], nil]], - "ParseTree" => s(:iter, - s(:call, nil, :loop, s(:arglist)), - nil, - s(:if, s(:false), s(:redo), nil))) - - # TODO: need a resbody w/ multiple classes and a splat - - add_tests("rescue", - "Ruby" => "blah rescue nil", - "RawParseTree" => [:rescue, - [:vcall, :blah], [:resbody, nil, [:nil]]], - "ParseTree" => s(:rescue, - s(:call, nil, :blah, s(:arglist)), - s(:resbody, s(:array), s(:nil)))) - - add_tests("rescue_block_body", - "Ruby" => "begin\n a\nrescue => e\n c\n d\nend", - "RawParseTree" => [:rescue, - [:vcall, :a], - [:resbody, nil, - [:block, - [:lasgn, :e, [:gvar, :$!]], - [:vcall, :c], - [:vcall, :d]]]], - "ParseTree" => s(:rescue, - s(:call, nil, :a, s(:arglist)), - s(:resbody, - s(:array, s(:lasgn, :e, s(:gvar, :$!))), - s(:block, - s(:call, nil, :c, s(:arglist)), - s(:call, nil, :d, s(:arglist)))))) - - add_tests("rescue_block_body_3", - "Ruby" => "begin\n a\nrescue A\n b\nrescue B\n c\nrescue C\n d\nend", - "RawParseTree" => [:rescue, - [:vcall, :a], - [:resbody, [:array, [:const, :A]], - [:vcall, :b], - [:resbody, [:array, [:const, :B]], - [:vcall, :c], - [:resbody, [:array, [:const, :C]], - [:vcall, :d]]]]], - "ParseTree" => s(:rescue, - s(:call, nil, :a, s(:arglist)), - s(:resbody, s(:array, s(:const, :A)), - s(:call, nil, :b, s(:arglist))), - s(:resbody, s(:array, s(:const, :B)), - s(:call, nil, :c, s(:arglist))), - s(:resbody, s(:array, s(:const, :C)), - s(:call, nil, :d, s(:arglist))))) - - add_tests("rescue_block_body_ivar", - "Ruby" => "begin\n a\nrescue => @e\n c\n d\nend", - "RawParseTree" => [:rescue, - [:vcall, :a], - [:resbody, nil, - [:block, - [:iasgn, :@e, [:gvar, :$!]], - [:vcall, :c], - [:vcall, :d]]]], - "ParseTree" => s(:rescue, - s(:call, nil, :a, s(:arglist)), - s(:resbody, - s(:array, s(:iasgn, :@e, s(:gvar, :$!))), - s(:block, - s(:call, nil, :c, s(:arglist)), - s(:call, nil, :d, s(:arglist)))))) - - add_tests("rescue_block_nada", - "Ruby" => "begin\n blah\nrescue\n # do nothing\nend", - "RawParseTree" => [:rescue, [:vcall, :blah], [:resbody, nil]], - "ParseTree" => s(:rescue, - s(:call, nil, :blah, s(:arglist)), - s(:resbody, s(:array), nil))) - - add_tests("rescue_exceptions", - "Ruby" => "begin\n blah\nrescue RuntimeError => r\n # do nothing\nend", - "RawParseTree" => [:rescue, - [:vcall, :blah], - [:resbody, - [:array, [:const, :RuntimeError]], - [:lasgn, :r, [:gvar, :$!]]]], - "ParseTree" => s(:rescue, - s(:call, nil, :blah, s(:arglist)), - s(:resbody, - s(:array, - s(:const, :RuntimeError), - s(:lasgn, :r, s(:gvar, :$!))), - nil))) - - - add_tests("rescue_iasgn_var_empty", - "Ruby" => "begin\n 1\nrescue => @e\n # do nothing\nend", - "RawParseTree" => [:rescue, - [:lit, 1], - [:resbody, nil, [:iasgn, :@e, [:gvar, :$!]]]], - "ParseTree" => s(:rescue, - s(:lit, 1), - s(:resbody, - s(:array, s(:iasgn, :@e, s(:gvar, :$!))), - nil))) - - add_tests("rescue_lasgn", - "Ruby" => "begin\n 1\nrescue\n var = 2\nend", - "RawParseTree" => [:rescue, - [:lit, 1], - [:resbody, nil, [:lasgn, :var, [:lit, 2]]]], - "ParseTree" => s(:rescue, - s(:lit, 1), - s(:resbody, - s(:array), - s(:lasgn, :var, s(:lit, 2)))), - "Ruby2Ruby" => "1 rescue var = 2") - - add_tests("rescue_lasgn_var", - "Ruby" => "begin\n 1\nrescue => e\n var = 2\nend", - "RawParseTree" => [:rescue, - [:lit, 1], - [:resbody, nil, - [:block, - [:lasgn, :e, [:gvar, :$!]], - [:lasgn, :var, [:lit, 2]]]]], - "ParseTree" => s(:rescue, - s(:lit, 1), - s(:resbody, - s(:array, s(:lasgn, :e, s(:gvar, :$!))), - s(:lasgn, :var, s(:lit, 2))))) - - add_tests("rescue_lasgn_var_empty", - "Ruby" => "begin\n 1\nrescue => e\n # do nothing\nend", - "RawParseTree" => [:rescue, - [:lit, 1], - [:resbody, nil, [:lasgn, :e, [:gvar, :$!]]]], - "ParseTree" => s(:rescue, - s(:lit, 1), - s(:resbody, - s(:array, s(:lasgn, :e, s(:gvar, :$!))), - nil))) - - add_tests("retry", - "Ruby" => "retry", - "RawParseTree" => [:retry], - "ParseTree" => s(:retry)) - - add_tests("return_0", - "Ruby" => "return", - "RawParseTree" => [:return], - "ParseTree" => s(:return)) - - add_tests("return_1", - "Ruby" => "return 1", - "RawParseTree" => [:return, [:lit, 1]], - "ParseTree" => s(:return, s(:lit, 1))) - - add_tests("return_1_splatted", - "Ruby" => "return *1", - "RawParseTree" => [:return, [:svalue, [:splat, [:lit, 1]]]], - "ParseTree" => s(:return, s(:svalue, s(:splat, s(:lit, 1))))) - - add_tests("return_n", - "Ruby" => "return 1, 2, 3", - "RawParseTree" => [:return, [:array, - [:lit, 1], [:lit, 2], [:lit, 3]]], - "ParseTree" => s(:return, s(:array, - s(:lit, 1), s(:lit, 2), s(:lit, 3))), - "Ruby2Ruby" => "return [1, 2, 3]") - - add_tests("sclass", - "Ruby" => "class << self\n 42\nend", - "RawParseTree" => [:sclass, [:self], [:scope, [:lit, 42]]], - "ParseTree" => s(:sclass, s(:self), s(:scope, s(:lit, 42)))) - - add_tests("sclass_trailing_class", - "Ruby" => "class A\n class << self\n a\n end\n class B\n end\nend", - "RawParseTree" => [:class, :A, nil, - [:scope, - [:block, - [:sclass, [:self], [:scope, [:vcall, :a]]], - [:class, :B, nil, [:scope]]]]], - "ParseTree" => s(:class, :A, nil, - s(:scope, - s(:block, - s(:sclass, s(:self), - s(:scope, - s(:call, nil, :a, s(:arglist)))), - s(:class, :B, nil, s(:scope)))))) - - add_tests("splat", - "Ruby" => "def x(*b)\n a(*b)\nend", - "RawParseTree" => [:defn, :x, - [:scope, - [:block, - [:args, :"*b"], - [:fcall, :a, [:splat, [:lvar, :b]]]]]], - "ParseTree" => s(:defn, :x, - s(:args, :"*b"), - s(:scope, - s(:block, - s(:call, nil, :a, - s(:arglist, s(:splat, s(:lvar, :b)))))))) - - add_tests("splat_array", - "Ruby" => "[*[1]]", - "RawParseTree" => [:splat, [:array, [:lit, 1]]], - "ParseTree" => s(:array, s(:splat, s(:array, s(:lit, 1))))) - - add_tests("splat_break", - "Ruby" => "break *[1]", - "RawParseTree" => [:break, [:svalue, [:splat, [:array, [:lit, 1]]]]], - "ParseTree" => s(:break, s(:svalue, s(:splat, s(:array, s(:lit, 1)))))) - - add_tests("splat_break_array", - "Ruby" => "break [*[1]]", - "RawParseTree" => [:break, [:splat, [:array, [:lit, 1]]]], - "ParseTree" => s(:break, s(:array, s(:splat, s(:array, s(:lit, 1)))))) - - add_tests("splat_fcall", - "Ruby" => "meth(*[1])", - "RawParseTree" => [:fcall, :meth, - [:splat, [:array, [:lit, 1]]]], - "ParseTree" => s(:call, nil, :meth, - s(:arglist, s(:splat, s(:array, s(:lit, 1)))))) - - add_tests("splat_fcall_array", - "Ruby" => "meth([*[1]])", - "RawParseTree" => [:fcall, :meth, - [:array, [:splat, [:array, [:lit, 1]]]]], - "ParseTree" => s(:call, nil, :meth, - s(:arglist, - s(:array, s(:splat, s(:array, s(:lit, 1))))))) - - add_tests("splat_lasgn", - "Ruby" => "x = *[1]", - "RawParseTree" => [:lasgn, :x, [:svalue, [:splat, [:array, [:lit, 1]]]]], - "ParseTree" => s(:lasgn, :x, s(:svalue, s(:splat, s(:array, s(:lit, 1)))))) - - add_tests("splat_lasgn_array", - "Ruby" => "x = [*[1]]", - "RawParseTree" => [:lasgn, :x, [:splat, [:array, [:lit, 1]]]], - "ParseTree" => s(:lasgn, :x, s(:array, s(:splat, s(:array, s(:lit, 1)))))) - - add_tests("splat_lit_1", - "Ruby" => "[*1]", - "RawParseTree" => [:splat, [:lit, 1]], # UGH - damn MRI - "ParseTree" => s(:array, s(:splat, s(:lit, 1)))) - - add_tests("splat_lit_n", - "Ruby" => "[1, *2]", - "RawParseTree" => [:argscat, [:array, [:lit, 1]], [:lit, 2]], - "ParseTree" => s(:array, s(:lit, 1), s(:splat, s(:lit, 2)))) - - add_tests("splat_next", - "Ruby" => "next *[1]", - "RawParseTree" => [:next, [:svalue, [:splat, [:array, [:lit, 1]]]]], - "ParseTree" => s(:next, s(:svalue, s(:splat, s(:array, s(:lit, 1)))))) - - add_tests("splat_next_array", - "Ruby" => "next [*[1]]", - "RawParseTree" => [:next, [:splat, [:array, [:lit, 1]]]], - "ParseTree" => s(:next, s(:array, s(:splat, s(:array, s(:lit, 1)))))) - - add_tests("splat_return", - "Ruby" => "return *[1]", - "RawParseTree" => [:return, [:svalue, [:splat, [:array, [:lit, 1]]]]], - "ParseTree" => s(:return, s(:svalue, s(:splat, s(:array, s(:lit, 1)))))) - - add_tests("splat_return_array", - "Ruby" => "return [*[1]]", - "RawParseTree" => [:return, [:splat, [:array, [:lit, 1]]]], - "ParseTree" => s(:return, s(:array, s(:splat, s(:array, s(:lit, 1)))))) - - add_tests("splat_super", - "Ruby" => "super(*[1])", - "RawParseTree" => [:super, [:splat, [:array, [:lit, 1]]]], - "ParseTree" => s(:super, s(:splat, s(:array, s(:lit, 1))))) - - add_tests("splat_super_array", - "Ruby" => "super([*[1]])", - "RawParseTree" => [:super, [:array, [:splat, [:array, [:lit, 1]]]]], - "ParseTree" => s(:super, s(:array, s(:splat, s(:array, s(:lit, 1)))))) - - add_tests("splat_yield", - "Ruby" => "yield(*[1])", - "RawParseTree" => [:yield, [:splat, [:array, [:lit, 1]]]], - "ParseTree" => s(:yield, s(:splat, s(:array, s(:lit, 1))))) - - add_tests("splat_yield_array", - "Ruby" => "yield([*[1]])", - "RawParseTree" => [:yield, [:splat, [:array, [:lit, 1]]], true], - "ParseTree" => s(:yield, s(:array, s(:splat, s(:array, s(:lit, 1)))))) - - add_tests("str", - "Ruby" => '"x"', - "RawParseTree" => [:str, "x"], - "ParseTree" => s(:str, "x")) - - add_tests("str_concat_newline", # FIX? make prettier? possible? - "Ruby" => '"before" \\ - " after"', - "RawParseTree" => [:str, "before after"], - "ParseTree" => s(:str, "before after"), - "Ruby2Ruby" => '"before after"') - - add_tests("str_concat_space", - "Ruby" => '"before" " after"', - "RawParseTree" => [:str, "before after"], - "ParseTree" => s(:str, "before after"), - "Ruby2Ruby" => '"before after"') - - add_tests("str_heredoc", - "Ruby" => "<<'EOM'\n blah\nblah\nEOM", - "RawParseTree" => [:str, " blah\nblah\n"], - "ParseTree" => s(:str, " blah\nblah\n"), - "Ruby2Ruby" => "\" blah\\nblah\\n\"") - - add_tests("str_heredoc_call", - "Ruby" => "<<'EOM'.strip\n blah\nblah\nEOM", - "RawParseTree" => [:call, [:str, " blah\nblah\n"], :strip], - "ParseTree" => s(:call, s(:str, " blah\nblah\n"), - :strip, s(:arglist)), - "Ruby2Ruby" => "\" blah\\nblah\\n\".strip") - - add_tests("str_heredoc_double", - "Ruby" => "a += <<-H1 + b + <<-H2\n first\nH1\n second\nH2", - "RawParseTree" => [:lasgn, :a, - [:call, - [:lvar, :a], - :+, - [:array, - [:call, - [:call, [:str, " first\n"], :+, - [:array, [:vcall, :b]]], - :+, - [:array, [:str, " second\n"]]]]]], - "ParseTree" => s(:lasgn, :a, - s(:call, - s(:lvar, :a), - :+, - s(:arglist, - s(:call, - s(:call, s(:str, " first\n"), :+, - s(:arglist, - s(:call, nil, :b, s(:arglist)))), - :+, - s(:arglist, s(:str, " second\n")))))), - "Ruby2Ruby" => "a = (a + ((\" first\\n\" + b) + \" second\\n\"))") - - add_tests("str_heredoc_empty", # yes... tarded - "Ruby" => "<<'EOM'\nEOM", - "RawParseTree" => [:str, ""], - "ParseTree" => s(:str, ""), - "Ruby2Ruby" => '""') - - add_tests("str_heredoc_indent", - "Ruby" => "<<-EOM\n blah\nblah\n\n EOM", - "RawParseTree" => [:str, " blah\nblah\n\n"], - "ParseTree" => s(:str, " blah\nblah\n\n"), - "Ruby2Ruby" => "\" blah\\nblah\\n\\n\"") - - add_tests("str_interp_file", - "Ruby" => '"file = #{__FILE__}\n"', - "RawParseTree" => [:str, "file = (string)\n"], - "ParseTree" => s(:str, "file = (string)\n"), - "Ruby2Ruby" => '"file = (string)\\n"') - - add_tests("structure_extra_block_for_dvar_scoping", - "Ruby" => "a.b do |c, d|\n unless e.f(c) then\n g = false\n d.h { |x, i| g = true }\n end\nend", - "RawParseTree" => [:iter, - [:call, [:vcall, :a], :b], - [:masgn, [:array, - [:dasgn_curr, :c], - [:dasgn_curr, :d]], nil, nil], - [:if, - [:call, [:vcall, :e], :f, - [:array, [:dvar, :c]]], - nil, - [:block, - [:dasgn_curr, :g, [:false]], - [:iter, - [:call, [:dvar, :d], :h], - [:masgn, [:array, - [:dasgn_curr, :x], - [:dasgn_curr, :i]], nil, nil], - [:dasgn, :g, [:true]]]]]], - "ParseTree" => s(:iter, - s(:call, - s(:call, nil, :a, s(:arglist)), - :b, s(:arglist)), - s(:masgn, s(:array, - s(:lasgn, :c), - s(:lasgn, :d))), - s(:if, - s(:call, s(:call, nil, :e, s(:arglist)), :f, - s(:arglist, s(:lvar, :c))), - nil, - s(:block, - s(:lasgn, :g, s(:false)), - s(:iter, - s(:call, s(:lvar, :d), :h, s(:arglist)), - s(:masgn, s(:array, - s(:lasgn, :x), - s(:lasgn, :i))), - s(:lasgn, :g, s(:true))))))) - - add_tests("structure_remove_begin_1", - "Ruby" => "a << begin\n b\n rescue\n c\n end", - "RawParseTree" => [:call, [:vcall, :a], :<<, - [:array, [:rescue, [:vcall, :b], - [:resbody, nil, [:vcall, :c]]]]], - "ParseTree" => s(:call, s(:call, nil, :a, s(:arglist)), :<<, - s(:arglist, - s(:rescue, - s(:call, nil, :b, s(:arglist)), - s(:resbody, s(:array), - s(:call, nil, :c, s(:arglist)))))), - "Ruby2Ruby" => "(a << b rescue c)") - - add_tests("structure_remove_begin_2", - "Ruby" => "a = if c\n begin\n b\n rescue\n nil\n end\n end\na", - "RawParseTree" => [:block, - [:lasgn, - :a, - [:if, [:vcall, :c], - [:rescue, - [:vcall, :b], - [:resbody, nil, [:nil]]], - nil]], - [:lvar, :a]], - "ParseTree" => s(:block, - s(:lasgn, - :a, - s(:if, s(:call, nil, :c, s(:arglist)), - s(:rescue, s(:call, nil, :b, s(:arglist)), - s(:resbody, - s(:array), s(:nil))), - nil)), - s(:lvar, :a)), - "Ruby2Ruby" => "a = b rescue nil if c\na\n") # OMG that's awesome - - add_tests("structure_unused_literal_wwtt", - "Ruby" => "\"prevent the above from infecting rdoc\"\n\nmodule Graffle\nend", - "RawParseTree" => [:module, :Graffle, [:scope]], - "ParseTree" => s(:module, :Graffle, s(:scope)), - "Ruby2Ruby" => "module Graffle\nend") - - add_tests("super_0", - "Ruby" => "def x\n super()\nend", - "RawParseTree" => [:defn, :x, - [:scope, - [:block, [:args], [:super]]]], - "ParseTree" => s(:defn, :x, - s(:args), - s(:scope, s(:block, s(:super))))) - - add_tests("super_1", - "Ruby" => "def x\n super(4)\nend", - "RawParseTree" => [:defn, :x, - [:scope, - [:block, - [:args], - [:super, [:array, [:lit, 4]]]]]], - "ParseTree" => s(:defn, :x, - s(:args), - s(:scope, - s(:block, - s(:super, s(:lit, 4)))))) - - add_tests("super_1_array", - "Ruby" => "def x\n super([24, 42])\nend", - "RawParseTree" => [:defn, :x, - [:scope, - [:block, - [:args], - [:super, - [:array, - [:array, [:lit, 24], [:lit, 42]]]]]]], - "ParseTree" => s(:defn, :x, - s(:args), - s(:scope, - s(:block, - s(:super, s(:array, - s(:lit, 24), - s(:lit, 42))))))) - - add_tests("super_block_pass", - "Ruby" => "super(a, &b)", - "RawParseTree" => [:block_pass, - [:vcall, :b], [:super, [:array, [:vcall, :a]]]], - "ParseTree" => s(:super, - s(:call, nil, :a, s(:arglist)), - s(:block_pass, - s(:call, nil, :b, s(:arglist))))) - - add_tests("super_block_splat", - "Ruby" => "super(a, *b)", - "RawParseTree" => [:super, - [:argscat, - [:array, [:vcall, :a]], - [:vcall, :b]]], - "ParseTree" => s(:super, - s(:call, nil, :a, s(:arglist)), - s(:splat, s(:call, nil, :b, s(:arglist))))) - - add_tests("super_n", - "Ruby" => "def x\n super(24, 42)\nend", - "RawParseTree" => [:defn, :x, - [:scope, - [:block, - [:args], - [:super, [:array, [:lit, 24], [:lit, 42]]]]]], - "ParseTree" => s(:defn, :x, - s(:args), - s(:scope, - s(:block, - s(:super, s(:lit, 24), s(:lit, 42)))))) - - add_tests("svalue", - "Ruby" => "a = *b", - "RawParseTree" => [:lasgn, :a, [:svalue, [:splat, [:vcall, :b]]]], - "ParseTree" => s(:lasgn, :a, - s(:svalue, - s(:splat, s(:call, nil, :b, s(:arglist)))))) - - add_tests("to_ary", - "Ruby" => "a, b = c", - "RawParseTree" => [:masgn, - [:array, [:lasgn, :a], [:lasgn, :b]], nil, - [:to_ary, [:vcall, :c]]], - "ParseTree" => s(:masgn, - s(:array, s(:lasgn, :a), s(:lasgn, :b)), - s(:to_ary, s(:call, nil, :c, s(:arglist))))) - - add_tests("true", - "Ruby" => "true", - "RawParseTree" => [:true], - "ParseTree" => s(:true)) - - add_tests("undef", - "Ruby" => "undef :x", - "RawParseTree" => [:undef, [:lit, :x]], - "ParseTree" => s(:undef, s(:lit, :x))) - - add_tests("undef_2", - "Ruby" => "undef :x, :y", - "RawParseTree" => [:block, - [:undef, [:lit, :x]], - [:undef, [:lit, :y]]], - "ParseTree" => s(:block, - s(:undef, s(:lit, :x)), - s(:undef, s(:lit, :y))), - "Ruby2Ruby" => "undef :x\nundef :y\n") - - add_tests("undef_3", - "Ruby" => "undef :x, :y, :z", - "RawParseTree" => [:block, - [:undef, [:lit, :x]], - [:undef, [:lit, :y]], - [:undef, [:lit, :z]]], - "ParseTree" => s(:block, - s(:undef, s(:lit, :x)), - s(:undef, s(:lit, :y)), - s(:undef, s(:lit, :z))), - "Ruby2Ruby" => "undef :x\nundef :y\nundef :z\n") - - add_tests("undef_block_1", - "Ruby" => "f1\nundef :x\n", # TODO: don't like the extra return - "RawParseTree" => [:block, - [:vcall, :f1], - [:undef, [:lit, :x]]], - "ParseTree" => s(:block, - s(:call, nil, :f1, s(:arglist)), - s(:undef, s(:lit, :x)))) - - add_tests("undef_block_2", - "Ruby" => "f1\nundef :x, :y", - "RawParseTree" => [:block, - [:vcall, :f1], - [:block, - [:undef, [:lit, :x]], - [:undef, [:lit, :y]], - ]], - "ParseTree" => s(:block, - s(:call, nil, :f1, s(:arglist)), - s(:block, - s(:undef, s(:lit, :x)), - s(:undef, s(:lit, :y)))), - "Ruby2Ruby" => "f1\n(undef :x\nundef :y)\n") - - add_tests("undef_block_3", - "Ruby" => "f1\nundef :x, :y, :z", - "RawParseTree" => [:block, - [:vcall, :f1], - [:block, - [:undef, [:lit, :x]], - [:undef, [:lit, :y]], - [:undef, [:lit, :z]], - ]], - "ParseTree" => s(:block, - s(:call, nil, :f1, s(:arglist)), - s(:block, - s(:undef, s(:lit, :x)), - s(:undef, s(:lit, :y)), - s(:undef, s(:lit, :z)))), - "Ruby2Ruby" => "f1\n(undef :x\nundef :y\nundef :z)\n") - - add_tests("undef_block_3_post", - "Ruby" => "undef :x, :y, :z\nf2", - "RawParseTree" => [:block, - [:undef, [:lit, :x]], - [:undef, [:lit, :y]], - [:undef, [:lit, :z]], - [:vcall, :f2]], - "ParseTree" => s(:block, - s(:undef, s(:lit, :x)), - s(:undef, s(:lit, :y)), - s(:undef, s(:lit, :z)), - s(:call, nil, :f2, s(:arglist))), - "Ruby2Ruby" => "undef :x\nundef :y\nundef :z\nf2\n") - - add_tests("undef_block_wtf", - "Ruby" => "f1\nundef :x, :y, :z\nf2", - "RawParseTree" => [:block, - [:vcall, :f1], - [:block, - [:undef, [:lit, :x]], - [:undef, [:lit, :y]], - [:undef, [:lit, :z]]], - [:vcall, :f2]], - "ParseTree" => s(:block, - s(:call, nil, :f1, s(:arglist)), - s(:block, - s(:undef, s(:lit, :x)), - s(:undef, s(:lit, :y)), - s(:undef, s(:lit, :z))), - s(:call, nil, :f2, s(:arglist))), - "Ruby2Ruby" => "f1\n(undef :x\nundef :y\nundef :z)\nf2\n") - - - add_tests("unless_post", - "Ruby" => "a unless b", - "RawParseTree" => [:if, [:vcall, :b], nil, [:vcall, :a]], - "ParseTree" => s(:if, s(:call, nil, :b, s(:arglist)), nil, - s(:call, nil, :a, s(:arglist)))) - - add_tests("unless_post_not", - "Ruby" => "a unless not b", - "RawParseTree" => [:if, [:vcall, :b], [:vcall, :a], nil], - "ParseTree" => s(:if, s(:call, nil, :b, s(:arglist)), - s(:call, nil, :a, s(:arglist)), nil), - "Ruby2Ruby" => "a if b") - - add_tests("unless_pre", - "Ruby" => "unless b then a end", - "RawParseTree" => [:if, [:vcall, :b], nil, [:vcall, :a]], - "ParseTree" => s(:if, s(:call, nil, :b, s(:arglist)), nil, - s(:call, nil, :a, s(:arglist))), - "Ruby2Ruby" => "a unless b") - - add_tests("unless_pre_not", - "Ruby" => "unless not b then a end", - "RawParseTree" => [:if, [:vcall, :b], [:vcall, :a], nil], - "ParseTree" => s(:if, s(:call, nil, :b, s(:arglist)), - s(:call, nil, :a, s(:arglist)), nil), - "Ruby2Ruby" => "a if b") - - add_tests("until_post", - "Ruby" => "begin\n (1 + 1)\nend until false", - "RawParseTree" => [:until, [:false], - [:call, [:lit, 1], :+, - [:array, [:lit, 1]]], false], - "ParseTree" => s(:until, s(:false), - s(:call, s(:lit, 1), :+, - s(:arglist, s(:lit, 1))), false)) - - add_tests("until_post_not", - "Ruby" => "begin\n (1 + 1)\nend until not true", - "RawParseTree" => [:while, [:true], - [:call, [:lit, 1], :+, - [:array, [:lit, 1]]], false], - "ParseTree" => s(:while, s(:true), - s(:call, s(:lit, 1), :+, - s(:arglist, s(:lit, 1))), false), - "Ruby2Ruby" => "begin\n (1 + 1)\nend while true") - - add_tests("until_pre", - "Ruby" => "until false do\n (1 + 1)\nend", - "RawParseTree" => [:until, [:false], - [:call, [:lit, 1], :+, - [:array, [:lit, 1]]], true], - "ParseTree" => s(:until, s(:false), - s(:call, s(:lit, 1), :+, - s(:arglist, s(:lit, 1))), true)) - - add_tests("until_pre_mod", - "Ruby" => "(1 + 1) until false", - "RawParseTree" => [:until, [:false], - [:call, [:lit, 1], :+, - [:array, [:lit, 1]]], true], - "ParseTree" => s(:until, s(:false), - s(:call, s(:lit, 1), :+, - s(:arglist, s(:lit, 1))), true), - "Ruby2Ruby" => "until false do\n (1 + 1)\nend") - - add_tests("until_pre_not", - "Ruby" => "until not true do\n (1 + 1)\nend", - "RawParseTree" => [:while, [:true], - [:call, [:lit, 1], :+, - [:array, [:lit, 1]]], true], - "ParseTree" => s(:while, s(:true), - s(:call, s(:lit, 1), :+, - s(:arglist, s(:lit, 1))), true), - "Ruby2Ruby" => "while true do\n (1 + 1)\nend") - - add_tests("until_pre_not_mod", - "Ruby" => "(1 + 1) until not true", - "RawParseTree" => [:while, [:true], - [:call, [:lit, 1], :+, - [:array, [:lit, 1]]], true], - "ParseTree" => s(:while, s(:true), - s(:call, s(:lit, 1), :+, - s(:arglist, s(:lit, 1))), true), - "Ruby2Ruby" => "while true do\n (1 + 1)\nend") - - add_tests("valias", - "Ruby" => "alias $y $x", - "RawParseTree" => [:valias, :$y, :$x], - "ParseTree" => s(:valias, :$y, :$x)) - - add_tests("vcall", - "Ruby" => "method", - "RawParseTree" => [:vcall, :method], - "ParseTree" => s(:call, nil, :method, s(:arglist))) - - add_tests("while_post", - "Ruby" => "begin\n (1 + 1)\nend while false", - "RawParseTree" => [:while, [:false], - [:call, [:lit, 1], :+, - [:array, [:lit, 1]]], false], - "ParseTree" => s(:while, s(:false), - s(:call, s(:lit, 1), :+, - s(:arglist, s(:lit, 1))), false)) - - add_tests("while_post2", - "Ruby" => "begin\n (1 + 2)\n (3 + 4)\nend while false", - "RawParseTree" => [:while, [:false], - [:block, - [:call, [:lit, 1], :+, [:array, [:lit, 2]]], - [:call, [:lit, 3], :+, [:array, [:lit, 4]]]], - false], - "ParseTree" => s(:while, s(:false), - s(:block, - s(:call, s(:lit, 1), :+, - s(:arglist, s(:lit, 2))), - s(:call, s(:lit, 3), :+, - s(:arglist, s(:lit, 4)))), - false)) - - add_tests("while_post_not", - "Ruby" => "begin\n (1 + 1)\nend while not true", - "RawParseTree" => [:until, [:true], - [:call, [:lit, 1], :+, - [:array, [:lit, 1]]], false], - "ParseTree" => s(:until, s(:true), - s(:call, s(:lit, 1), :+, - s(:arglist, s(:lit, 1))), false), - "Ruby2Ruby" => "begin\n (1 + 1)\nend until true") - - add_tests("while_pre", - "Ruby" => "while false do\n (1 + 1)\nend", - "RawParseTree" => [:while, [:false], - [:call, [:lit, 1], :+, - [:array, [:lit, 1]]], true], - "ParseTree" => s(:while, s(:false), - s(:call, s(:lit, 1), :+, - s(:arglist, s(:lit, 1))), true)) - - add_tests("while_pre_mod", - "Ruby" => "(1 + 1) while false", - "RawParseTree" => [:while, [:false], - [:call, [:lit, 1], :+, - [:array, [:lit, 1]]], true], - "ParseTree" => s(:while, s(:false), - s(:call, s(:lit, 1), :+, - s(:arglist, s(:lit, 1))), true), - "Ruby2Ruby" => "while false do\n (1 + 1)\nend") # FIX can be one liner - - add_tests("while_pre_nil", - "Ruby" => "while false do\nend", - "RawParseTree" => [:while, [:false], nil, true], - "ParseTree" => s(:while, s(:false), nil, true)) - - add_tests("while_pre_not", - "Ruby" => "while not true do\n (1 + 1)\nend", - "RawParseTree" => [:until, [:true], - [:call, [:lit, 1], :+, - [:array, [:lit, 1]]], true], - "ParseTree" => s(:until, s(:true), - s(:call, s(:lit, 1), :+, - s(:arglist, s(:lit, 1))), true), - "Ruby2Ruby" => "until true do\n (1 + 1)\nend") - - add_tests("while_pre_not_mod", - "Ruby" => "(1 + 1) while not true", - "RawParseTree" => [:until, [:true], - [:call, [:lit, 1], :+, - [:array, [:lit, 1]]], true], - "ParseTree" => s(:until, s(:true), - s(:call, s(:lit, 1), :+, - s(:arglist, s(:lit, 1))), true), - "Ruby2Ruby" => "until true do\n (1 + 1)\nend") # FIX - - add_tests("xstr", - "Ruby" => "`touch 5`", - "RawParseTree" => [:xstr, 'touch 5'], - "ParseTree" => s(:xstr, 'touch 5')) - - add_tests("yield_0", - "Ruby" => "yield", - "RawParseTree" => [:yield], - "ParseTree" => s(:yield)) - - add_tests("yield_1", - "Ruby" => "yield(42)", - "RawParseTree" => [:yield, [:lit, 42]], - "ParseTree" => s(:yield, s(:lit, 42))) - - add_tests("yield_array_0", - "Ruby" => "yield([])", - "RawParseTree" => [:yield, [:zarray], true], - "ParseTree" => s(:yield, s(:array))) - - add_tests("yield_array_1", - "Ruby" => "yield([42])", - "RawParseTree" => [:yield, [:array, [:lit, 42]], true], - "ParseTree" => s(:yield, s(:array, s(:lit, 42)))) - - add_tests("yield_array_n", - "Ruby" => "yield([42, 24])", - "RawParseTree" => [:yield, [:array, [:lit, 42], [:lit, 24]], true], - "ParseTree" => s(:yield, s(:array, s(:lit, 42), s(:lit, 24)))) - - add_tests("yield_n", - "Ruby" => "yield(42, 24)", - "RawParseTree" => [:yield, [:array, [:lit, 42], [:lit, 24]]], - "ParseTree" => s(:yield, s(:lit, 42), s(:lit, 24))) - - add_tests("zarray", - "Ruby" => "a = []", - "RawParseTree" => [:lasgn, :a, [:zarray]], - "ParseTree" => s(:lasgn, :a, s(:array))) - - add_tests("zsuper", - "Ruby" => "def x\n super\nend", - "RawParseTree" => [:defn, :x, - [:scope, [:block, [:args], [:zsuper]]]], - "ParseTree" => s(:defn, :x, s(:args), - s(:scope, s(:block, s(:zsuper))))) -end diff --git a/Tests/Libraries/ParseTreeTests/something.rb b/Tests/Libraries/ParseTreeTests/something.rb deleted file mode 100644 index fadfc2a0f..000000000 --- a/Tests/Libraries/ParseTreeTests/something.rb +++ /dev/null @@ -1,53 +0,0 @@ - -class Something - - def self.classmethod - 1 + 1 - end - - # Other edge cases: - - def opt_args(arg1, arg2 = 42, *args) - arg3 = arg1 * arg2 * 7 - puts(arg3.to_s) - return "foo" - end - - def multi_args(arg1, arg2) - arg3 = arg1 * arg2 * 7 - puts(arg3.to_s) - return "foo" - end - - def unknown_args(arg1, arg2) - # does nothing - return arg1 - end - - def determine_args - 5 == unknown_args(4, "known") - end - - # TODO: sort list - def bbegin - begin - 1 - rescue SyntaxError => e1 - 2 - rescue Exception => e2 - 3 - else - 4 - ensure - 5 - end - end - - def bbegin_no_exception - begin - 5 - rescue - 6 - end - end -end diff --git a/Tests/Libraries/ParseTreeTests/test_parse_tree.rb b/Tests/Libraries/ParseTreeTests/test_parse_tree.rb deleted file mode 100644 index 6fb5d3393..000000000 --- a/Tests/Libraries/ParseTreeTests/test_parse_tree.rb +++ /dev/null @@ -1,259 +0,0 @@ -#!/usr/local/bin/ruby -w - -dir = File.expand_path "~/.ruby_inline" -if test ?d, dir then - require 'fileutils' - puts "nuking #{dir}" - # force removal, Windoze is bitching at me, something to hunt later... - FileUtils.rm_r dir, :force => true -end - -require 'minitest/autorun' -require 'parse_tree' -require 'pt_testcase' -require 'test/something' - -class SomethingWithInitialize - def initialize; end # this method is private - protected - def protected_meth; end -end - -class RawParseTree - def process(input, verbose = nil) # TODO: remove - - test_method = caller[0][/\`(.*)\'/, 1] - verbose = test_method =~ /mri_verbose_flag/ ? true : nil - - # um. kinda stupid, but cleaner - case input - when Array then - ParseTree.translate(*input) - else - self.parse_tree_for_string(input, '(string)', 1, verbose).first - end - end -end - -class TestRawParseTree < ParseTreeTestCase - def setup - super - @processor = RawParseTree.new(false) - end - - def test_parse_tree_for_string_with_newlines - @processor = RawParseTree.new(true) - actual = @processor.parse_tree_for_string "1 +\n nil", 'test.rb', 5 - expected = [[:newline, 6, "test.rb", - [:call, [:lit, 1], :+, [:array, [:nil]]]]] - - assert_equal expected, actual - end - - def test_class_initialize - expected = [[:class, :SomethingWithInitialize, [:const, :Object], - [:defn, :initialize, [:scope, [:block, [:args], [:nil]]]], - [:defn, :protected_meth, [:scope, [:block, [:args], [:nil]]]], - ]] - tree = @processor.parse_tree SomethingWithInitialize - assert_equal expected, tree - end - - def test_class_translate_string - str = "class A; def a; end; end" - - sexp = ParseTree.translate str - - expected = [:class, :A, nil, - [:scope, - [:defn, :a, [:scope, [:block, [:args], [:nil]]]]]] - - assert_equal expected, sexp - end - - def test_class_translate_string_method - str = "class A; def a; end; def b; end; end" - - sexp = ParseTree.translate str, :a - - expected = [:defn, :a, [:scope, [:block, [:args], [:nil]]]] - - assert_equal expected, sexp - end - - def test_parse_tree_for_string - actual = @processor.parse_tree_for_string '1 + nil', '(string)', 1 - expected = [[:call, [:lit, 1], :+, [:array, [:nil]]]] - - assert_equal expected, actual - end - - def test_parse_tree_for_str - actual = @processor.parse_tree_for_str '1 + nil', '(string)', 1 - expected = [[:call, [:lit, 1], :+, [:array, [:nil]]]] - - assert_equal expected, actual - end - - @@self_classmethod = [:defs, - [:self], :classmethod, - [:scope, - [:block, - [:args], - [:call, [:lit, 1], :+, [:array, [:lit, 1]]]]]] - - @@missing = [nil] - - @@opt_args = [:defn, :opt_args, - [:scope, - [:block, - [:args, :arg1, :arg2, :"*args", - [:block, [:lasgn, :arg2, [:lit, 42]]]], - [:lasgn, :arg3, - [:call, - [:call, - [:lvar, :arg1], - :*, - [:array, [:lvar, :arg2]]], - :*, - [:array, [:lit, 7]]]], - [:fcall, :puts, [:array, [:call, [:lvar, :arg3], :to_s]]], - [:return, - [:str, "foo"]]]]] - - @@multi_args = [:defn, :multi_args, - [:scope, - [:block, - [:args, :arg1, :arg2], - [:lasgn, :arg3, - [:call, - [:call, - [:lvar, :arg1], - :*, - [:array, [:lvar, :arg2]]], - :*, - [:array, [:lit, 7]]]], - [:fcall, :puts, [:array, [:call, [:lvar, :arg3], :to_s]]], - [:return, - [:str, "foo"]]]]] - - @@unknown_args = [:defn, :unknown_args, - [:scope, - [:block, - [:args, :arg1, :arg2], - [:return, [:lvar, :arg1]]]]] - - @@bbegin = [:defn, :bbegin, - [:scope, - [:block, - [:args], - [:ensure, - [:rescue, - [:lit, 1], - [:resbody, - [:array, [:const, :SyntaxError]], - [:block, [:lasgn, :e1, [:gvar, :$!]], [:lit, 2]], - [:resbody, - [:array, [:const, :Exception]], - [:block, [:lasgn, :e2, [:gvar, :$!]], [:lit, 3]]]], - [:lit, 4]], - [:lit, 5]]]]] - - @@bbegin_no_exception = [:defn, :bbegin_no_exception, - [:scope, - [:block, - [:args], - [:rescue, - [:lit, 5], - [:resbody, nil, [:lit, 6]]]]]] - - @@determine_args = [:defn, :determine_args, - [:scope, - [:block, - [:args], - [:call, - [:lit, 5], - :==, - [:array, - [:fcall, - :unknown_args, - [:array, [:lit, 4], [:str, "known"]]]]]]]] - - @@attrasgn = [:defn, - :attrasgn, - [:scope, - [:block, - [:args], - [:attrasgn, [:lit, 42], :method=, [:array, [:vcall, :y]]], - [:attrasgn, - [:self], - :type=, - [:array, [:call, [:vcall, :other], :type]]]]]] - - @@__all = [:class, :Something, [:const, :Object]] - - Something.instance_methods(false).sort.each do |meth| - if class_variables.include?("@@#{meth}") then - @@__all << eval("@@#{meth}") - eval "def test_#{meth}; assert_equal @@#{meth}, @processor.parse_tree_for_method(Something, :#{meth}, false, false); end" - else - eval "def test_#{meth}; flunk \"You haven't added @@#{meth} yet\"; end" - end - end - - Something.singleton_methods.sort.each do |meth| - next if meth =~ /yaml/ # rubygems introduced a bug - if class_variables.include?("@@self_#{meth}") then - @@__all << eval("@@self_#{meth}") - eval "def test_self_#{meth}; assert_equal @@self_#{meth}, @processor.parse_tree_for_method(Something, :#{meth}, true); end" - else - eval "def test_self_#{meth}; flunk \"You haven't added @@self_#{meth} yet\"; end" - end - end - - def test_missing - assert_equal(@@missing, - @processor.parse_tree_for_method(Something, :missing), - "Must return #{@@missing.inspect} for missing methods") - end - - def test_whole_class - assert_equal([@@__all], - @processor.parse_tree(Something), - "Must return a lot of shit") - end -end - -class TestParseTree < ParseTreeTestCase - def setup - super - @processor = ParseTree.new(false) - end - - def test_process_string - actual = @processor.process '1 + nil' - expected = s(:call, s(:lit, 1), :+, s(:arglist, s(:nil))) - - assert_equal expected, actual - - actual = @processor.process 'puts 42' - expected = s(:call, nil, :puts, s(:arglist, s(:lit, 42))) - - assert_equal expected, actual - end - - def test_process_string_newlines - @processor = ParseTree.new(true) - actual = @processor.process "1 +\n nil", false, 'test.rb', 5 - expected = s(:newline, 6, "test.rb", - s(:call, s(:lit, 1), :+, s(:arglist, s(:nil)))) - - assert_equal expected, actual - end - - # TODO: test_process_proc ? - # TODO: test_process_method ? - # TODO: test_process_class ? - # TODO: test_process_module ? - -end diff --git a/Tests/Libraries/ParseTreeTests/test_parse_tree_extensions.rb b/Tests/Libraries/ParseTreeTests/test_parse_tree_extensions.rb deleted file mode 100644 index b12a546de..000000000 --- a/Tests/Libraries/ParseTreeTests/test_parse_tree_extensions.rb +++ /dev/null @@ -1,107 +0,0 @@ -require 'minitest/autorun' -require 'parse_tree' -require 'parse_tree_extensions' -require 'tmpdir' - -$: << "../../ruby2ruby/dev/lib" # unoffical dependency - user responsibility -require 'ruby2ruby' - -class R2RTestCase < MiniTest::Unit::TestCase - def test_proc_to_ruby - util_setup_inline - block = proc { puts "something" } - assert_equal 'proc { puts("something") }', block.to_ruby - end - - # TODO: bus error -# def test_proc_to_ruby_args_0 -# util_setup_inline -# block = proc { || puts 42 } -# assert_equal 'proc { || puts(42) }', block.to_ruby -# end - - def test_proc_to_ruby_args_1 - util_setup_inline - block = proc { |x| puts x } - assert_equal 'proc { |x| puts(x) }', block.to_ruby - end - - def test_proc_to_ruby_args_n - util_setup_inline - block = proc { |x| puts x } - assert_equal 'proc { |x| puts(x) }', block.to_ruby - end - - def test_proc_to_sexp - util_setup_inline - p = proc { 1 + 1 } - s = s(:iter, - s(:call, nil, :proc, s(:arglist)), - nil, - s(:call, s(:lit, 1), :+, s(:arglist, s(:lit, 1)))) - assert_equal s, p.to_sexp - end - - # TODO: bus error -# def test_proc_to_sexp_args_0 -# util_setup_inline -# p = proc { || 1 + 1 } -# s = s(:iter, -# s(:call, nil, :proc, s(:arglist)), -# nil, -# s(:call, s(:lit, 1), :+, s(:arglist, s(:lit, 1)))) -# assert_equal s, p.to_sexp -# end - - def test_proc_to_sexp_args_1 - util_setup_inline - p = proc {|x| puts x } - s = s(:iter, - s(:call, nil, :proc, s(:arglist)), - s(:lasgn, :x), - s(:call, nil, :puts, s(:arglist, s(:lvar, :x)))) - - assert_equal s, p.to_sexp - end - - def test_proc_to_sexp_args_n - util_setup_inline - p = proc {|x, y| puts x + y } - s = s(:iter, - s(:call, nil, :proc, s(:arglist)), - s(:masgn, s(:array, s(:lasgn, :x), s(:lasgn, :y))), - s(:call, nil, :puts, - s(:arglist, s(:call, s(:lvar, :x), :+, s(:arglist, s(:lvar, :y)))))) - - assert_equal s, p.to_sexp - end - - def test_parse_tree_for_proc # TODO: move? - p = proc {|a, b, c|} - s = s(:iter, - s(:call, nil, :proc, s(:arglist)), - s(:masgn, s(:array, s(:lasgn, :a), s(:lasgn, :b), s(:lasgn, :c)))) - - pt = ParseTree.new(false) - u = Unifier.new - sexp = pt.parse_tree_for_proc p - - sexp = u.process(sexp) - - assert_equal s, sexp - end - - def test_unbound_method_to_ruby - util_setup_inline - r = "proc { ||\n util_setup_inline\n p = proc { (1 + 1) }\n s = s(:iter, s(:call, nil, :proc, s(:arglist)), nil, s(:call, s(:lit, 1), :+, s(:arglist, s(:lit, 1))))\n assert_equal(s, p.to_sexp)\n}" - m = self.class.instance_method(:test_proc_to_sexp) - - assert_equal r, m.to_ruby - end - - def util_setup_inline - @rootdir = File.join(Dir.tmpdir, "test_ruby_to_ruby.#{$$}") - Dir.mkdir @rootdir, 0700 unless test ?d, @rootdir - ENV['INLINEDIR'] = @rootdir - end -end diff --git a/Tests/Libraries/ParseTreeTests/test_unified_ruby.rb b/Tests/Libraries/ParseTreeTests/test_unified_ruby.rb deleted file mode 100644 index b85191368..000000000 --- a/Tests/Libraries/ParseTreeTests/test_unified_ruby.rb +++ /dev/null @@ -1,57 +0,0 @@ -#!/usr/local/bin/ruby -w - -$TESTING = true - -require 'minitest/autorun' if $0 == __FILE__ unless defined? $ZENTEST and $ZENTEST -require 'test/unit/testcase' -require 'sexp' -require 'sexp_processor' -require 'unified_ruby' - -class TestUnifier < MiniTest::Unit::TestCase - def test_pre_fcall - u = PreUnifier.new - - input = [:fcall, :block_given?] - expect = s(:fcall, :block_given?, s(:arglist)) - - assert_equal expect, u.process(input) - - input = [:fcall, :m, [:array, [:lit, 42]]] - expect = s(:fcall, :m, s(:arglist, s(:lit, 42))) - - assert_equal expect, u.process(input) - end - - def test_pre_call - u = PreUnifier.new - - input = [:call, [:self], :method] - expect = s(:call, s(:self), :method, s(:arglist)) - - assert_equal expect, u.process(input) - - input = [:fcall, :m, [:array, [:lit, 42]]] - expect = s(:fcall, :m, s(:arglist, s(:lit, 42))) - - assert_equal expect, u.process(input) - end - - def test_process_bmethod - u = Unifier.new - - raw = [:defn, :myproc3, - [:bmethod, - [:masgn, [:array, - [:dasgn_curr, :a], - [:dasgn_curr, :b], - [:dasgn_curr, :c]], - nil, nil]]] - - s = s(:defn, :myproc3, - s(:args, :a, :b, :c), - s(:scope, s(:block))) - - assert_equal s, u.process(raw) - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/MIT-LICENSE b/Tests/Libraries/Rails-3.0.0/actionmailer/MIT-LICENSE deleted file mode 100644 index 77d558ab8..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/MIT-LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -Copyright (c) 2004-2010 David Heinemeier Hansson - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/abstract_unit.rb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/abstract_unit.rb deleted file mode 100644 index 3299bb667..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/abstract_unit.rb +++ /dev/null @@ -1,80 +0,0 @@ -# Pathname has a warning, so require it first while silencing -# warnings to shut it up. -# -# Also, in 1.9, Bundler creates warnings due to overriding -# Rubygems methods -begin - old, $VERBOSE = $VERBOSE, nil - require 'pathname' - require File.expand_path('../../../load_paths', __FILE__) -ensure - $VERBOSE = old -end - -require 'active_support/core_ext/kernel/reporting' - -require 'active_support/core_ext/string/encoding' -if "ruby".encoding_aware? - # These are the normal settings that will be set up by Railties - # TODO: Have these tests support other combinations of these values - silence_warnings do - Encoding.default_internal = "UTF-8" - Encoding.default_external = "UTF-8" - end -end - -silence_warnings do - # These external dependencies have warnings :/ - require 'text/format' - require 'mail' -end - -lib = File.expand_path("#{File.dirname(__FILE__)}/../lib") -$:.unshift(lib) unless $:.include?('lib') || $:.include?(lib) - -require 'test/unit' -require 'action_mailer' -require 'action_mailer/test_case' - -# Show backtraces for deprecated behavior for quicker cleanup. -ActiveSupport::Deprecation.debug = true - -# Bogus template processors -ActionView::Template.register_template_handler :haml, lambda { |template| "Look its HAML!".inspect } -ActionView::Template.register_template_handler :bak, lambda { |template| "Lame backup".inspect } - -FIXTURE_LOAD_PATH = File.expand_path('fixtures', File.dirname(__FILE__)) -ActionMailer::Base.view_paths = FIXTURE_LOAD_PATH - -class MockSMTP - def self.deliveries - @@deliveries - end - - def initialize - @@deliveries = [] - end - - def sendmail(mail, from, to) - @@deliveries << [mail, from, to] - end - - def start(*args) - yield self - end -end - -class Net::SMTP - def self.new(*args) - MockSMTP.new - end -end - -def set_delivery_method(method) - @old_delivery_method = ActionMailer::Base.delivery_method - ActionMailer::Base.delivery_method = method -end - -def restore_delivery_method - ActionMailer::Base.delivery_method = @old_delivery_method -end diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/base_test.rb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/base_test.rb deleted file mode 100644 index 081fe5c30..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/base_test.rb +++ /dev/null @@ -1,564 +0,0 @@ -# encoding: utf-8 -require 'abstract_unit' -require 'active_support/time' - -require 'mailers/base_mailer' -require 'mailers/proc_mailer' -require 'mailers/asset_mailer' - -class BaseTest < ActiveSupport::TestCase - # TODO Add some tests for implicity layout render and url helpers - # so we can get rid of old base tests altogether with old base. - - def teardown - ActionMailer::Base.asset_host = nil - ActionMailer::Base.assets_dir = nil - end - - test "method call to mail does not raise error" do - assert_nothing_raised { BaseMailer.welcome } - end - - # Basic mail usage without block - test "mail() should set the headers of the mail message" do - email = BaseMailer.welcome - assert_equal(['system@test.lindsaar.net'], email.to) - assert_equal(['jose@test.plataformatec.com'], email.from) - assert_equal('The first email on new API!', email.subject) - end - - test "mail() with from overwrites the class level default" do - email = BaseMailer.welcome(:from => 'someone@example.com', - :to => 'another@example.org') - assert_equal(['someone@example.com'], email.from) - assert_equal(['another@example.org'], email.to) - end - - test "mail() with bcc, cc, content_type, charset, mime_version, reply_to and date" do - @time = Time.now.beginning_of_day.to_datetime - email = BaseMailer.welcome(:bcc => 'bcc@test.lindsaar.net', - :cc => 'cc@test.lindsaar.net', - :content_type => 'multipart/mixed', - :charset => 'iso-8559-1', - :mime_version => '2.0', - :reply_to => 'reply-to@test.lindsaar.net', - :date => @time) - assert_equal(['bcc@test.lindsaar.net'], email.bcc) - assert_equal(['cc@test.lindsaar.net'], email.cc) - assert_equal('multipart/mixed; charset=iso-8559-1', email.content_type) - assert_equal('iso-8559-1', email.charset) - assert_equal('2.0', email.mime_version) - assert_equal(['reply-to@test.lindsaar.net'], email.reply_to) - assert_equal(@time, email.date) - end - - test "mail() renders the template using the method being processed" do - email = BaseMailer.welcome - assert_equal("Welcome", email.body.encoded) - end - - test "can pass in :body to the mail method hash" do - email = BaseMailer.welcome(:body => "Hello there") - assert_equal("text/plain", email.mime_type) - assert_equal("Hello there", email.body.encoded) - end - - test "should set template content type if mail has only one part" do - mail = BaseMailer.html_only - assert_equal('text/html', mail.mime_type) - mail = BaseMailer.plain_text_only - assert_equal('text/plain', mail.mime_type) - end - - # Custom headers - test "custom headers" do - email = BaseMailer.welcome - assert_equal("Not SPAM", email['X-SPAM'].decoded) - end - - test "deprecated non-String custom headers" do - email = assert_deprecated { BaseMailer.welcome_with_fixnum_header } - assert_equal("2", email['X-SPAM-COUNT'].decoded) - end - - test "can pass random headers in as a hash to mail" do - hash = {'X-Special-Domain-Specific-Header' => "SecretValue", - 'In-Reply-To' => '1234@mikel.me.com' } - mail = BaseMailer.welcome(hash) - assert_equal('SecretValue', mail['X-Special-Domain-Specific-Header'].decoded) - assert_equal('1234@mikel.me.com', mail['In-Reply-To'].decoded) - end - - test "can pass random headers in as a hash to headers" do - hash = {'X-Special-Domain-Specific-Header' => "SecretValue", - 'In-Reply-To' => '1234@mikel.me.com' } - mail = BaseMailer.welcome_with_headers(hash) - assert_equal('SecretValue', mail['X-Special-Domain-Specific-Header'].decoded) - assert_equal('1234@mikel.me.com', mail['In-Reply-To'].decoded) - end - - # Attachments - test "attachment with content" do - email = BaseMailer.attachment_with_content - assert_equal(1, email.attachments.length) - assert_equal('invoice.pdf', email.attachments[0].filename) - assert_equal('This is test File content', email.attachments['invoice.pdf'].decoded) - end - - test "attachment gets content type from filename" do - email = BaseMailer.attachment_with_content - assert_equal('invoice.pdf', email.attachments[0].filename) - end - - test "attachment with hash" do - email = BaseMailer.attachment_with_hash - assert_equal(1, email.attachments.length) - assert_equal('invoice.jpg', email.attachments[0].filename) - expected = "\312\213\254\232)b" - expected.force_encoding(Encoding::BINARY) if '1.9'.respond_to?(:force_encoding) - assert_equal expected, email.attachments['invoice.jpg'].decoded - end - - test "attachment with hash using default mail encoding" do - email = BaseMailer.attachment_with_hash_default_encoding - assert_equal(1, email.attachments.length) - assert_equal('invoice.jpg', email.attachments[0].filename) - expected = "\312\213\254\232)b" - expected.force_encoding(Encoding::BINARY) if '1.9'.respond_to?(:force_encoding) - assert_equal expected, email.attachments['invoice.jpg'].decoded - end - - test "sets mime type to multipart/mixed when attachment is included" do - email = BaseMailer.attachment_with_content - assert_equal(1, email.attachments.length) - assert_equal("multipart/mixed", email.mime_type) - end - - test "adds the rendered template as part" do - email = BaseMailer.attachment_with_content - assert_equal(2, email.parts.length) - assert_equal("multipart/mixed", email.mime_type) - assert_equal("text/html", email.parts[0].mime_type) - assert_equal("Attachment with content", email.parts[0].body.encoded) - assert_equal("application/pdf", email.parts[1].mime_type) - assert_equal("VGhpcyBpcyB0ZXN0IEZpbGUgY29udGVudA==\r\n", email.parts[1].body.encoded) - end - - test "adds the given :body as part" do - email = BaseMailer.attachment_with_content(:body => "I'm the eggman") - assert_equal(2, email.parts.length) - assert_equal("multipart/mixed", email.mime_type) - assert_equal("text/plain", email.parts[0].mime_type) - assert_equal("I'm the eggman", email.parts[0].body.encoded) - assert_equal("application/pdf", email.parts[1].mime_type) - assert_equal("VGhpcyBpcyB0ZXN0IEZpbGUgY29udGVudA==\r\n", email.parts[1].body.encoded) - end - - test "can embed an inline attachment" do - email = BaseMailer.inline_attachment - # Need to call #encoded to force the JIT sort on parts - email.encoded - assert_equal(2, email.parts.length) - assert_equal("multipart/related", email.mime_type) - assert_equal("multipart/alternative", email.parts[0].mime_type) - assert_equal("text/plain", email.parts[0].parts[0].mime_type) - assert_equal("text/html", email.parts[0].parts[1].mime_type) - assert_equal("logo.png", email.parts[1].filename) - end - - # Defaults values - test "uses default charset from class" do - with_default BaseMailer, :charset => "US-ASCII" do - email = BaseMailer.welcome - assert_equal("US-ASCII", email.charset) - - email = BaseMailer.welcome(:charset => "iso-8559-1") - assert_equal("iso-8559-1", email.charset) - end - end - - test "uses default content type from class" do - with_default BaseMailer, :content_type => "text/html" do - email = BaseMailer.welcome - assert_equal("text/html", email.mime_type) - - email = BaseMailer.welcome(:content_type => "text/plain") - assert_equal("text/plain", email.mime_type) - end - end - - test "uses default mime version from class" do - with_default BaseMailer, :mime_version => "2.0" do - email = BaseMailer.welcome - assert_equal("2.0", email.mime_version) - - email = BaseMailer.welcome(:mime_version => "1.0") - assert_equal("1.0", email.mime_version) - end - end - - test "uses random default headers from class" do - with_default BaseMailer, "X-Custom" => "Custom" do - email = BaseMailer.welcome - assert_equal("Custom", email["X-Custom"].decoded) - end - end - - test "subject gets default from I18n" do - BaseMailer.default :subject => nil - email = BaseMailer.welcome(:subject => nil) - assert_equal "Welcome", email.subject - - I18n.backend.store_translations('en', :base_mailer => {:welcome => {:subject => "New Subject!"}}) - email = BaseMailer.welcome(:subject => nil) - assert_equal "New Subject!", email.subject - end - - test "translations are scoped properly" do - I18n.backend.store_translations('en', :base_mailer => {:email_with_translations => {:greet_user => "Hello %{name}!"}}) - email = BaseMailer.email_with_translations - assert_equal 'Hello lifo!', email.body.encoded - end - - # Implicit multipart - test "implicit multipart" do - email = BaseMailer.implicit_multipart - assert_equal(2, email.parts.size) - assert_equal("multipart/alternative", email.mime_type) - assert_equal("text/plain", email.parts[0].mime_type) - assert_equal("TEXT Implicit Multipart", email.parts[0].body.encoded) - assert_equal("text/html", email.parts[1].mime_type) - assert_equal("HTML Implicit Multipart", email.parts[1].body.encoded) - end - - test "implicit multipart with sort order" do - order = ["text/html", "text/plain"] - with_default BaseMailer, :parts_order => order do - email = BaseMailer.implicit_multipart - assert_equal("text/html", email.parts[0].mime_type) - assert_equal("text/plain", email.parts[1].mime_type) - - email = BaseMailer.implicit_multipart(:parts_order => order.reverse) - assert_equal("text/plain", email.parts[0].mime_type) - assert_equal("text/html", email.parts[1].mime_type) - end - end - - test "implicit multipart with attachments creates nested parts" do - email = BaseMailer.implicit_multipart(:attachments => true) - assert_equal("application/pdf", email.parts[0].mime_type) - assert_equal("multipart/alternative", email.parts[1].mime_type) - assert_equal("text/plain", email.parts[1].parts[0].mime_type) - assert_equal("TEXT Implicit Multipart", email.parts[1].parts[0].body.encoded) - assert_equal("text/html", email.parts[1].parts[1].mime_type) - assert_equal("HTML Implicit Multipart", email.parts[1].parts[1].body.encoded) - end - - test "implicit multipart with attachments and sort order" do - order = ["text/html", "text/plain"] - with_default BaseMailer, :parts_order => order do - email = BaseMailer.implicit_multipart(:attachments => true) - assert_equal("application/pdf", email.parts[0].mime_type) - assert_equal("multipart/alternative", email.parts[1].mime_type) - assert_equal("text/plain", email.parts[1].parts[1].mime_type) - assert_equal("text/html", email.parts[1].parts[0].mime_type) - end - end - - test "implicit multipart with default locale" do - email = BaseMailer.implicit_with_locale - assert_equal(2, email.parts.size) - assert_equal("multipart/alternative", email.mime_type) - assert_equal("text/plain", email.parts[0].mime_type) - assert_equal("Implicit with locale TEXT", email.parts[0].body.encoded) - assert_equal("text/html", email.parts[1].mime_type) - assert_equal("Implicit with locale EN HTML", email.parts[1].body.encoded) - end - - test "implicit multipart with other locale" do - swap I18n, :locale => :pl do - email = BaseMailer.implicit_with_locale - assert_equal(2, email.parts.size) - assert_equal("multipart/alternative", email.mime_type) - assert_equal("text/plain", email.parts[0].mime_type) - assert_equal("Implicit with locale PL TEXT", email.parts[0].body.encoded) - assert_equal("text/html", email.parts[1].mime_type) - assert_equal("Implicit with locale HTML", email.parts[1].body.encoded) - end - end - - test "implicit multipart with several view paths uses the first one with template" do - old = BaseMailer.view_paths - begin - BaseMailer.view_paths = [File.join(FIXTURE_LOAD_PATH, "another.path")] + old.dup - email = BaseMailer.welcome - assert_equal("Welcome from another path", email.body.encoded) - ensure - BaseMailer.view_paths = old - end - end - - test "implicit multipart with inexistent templates uses the next view path" do - old = BaseMailer.view_paths - begin - BaseMailer.view_paths = [File.join(FIXTURE_LOAD_PATH, "unknown")] + old.dup - email = BaseMailer.welcome - assert_equal("Welcome", email.body.encoded) - ensure - BaseMailer.view_paths = old - end - end - - # Explicit multipart - test "explicit multipart" do - email = BaseMailer.explicit_multipart - assert_equal(2, email.parts.size) - assert_equal("multipart/alternative", email.mime_type) - assert_equal("text/plain", email.parts[0].mime_type) - assert_equal("TEXT Explicit Multipart", email.parts[0].body.encoded) - assert_equal("text/html", email.parts[1].mime_type) - assert_equal("HTML Explicit Multipart", email.parts[1].body.encoded) - end - - test "explicit multipart have a boundary" do - mail = BaseMailer.explicit_multipart - assert_not_nil(mail.content_type_parameters[:boundary]) - end - - test "explicit multipart does not sort order" do - order = ["text/html", "text/plain"] - with_default BaseMailer, :parts_order => order do - email = BaseMailer.explicit_multipart - assert_equal("text/plain", email.parts[0].mime_type) - assert_equal("text/html", email.parts[1].mime_type) - - email = BaseMailer.explicit_multipart(:parts_order => order.reverse) - assert_equal("text/plain", email.parts[0].mime_type) - assert_equal("text/html", email.parts[1].mime_type) - end - end - - test "explicit multipart with attachments creates nested parts" do - email = BaseMailer.explicit_multipart(:attachments => true) - assert_equal("application/pdf", email.parts[0].mime_type) - assert_equal("multipart/alternative", email.parts[1].mime_type) - assert_equal("text/plain", email.parts[1].parts[0].mime_type) - assert_equal("TEXT Explicit Multipart", email.parts[1].parts[0].body.encoded) - assert_equal("text/html", email.parts[1].parts[1].mime_type) - assert_equal("HTML Explicit Multipart", email.parts[1].parts[1].body.encoded) - end - - test "explicit multipart with templates" do - email = BaseMailer.explicit_multipart_templates - assert_equal(2, email.parts.size) - assert_equal("multipart/alternative", email.mime_type) - assert_equal("text/html", email.parts[0].mime_type) - assert_equal("HTML Explicit Multipart Templates", email.parts[0].body.encoded) - assert_equal("text/plain", email.parts[1].mime_type) - assert_equal("TEXT Explicit Multipart Templates", email.parts[1].body.encoded) - end - - test "explicit multipart with format.any" do - email = BaseMailer.explicit_multipart_with_any - assert_equal(2, email.parts.size) - assert_equal("multipart/alternative", email.mime_type) - assert_equal("text/plain", email.parts[0].mime_type) - assert_equal("Format with any!", email.parts[0].body.encoded) - assert_equal("text/html", email.parts[1].mime_type) - assert_equal("Format with any!", email.parts[1].body.encoded) - end - - test "explicit multipart with format(Hash)" do - email = BaseMailer.explicit_multipart_with_options(true) - email.ready_to_send! - assert_equal(2, email.parts.size) - assert_equal("multipart/alternative", email.mime_type) - assert_equal("text/plain", email.parts[0].mime_type) - assert_equal("base64", email.parts[0].content_transfer_encoding) - assert_equal("text/html", email.parts[1].mime_type) - assert_equal("7bit", email.parts[1].content_transfer_encoding) - end - - test "explicit multipart with one part is rendered as body and options are merged" do - email = BaseMailer.explicit_multipart_with_options - assert_equal(0, email.parts.size) - assert_equal("text/plain", email.mime_type) - assert_equal("base64", email.content_transfer_encoding) - end - - test "explicit multipart with one template has the expected format" do - email = BaseMailer.explicit_multipart_with_one_template - assert_equal(2, email.parts.size) - assert_equal("multipart/alternative", email.mime_type) - assert_equal("text/html", email.parts[0].mime_type) - assert_equal("[:html]", email.parts[0].body.encoded) - assert_equal("text/plain", email.parts[1].mime_type) - assert_equal("[:text]", email.parts[1].body.encoded) - end - - # Class level API with method missing - test "should respond to action methods" do - assert_respond_to BaseMailer, :welcome - assert_respond_to BaseMailer, :implicit_multipart - assert !BaseMailer.respond_to?(:mail) - assert !BaseMailer.respond_to?(:headers) - end - - test "calling just the action should return the generated mail object" do - BaseMailer.deliveries.clear - email = BaseMailer.welcome - assert_equal(0, BaseMailer.deliveries.length) - assert_equal('The first email on new API!', email.subject) - end - - test "calling deliver on the action should deliver the mail object" do - BaseMailer.deliveries.clear - BaseMailer.expects(:deliver_mail).once - mail = BaseMailer.welcome.deliver - assert_instance_of Mail::Message, mail - end - - test "calling deliver on the action should increment the deliveries collection if using the test mailer" do - BaseMailer.delivery_method = :test - BaseMailer.deliveries.clear - BaseMailer.welcome.deliver - assert_equal(1, BaseMailer.deliveries.length) - end - - test "calling deliver, ActionMailer should yield back to mail to let it call :do_delivery on itself" do - mail = Mail::Message.new - mail.expects(:do_delivery).once - BaseMailer.expects(:welcome).returns(mail) - BaseMailer.welcome.deliver - end - - # Rendering - test "you can specify a different template for implicit render" do - mail = BaseMailer.implicit_different_template('implicit_multipart').deliver - assert_equal("HTML Implicit Multipart", mail.html_part.body.decoded) - assert_equal("TEXT Implicit Multipart", mail.text_part.body.decoded) - end - - test "render :file uses render :template semantics and is deprecated" do - mail = nil - assert_deprecated { mail = BaseMailer.implicit_different_template_with_file('implicit_multipart').deliver } - assert_equal("HTML Implicit Multipart", mail.html_part.body.decoded) - assert_equal("TEXT Implicit Multipart", mail.text_part.body.decoded) - end - - test "you can specify a different template for explicit render" do - mail = BaseMailer.explicit_different_template('explicit_multipart_templates').deliver - assert_equal("HTML Explicit Multipart Templates", mail.html_part.body.decoded) - assert_equal("TEXT Explicit Multipart Templates", mail.text_part.body.decoded) - end - - test "you can specify a different layout" do - mail = BaseMailer.different_layout('different_layout').deliver - assert_equal("HTML -- HTML", mail.html_part.body.decoded) - assert_equal("PLAIN -- PLAIN", mail.text_part.body.decoded) - end - - test "you can specify the template path for implicit lookup" do - mail = BaseMailer.welcome_from_another_path('another.path/base_mailer').deliver - assert_equal("Welcome from another path", mail.body.encoded) - - mail = BaseMailer.welcome_from_another_path(['unknown/invalid', 'another.path/base_mailer']).deliver - assert_equal("Welcome from another path", mail.body.encoded) - end - - test "assets tags should use ActionMailer's asset_host settings" do - ActionMailer::Base.config.asset_host = "http://global.com" - ActionMailer::Base.config.assets_dir = "global/" - - mail = AssetMailer.welcome - - assert_equal(%{Dummy}, mail.body.to_s.strip) - end - - test "assets tags should use a Mailer's asset_host settings when available" do - ActionMailer::Base.config.asset_host = "global.com" - ActionMailer::Base.config.assets_dir = "global/" - - AssetMailer.asset_host = "http://local.com" - - mail = AssetMailer.welcome - - assert_equal(%{Dummy}, mail.body.to_s.strip) - end - - # Before and After hooks - - class MyObserver - def self.delivered_email(mail) - end - end - - test "you can register an observer to the mail object that gets informed on email delivery" do - ActionMailer::Base.register_observer(MyObserver) - mail = BaseMailer.welcome - MyObserver.expects(:delivered_email).with(mail) - mail.deliver - end - - class MyInterceptor - def self.delivering_email(mail) - end - end - - test "you can register an interceptor to the mail object that gets passed the mail object before delivery" do - ActionMailer::Base.register_interceptor(MyInterceptor) - mail = BaseMailer.welcome - MyInterceptor.expects(:delivering_email).with(mail) - mail.deliver - end - - test "being able to put proc's into the defaults hash and they get evaluated on mail sending" do - mail1 = ProcMailer.welcome - yesterday = 1.day.ago - Time.stubs(:now).returns(yesterday) - mail2 = ProcMailer.welcome - assert(mail1['X-Proc-Method'].to_s.to_i > mail2['X-Proc-Method'].to_s.to_i) - end - - test "we can call other defined methods on the class as needed" do - mail = ProcMailer.welcome - assert_equal("Thanks for signing up this afternoon", mail.subject) - end - - test "action methods should be refreshed after defining new method" do - class FooMailer < ActionMailer::Base - # this triggers action_methods - self.respond_to?(:foo) - - def notify - end - end - - assert_equal ["notify"], FooMailer.action_methods - end - - protected - - # Execute the block setting the given values and restoring old values after - # the block is executed. - def swap(klass, new_values) - old_values = {} - new_values.each do |key, value| - old_values[key] = klass.send key - klass.send :"#{key}=", value - end - yield - ensure - old_values.each do |key, value| - klass.send :"#{key}=", value - end - end - - def with_default(klass, new_values) - old = klass.default_params - klass.default(new_values) - yield - ensure - klass.default_params = old - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/delivery_methods_test.rb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/delivery_methods_test.rb deleted file mode 100644 index 1d47b5c23..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/delivery_methods_test.rb +++ /dev/null @@ -1,172 +0,0 @@ -require 'abstract_unit' -require 'mail' - -class MyCustomDelivery -end - -class BogusDelivery - def initialize(*) - end - - def deliver!(mail) - raise "failed" - end -end - -class DefaultsDeliveryMethodsTest < ActiveSupport::TestCase - test "default smtp settings" do - settings = { :address => "localhost", - :port => 25, - :domain => 'localhost.localdomain', - :user_name => nil, - :password => nil, - :authentication => nil, - :enable_starttls_auto => true } - assert_equal settings, ActionMailer::Base.smtp_settings - end - - test "default file delivery settings" do - settings = {:location => "#{Dir.tmpdir}/mails"} - assert_equal settings, ActionMailer::Base.file_settings - end - - test "default sendmail settings" do - settings = {:location => '/usr/sbin/sendmail', - :arguments => '-i -t'} - assert_equal settings, ActionMailer::Base.sendmail_settings - end -end - -class CustomDeliveryMethodsTest < ActiveSupport::TestCase - def setup - @old_delivery_method = ActionMailer::Base.delivery_method - ActionMailer::Base.add_delivery_method :custom, MyCustomDelivery - end - - def teardown - ActionMailer::Base.delivery_method = @old_delivery_method - new = ActionMailer::Base.delivery_methods.dup - new.delete(:custom) - ActionMailer::Base.delivery_methods = new - end - - test "allow to add custom delivery method" do - ActionMailer::Base.delivery_method = :custom - assert_equal :custom, ActionMailer::Base.delivery_method - end - - test "allow to customize custom settings" do - ActionMailer::Base.custom_settings = { :foo => :bar } - assert_equal Hash[:foo => :bar], ActionMailer::Base.custom_settings - end - - test "respond to custom settings" do - assert_respond_to ActionMailer::Base, :custom_settings - assert_respond_to ActionMailer::Base, :custom_settings= - end - - test "does not respond to unknown settings" do - assert_raise NoMethodError do - ActionMailer::Base.another_settings - end - end -end - -class MailDeliveryTest < ActiveSupport::TestCase - class DeliveryMailer < ActionMailer::Base - DEFAULT_HEADERS = { - :to => 'mikel@test.lindsaar.net', - :from => 'jose@test.plataformatec.com' - } - - def welcome(hash={}) - mail(DEFAULT_HEADERS.merge(hash)) - end - end - - def setup - ActionMailer::Base.delivery_method = :smtp - end - - def teardown - DeliveryMailer.delivery_method = :smtp - DeliveryMailer.perform_deliveries = true - DeliveryMailer.raise_delivery_errors = true - end - - test "ActionMailer should be told when Mail gets delivered" do - DeliveryMailer.deliveries.clear - DeliveryMailer.expects(:deliver_mail).once - DeliveryMailer.welcome.deliver - end - - test "delivery method can be customized per instance" do - email = DeliveryMailer.welcome.deliver - assert_instance_of Mail::SMTP, email.delivery_method - email = DeliveryMailer.welcome(:delivery_method => :test).deliver - assert_instance_of Mail::TestMailer, email.delivery_method - end - - test "delivery method can be customized in subclasses not changing the parent" do - DeliveryMailer.delivery_method = :test - assert_equal :smtp, ActionMailer::Base.delivery_method - $BREAK = true - email = DeliveryMailer.welcome.deliver - assert_instance_of Mail::TestMailer, email.delivery_method - end - - test "non registered delivery methods raises errors" do - DeliveryMailer.delivery_method = :unknown - assert_raise RuntimeError do - DeliveryMailer.welcome.deliver - end - end - - test "does not perform deliveries if requested" do - DeliveryMailer.perform_deliveries = false - DeliveryMailer.deliveries.clear - Mail::Message.any_instance.expects(:deliver!).never - DeliveryMailer.welcome.deliver - end - - test "does not append the deliveries collection if told not to perform the delivery" do - DeliveryMailer.perform_deliveries = false - DeliveryMailer.deliveries.clear - DeliveryMailer.welcome.deliver - assert_equal(0, DeliveryMailer.deliveries.length) - end - - test "raise errors on bogus deliveries" do - DeliveryMailer.delivery_method = BogusDelivery - DeliveryMailer.deliveries.clear - assert_raise RuntimeError do - DeliveryMailer.welcome.deliver - end - end - - test "does not increment the deliveries collection on error" do - DeliveryMailer.delivery_method = BogusDelivery - DeliveryMailer.deliveries.clear - assert_raise RuntimeError do - DeliveryMailer.welcome.deliver - end - assert_equal(0, DeliveryMailer.deliveries.length) - end - - test "does not raise errors on bogus deliveries if set" do - DeliveryMailer.delivery_method = BogusDelivery - DeliveryMailer.raise_delivery_errors = false - assert_nothing_raised do - DeliveryMailer.welcome.deliver - end - end - - test "does not increment the deliveries collection on bogus deliveries" do - DeliveryMailer.delivery_method = BogusDelivery - DeliveryMailer.raise_delivery_errors = false - DeliveryMailer.deliveries.clear - DeliveryMailer.welcome.deliver - assert_equal(0, DeliveryMailer.deliveries.length) - end - -end diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/another.path/base_mailer/welcome.erb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/another.path/base_mailer/welcome.erb deleted file mode 100644 index ef451298e..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/another.path/base_mailer/welcome.erb +++ /dev/null @@ -1 +0,0 @@ -Welcome from another path \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/asset_host_mailer/email_with_asset.html.erb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/asset_host_mailer/email_with_asset.html.erb deleted file mode 100644 index b3f0438d0..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/asset_host_mailer/email_with_asset.html.erb +++ /dev/null @@ -1 +0,0 @@ -<%= image_tag "somelogo.png" %> \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/asset_mailer/welcome.html.erb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/asset_mailer/welcome.html.erb deleted file mode 100644 index 90d26130d..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/asset_mailer/welcome.html.erb +++ /dev/null @@ -1 +0,0 @@ -<%= image_tag "dummy.png" %> \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/attachments/foo.jpg b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/attachments/foo.jpg deleted file mode 100644 index b976fe5e002bf58f55dedbf9a147aa6df9bf39b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2029 zcma)6dpK0<8eelYjlmi-!eGt}B9!}m%VmUNyUj?MXo{iB5yg&SOOi39BL+pv{Z^aZ zCK8Uzo^h+=2x&Vmd$-ZBwN1(;IZ<;~>Zx=7JHPd;=lQg@;Cy4NF)%{ z)zs9~|MCSe85tQloSX^>s*sfMN~AA=|92r30eB2x3WOqHcmR%vA@DG156}zQLBL=z zNdIS`5J)r}fSCWKp-LbCBnpIV!XYEj<})B3j|8cTD2lNOLCevJh&I(Wx3I)R2Vn^G z4yYQR00Z!F1XYnhF>zu=;vNSfK82 z&>I|IeY{zj!00J;$I&^$lrU9p7W#&n`fpd62PcBZx4uPQ>_wO20<9l)R)PkQa12yv z7z&<=@l8c%*a_T;0=L_h?!{R|IxX$OGrZNlroctRskeLE1uxu!9N%1@#kR$reGr-0 z^{>kq-^8N(Lb=qO_gRwIvGq;A^}&{BV`=@3hR0I8+8K42!;SX8Um{YS(w#okygWMA z#hJ`*31?3gbgC^W_eX5S>cn~uxn)2HDq`QORlnq{MwEoLDj!_gXRo=KZ`n79OEs(i zTeWY~Wu*E(NSHe@cIV*Z-aMM3ojM(YwRdwzgacvQ1T-)x_}Wu3m0^6lwqKHZb}^+j zMwrOm4kA7V|F{!mkm<3kw^SuVR6qhR+gBI+YP+;iPGK(x7{EHn4ry@s~+|HvfncN_&f+^c+O#iEMt0kNuu)t2{@ zVzS!l`x`suw(PTW8|P<_4(}WP!}qT%ylK+w(I%?xFJ6A+yBE{Pcp6iqUE8*x@4|sP zevoNcf5yu>cUEFRdaLooP`g^&34ZF@J=wdaiSc znEVKwH!vUs90unIzbe2($4q}STz|;tQGO+qegB?m*C(pNq+Hc>n+BDa{I6SvsNEDi z>lp}t=p{7e)YUybe5037*O&xcI54$ zChQLQ)bWqW9F_NJe3NuV=N;w9gzj#Y9LFP|Lo!8hMuu-PLqp23h--X1S8;YeN4B{y zJx@W$AxzvaX?PCZ@bxzUvU|9Hvbc&b%4YQqH-~OX62M0d!!f4E?-TWI4KgwaNlYp5 zr5&I^t|B1QjTatPHCH`Pe`wTLY?C#kuMwP4(|bmQ?2ju~TDWrm7c_k;qS9BKXkP!1 zK7M#eae6ZKO42!Qt6l?L}u8ZIMkh;sf;Y>ERfKd)K=HRaB=Q*qvk=cc;XwIiQ}w1vRrxFU6bv4!J!_3G>nlmnL!fD*eWv& zv%tQAl%64kNGpIc=X|mui}NsAQaNFwM?6;yW@0F5KJ9GUv5TYndqEzwW7tM1wwQ~2 zb>+QEQ$@$_^}o<9WpUn=e3<}H-kwea>w6@@J+&Ok{z#W`o`vVtN#$?frs;CzHASr5 z)6C%`t^&K}@FoGOWjuW{AUf81!yqx_h&GAubHK`_#KplzrAHFQ*K|xynpc@sH#^tN byIhVj-iS)$Q858g9Rv}WnzjIqz{Gz5qc95o diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/attachments/test.jpg b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/attachments/test.jpg deleted file mode 100644 index b976fe5e002bf58f55dedbf9a147aa6df9bf39b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2029 zcma)6dpK0<8eelYjlmi-!eGt}B9!}m%VmUNyUj?MXo{iB5yg&SOOi39BL+pv{Z^aZ zCK8Uzo^h+=2x&Vmd$-ZBwN1(;IZ<;~>Zx=7JHPd;=lQg@;Cy4NF)%{ z)zs9~|MCSe85tQloSX^>s*sfMN~AA=|92r30eB2x3WOqHcmR%vA@DG156}zQLBL=z zNdIS`5J)r}fSCWKp-LbCBnpIV!XYEj<})B3j|8cTD2lNOLCevJh&I(Wx3I)R2Vn^G z4yYQR00Z!F1XYnhF>zu=;vNSfK82 z&>I|IeY{zj!00J;$I&^$lrU9p7W#&n`fpd62PcBZx4uPQ>_wO20<9l)R)PkQa12yv z7z&<=@l8c%*a_T;0=L_h?!{R|IxX$OGrZNlroctRskeLE1uxu!9N%1@#kR$reGr-0 z^{>kq-^8N(Lb=qO_gRwIvGq;A^}&{BV`=@3hR0I8+8K42!;SX8Um{YS(w#okygWMA z#hJ`*31?3gbgC^W_eX5S>cn~uxn)2HDq`QORlnq{MwEoLDj!_gXRo=KZ`n79OEs(i zTeWY~Wu*E(NSHe@cIV*Z-aMM3ojM(YwRdwzgacvQ1T-)x_}Wu3m0^6lwqKHZb}^+j zMwrOm4kA7V|F{!mkm<3kw^SuVR6qhR+gBI+YP+;iPGK(x7{EHn4ry@s~+|HvfncN_&f+^c+O#iEMt0kNuu)t2{@ zVzS!l`x`suw(PTW8|P<_4(}WP!}qT%ylK+w(I%?xFJ6A+yBE{Pcp6iqUE8*x@4|sP zevoNcf5yu>cUEFRdaLooP`g^&34ZF@J=wdaiSc znEVKwH!vUs90unIzbe2($4q}STz|;tQGO+qegB?m*C(pNq+Hc>n+BDa{I6SvsNEDi z>lp}t=p{7e)YUybe5037*O&xcI54$ zChQLQ)bWqW9F_NJe3NuV=N;w9gzj#Y9LFP|Lo!8hMuu-PLqp23h--X1S8;YeN4B{y zJx@W$AxzvaX?PCZ@bxzUvU|9Hvbc&b%4YQqH-~OX62M0d!!f4E?-TWI4KgwaNlYp5 zr5&I^t|B1QjTatPHCH`Pe`wTLY?C#kuMwP4(|bmQ?2ju~TDWrm7c_k;qS9BKXkP!1 zK7M#eae6ZKO42!Qt6l?L}u8ZIMkh;sf;Y>ERfKd)K=HRaB=Q*qvk=cc;XwIiQ}w1vRrxFU6bv4!J!_3G>nlmnL!fD*eWv& zv%tQAl%64kNGpIc=X|mui}NsAQaNFwM?6;yW@0F5KJ9GUv5TYndqEzwW7tM1wwQ~2 zb>+QEQ$@$_^}o<9WpUn=e3<}H-kwea>w6@@J+&Ok{z#W`o`vVtN#$?frs;CzHASr5 z)6C%`t^&K}@FoGOWjuW{AUf81!yqx_h&GAubHK`_#KplzrAHFQ*K|xynpc@sH#^tN byIhVj-iS)$Q858g9Rv}WnzjIqz{Gz5qc95o diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/auto_layout_mailer/hello.html.erb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/auto_layout_mailer/hello.html.erb deleted file mode 100644 index 54950788f..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/auto_layout_mailer/hello.html.erb +++ /dev/null @@ -1 +0,0 @@ -Inside \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/auto_layout_mailer/multipart.html.erb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/auto_layout_mailer/multipart.html.erb deleted file mode 100644 index 6d73f199c..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/auto_layout_mailer/multipart.html.erb +++ /dev/null @@ -1 +0,0 @@ -text/html multipart \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/auto_layout_mailer/multipart.text.erb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/auto_layout_mailer/multipart.text.erb deleted file mode 100644 index f4b91e403..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/auto_layout_mailer/multipart.text.erb +++ /dev/null @@ -1 +0,0 @@ -text/plain multipart \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/attachment_with_content.erb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/attachment_with_content.erb deleted file mode 100644 index deb9dbd03..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/attachment_with_content.erb +++ /dev/null @@ -1 +0,0 @@ -Attachment with content \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/different_layout.html.erb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/different_layout.html.erb deleted file mode 100644 index 3225efc49..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/different_layout.html.erb +++ /dev/null @@ -1 +0,0 @@ -HTML \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/different_layout.text.erb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/different_layout.text.erb deleted file mode 100644 index b547f4a33..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/different_layout.text.erb +++ /dev/null @@ -1 +0,0 @@ -PLAIN \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/email_custom_layout.text.html.erb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/email_custom_layout.text.html.erb deleted file mode 100644 index a2187308b..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/email_custom_layout.text.html.erb +++ /dev/null @@ -1 +0,0 @@ -body_text \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/email_with_translations.html.erb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/email_with_translations.html.erb deleted file mode 100644 index 30466dd00..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/email_with_translations.html.erb +++ /dev/null @@ -1 +0,0 @@ -<%= t('.greet_user', :name => 'lifo') %> \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/explicit_multipart_templates.html.erb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/explicit_multipart_templates.html.erb deleted file mode 100644 index c0a61b624..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/explicit_multipart_templates.html.erb +++ /dev/null @@ -1 +0,0 @@ -HTML Explicit Multipart Templates \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/explicit_multipart_templates.text.erb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/explicit_multipart_templates.text.erb deleted file mode 100644 index 507230b1d..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/explicit_multipart_templates.text.erb +++ /dev/null @@ -1 +0,0 @@ -TEXT Explicit Multipart Templates \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/explicit_multipart_with_one_template.erb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/explicit_multipart_with_one_template.erb deleted file mode 100644 index 8a69657b0..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/explicit_multipart_with_one_template.erb +++ /dev/null @@ -1 +0,0 @@ -<%= self.formats.inspect %> \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/html_only.html.erb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/html_only.html.erb deleted file mode 100644 index 9c99a008e..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/html_only.html.erb +++ /dev/null @@ -1 +0,0 @@ -

Testing

\ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/implicit_multipart.html.erb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/implicit_multipart.html.erb deleted file mode 100644 index 23745cd28..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/implicit_multipart.html.erb +++ /dev/null @@ -1 +0,0 @@ -HTML Implicit Multipart \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/implicit_multipart.text.erb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/implicit_multipart.text.erb deleted file mode 100644 index d51437fc7..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/implicit_multipart.text.erb +++ /dev/null @@ -1 +0,0 @@ -TEXT Implicit Multipart \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/implicit_with_locale.en.html.erb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/implicit_with_locale.en.html.erb deleted file mode 100644 index 34e39c8fd..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/implicit_with_locale.en.html.erb +++ /dev/null @@ -1 +0,0 @@ -Implicit with locale EN HTML \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/implicit_with_locale.html.erb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/implicit_with_locale.html.erb deleted file mode 100644 index 5ce283f22..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/implicit_with_locale.html.erb +++ /dev/null @@ -1 +0,0 @@ -Implicit with locale HTML \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/implicit_with_locale.pl.text.erb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/implicit_with_locale.pl.text.erb deleted file mode 100644 index c49cbae60..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/implicit_with_locale.pl.text.erb +++ /dev/null @@ -1 +0,0 @@ -Implicit with locale PL TEXT \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/implicit_with_locale.text.erb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/implicit_with_locale.text.erb deleted file mode 100644 index 5a18ff62c..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/implicit_with_locale.text.erb +++ /dev/null @@ -1 +0,0 @@ -Implicit with locale TEXT \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/inline_attachment.html.erb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/inline_attachment.html.erb deleted file mode 100644 index 398b488b9..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/inline_attachment.html.erb +++ /dev/null @@ -1,5 +0,0 @@ -

Inline Image

- -<%= image_tag attachments['logo.png'].url %> - -

This is an image that is inline

\ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/inline_attachment.text.erb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/inline_attachment.text.erb deleted file mode 100644 index 14b0a2b53..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/inline_attachment.text.erb +++ /dev/null @@ -1,4 +0,0 @@ -Inline Image - -No image for you - diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/plain_text_only.text.erb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/plain_text_only.text.erb deleted file mode 100644 index 0a9012568..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/plain_text_only.text.erb +++ /dev/null @@ -1 +0,0 @@ -Testing \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/welcome.erb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/welcome.erb deleted file mode 100644 index 01f3f00c6..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/base_mailer/welcome.erb +++ /dev/null @@ -1 +0,0 @@ -Welcome \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/explicit_layout_mailer/logout.html.erb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/explicit_layout_mailer/logout.html.erb deleted file mode 100644 index 0533a3b2f..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/explicit_layout_mailer/logout.html.erb +++ /dev/null @@ -1 +0,0 @@ -You logged out \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/explicit_layout_mailer/signup.html.erb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/explicit_layout_mailer/signup.html.erb deleted file mode 100644 index 4789e888c..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/explicit_layout_mailer/signup.html.erb +++ /dev/null @@ -1 +0,0 @@ -We do not spam \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/first_mailer/share.erb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/first_mailer/share.erb deleted file mode 100644 index 4c543cd05..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/first_mailer/share.erb +++ /dev/null @@ -1 +0,0 @@ -first mail diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/layouts/auto_layout_mailer.html.erb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/layouts/auto_layout_mailer.html.erb deleted file mode 100644 index 932271450..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/layouts/auto_layout_mailer.html.erb +++ /dev/null @@ -1 +0,0 @@ -Hello from layout <%= yield %> \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/layouts/auto_layout_mailer.text.erb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/layouts/auto_layout_mailer.text.erb deleted file mode 100644 index 111576b67..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/layouts/auto_layout_mailer.text.erb +++ /dev/null @@ -1 +0,0 @@ -text/plain layout - <%= yield %> \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/layouts/different_layout.html.erb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/layouts/different_layout.html.erb deleted file mode 100644 index 99eb026ae..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/layouts/different_layout.html.erb +++ /dev/null @@ -1 +0,0 @@ -HTML -- <%= yield %> \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/layouts/different_layout.text.erb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/layouts/different_layout.text.erb deleted file mode 100644 index b93467b7a..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/layouts/different_layout.text.erb +++ /dev/null @@ -1 +0,0 @@ -PLAIN -- <%= yield %> \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/layouts/spam.html.erb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/layouts/spam.html.erb deleted file mode 100644 index 619d6b16b..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/layouts/spam.html.erb +++ /dev/null @@ -1 +0,0 @@ -Spammer layout <%= yield %> \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/nested_layout_mailer/signup.html.erb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/nested_layout_mailer/signup.html.erb deleted file mode 100644 index 4789e888c..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/nested_layout_mailer/signup.html.erb +++ /dev/null @@ -1 +0,0 @@ -We do not spam \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/path.with.dots/funky_path_mailer/multipart_with_template_path_with_dots.erb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/path.with.dots/funky_path_mailer/multipart_with_template_path_with_dots.erb deleted file mode 100644 index 2d0cd5c12..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/path.with.dots/funky_path_mailer/multipart_with_template_path_with_dots.erb +++ /dev/null @@ -1 +0,0 @@ -Have some dots. Enjoy! \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email deleted file mode 100644 index c57bc04bf..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email +++ /dev/null @@ -1,14 +0,0 @@ -From jamis_buck@byu.edu Mon May 2 16:07:05 2005 -Mime-Version: 1.0 (Apple Message framework v622) -Content-Transfer-Encoding: base64 -Message-Id: -Content-Type: text/plain; - charset=EUC-KR; - format=flowed -To: willard15georgina@jamis.backpackit.com -From: Jamis Buck -Subject: =?EUC-KR?Q?NOTE:_=C7=D1=B1=B9=B8=BB=B7=CE_=C7=CF=B4=C2_=B0=CD?= -Date: Mon, 2 May 2005 16:07:05 -0600 - -tOu6zrrQwMcguLbC+bChwfa3ziwgv+y4rrTCIMfPs6q01MC7ILnPvcC0z7TZLg0KDQrBpiDAzLin -wLogSmFtaXPA1LTPtNku diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email10 b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email10 deleted file mode 100644 index 8b61289fc..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email10 +++ /dev/null @@ -1,20 +0,0 @@ -Return-Path: -Received: from xxx.xxxx.xxx by xxx.xxxx.xxx with ESMTP id C1B953B4CB6 for ; Tue, 10 May 2005 15:27:05 -0500 -Received: from SMS-GTYxxx.xxxx.xxx by xxx.xxxx.xxx with ESMTP id ca for ; Tue, 10 May 2005 15:27:04 -0500 -Received: from xxx.xxxx.xxx by SMS-GTYxxx.xxxx.xxx with ESMTP id j4AKR3r23323 for ; Tue, 10 May 2005 15:27:03 -0500 -Date: Tue, 10 May 2005 15:27:03 -0500 -From: xxx@xxxx.xxx -Sender: xxx@xxxx.xxx -To: xxxxxxxxxxx@xxxx.xxxx.xxx -Message-Id: -X-Original-To: xxxxxxxxxxx@xxxx.xxxx.xxx -Delivered-To: xxx@xxxx.xxx -Importance: normal -Content-Type: text/plain; charset=X-UNKNOWN - -Test test. Hi. Waving. m - ----------------------------------------------------------------- -Sent via Bell Mobility's Text Messaging service. -Envoyé par le service de messagerie texte de Bell Mobilité. ----------------------------------------------------------------- diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email12 b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email12 deleted file mode 100644 index 123d7d358..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email12 +++ /dev/null @@ -1,32 +0,0 @@ -Mime-Version: 1.0 (Apple Message framework v730) -Content-Type: multipart/mixed; boundary=Apple-Mail-13-196941151 -Message-Id: <9169D984-4E0B-45EF-82D4-8F5E53AD7012@example.com> -From: foo@example.com -Subject: testing -Date: Mon, 6 Jun 2005 22:21:22 +0200 -To: blah@example.com - - ---Apple-Mail-13-196941151 -Content-Transfer-Encoding: quoted-printable -Content-Type: text/plain; - charset=ISO-8859-1; - delsp=yes; - format=flowed - -This is the first part. - ---Apple-Mail-13-196941151 -Content-Type: image/jpeg -Content-Transfer-Encoding: base64 -Content-Location: Photo25.jpg -Content-ID: -Content-Disposition: inline - -jamisSqGSIb3DQEHAqCAMIjamisxCzAJBgUrDgMCGgUAMIAGCSqGSjamisEHAQAAoIIFSjCCBUYw -ggQujamisQICBD++ukQwDQYJKojamisNAQEFBQAwMTELMAkGA1UEBhMCRjamisAKBgNVBAoTA1RE -QzEUMBIGjamisxMLVERDIE9DRVMgQ0jamisNMDQwMjI5MTE1OTAxWhcNMDYwMjamisIyOTAxWjCB -gDELMAkGA1UEjamisEsxKTAnBgNVBAoTIEjamisuIG9yZ2FuaXNhdG9yaXNrIHRpbjamisRuaW5= - ---Apple-Mail-13-196941151-- - diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email13 b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email13 deleted file mode 100644 index a7e10d37b..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email13 +++ /dev/null @@ -1,29 +0,0 @@ -Mime-Version: 1.0 (Apple Message framework v730) -Content-Type: multipart/mixed; boundary=Apple-Mail-13-196941151 -Message-Id: <9169D984-4E0B-45EF-82D4-8F5E53AD7012@example.com> -From: foo@example.com -Subject: testing -Date: Mon, 6 Jun 2005 22:21:22 +0200 -To: blah@example.com - - ---Apple-Mail-13-196941151 -Content-Transfer-Encoding: quoted-printable -Content-Type: text/plain; - charset=ISO-8859-1; - delsp=yes; - format=flowed - -This is the first part. - ---Apple-Mail-13-196941151 -Content-Type: text/x-ruby-script; name="hello.rb" -Content-Transfer-Encoding: 7bit -Content-Disposition: attachment; - filename="api.rb" - -puts "Hello, world!" -gets - ---Apple-Mail-13-196941151-- - diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email2 b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email2 deleted file mode 100644 index 7c16a4f46..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email2 +++ /dev/null @@ -1,114 +0,0 @@ -From xxxxxxxxx.xxxxxxx@gmail.com Sun May 8 19:07:09 2005 -Return-Path: -X-Original-To: xxxxx@xxxxx.xxxxxxxxx.com -Delivered-To: xxxxx@xxxxx.xxxxxxxxx.com -Received: from localhost (localhost [127.0.0.1]) - by xxxxx.xxxxxxxxx.com (Postfix) with ESMTP id 06C9DA98D - for ; Sun, 8 May 2005 19:09:13 +0000 (GMT) -Received: from xxxxx.xxxxxxxxx.com ([127.0.0.1]) - by localhost (xxxxx.xxxxxxxxx.com [127.0.0.1]) (amavisd-new, port 10024) - with LMTP id 88783-08 for ; - Sun, 8 May 2005 19:09:12 +0000 (GMT) -Received: from xxxxxxx.xxxxxxxxx.com (xxxxxxx.xxxxxxxxx.com [69.36.39.150]) - by xxxxx.xxxxxxxxx.com (Postfix) with ESMTP id 10D8BA960 - for ; Sun, 8 May 2005 19:09:12 +0000 (GMT) -Received: from zproxy.gmail.com (zproxy.gmail.com [64.233.162.199]) - by xxxxxxx.xxxxxxxxx.com (Postfix) with ESMTP id 9EBC4148EAB - for ; Sun, 8 May 2005 14:09:11 -0500 (CDT) -Received: by zproxy.gmail.com with SMTP id 13so1233405nzp - for ; Sun, 08 May 2005 12:09:11 -0700 (PDT) -DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; - s=beta; d=gmail.com; - h=received:message-id:date:from:reply-to:to:subject:in-reply-to:mime-version:content-type:references; - b=cid1mzGEFa3gtRa06oSrrEYfKca2CTKu9sLMkWxjbvCsWMtp9RGEILjUz0L5RySdH5iO661LyNUoHRFQIa57bylAbXM3g2DTEIIKmuASDG3x3rIQ4sHAKpNxP7Pul+mgTaOKBv+spcH7af++QEJ36gHFXD2O/kx9RePs3JNf/K8= -Received: by 10.36.10.16 with SMTP id 16mr1012493nzj; - Sun, 08 May 2005 12:09:11 -0700 (PDT) -Received: by 10.36.5.10 with HTTP; Sun, 8 May 2005 12:09:11 -0700 (PDT) -Message-ID: -Date: Sun, 8 May 2005 14:09:11 -0500 -From: xxxxxxxxx xxxxxxx -Reply-To: xxxxxxxxx xxxxxxx -To: xxxxx xxxx -Subject: Fwd: Signed email causes file attachments -In-Reply-To: -Mime-Version: 1.0 -Content-Type: multipart/mixed; - boundary="----=_Part_5028_7368284.1115579351471" -References: - -------=_Part_5028_7368284.1115579351471 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: quoted-printable -Content-Disposition: inline - -We should not include these files or vcards as attachments. - ----------- Forwarded message ---------- -From: xxxxx xxxxxx -Date: May 8, 2005 1:17 PM -Subject: Signed email causes file attachments -To: xxxxxxx@xxxxxxxxxx.com - - -Hi, - -Just started to use my xxxxxxxx account (to set-up a GTD system, -natch) and noticed that when I send content via email the signature/ -certificate from my email account gets added as a file (e.g. -"smime.p7s"). - -Obviously I can uncheck the signature option in the Mail compose -window but how often will I remember to do that? - -Is there any way these kind of files could be ignored, e.g. via some -sort of exclusions list? - -------=_Part_5028_7368284.1115579351471 -Content-Type: application/pkcs7-signature; name=smime.p7s -Content-Transfer-Encoding: base64 -Content-Disposition: attachment; filename="smime.p7s" - -MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAQAAoIIGFDCCAs0w -ggI2oAMCAQICAw5c+TANBgkqhkiG9w0BAQQFADBiMQswCQYDVQQGEwJaQTElMCMGA1UEChMcVGhh -d3RlIENvbnN1bHRpbmcgKFB0eSkgTHRkLjEsMCoGA1UEAxMjVGhhd3RlIFBlcnNvbmFsIEZyZWVt -YWlsIElzc3VpbmcgQ0EwHhcNMDUwMzI5MDkzOTEwWhcNMDYwMzI5MDkzOTEwWjBCMR8wHQYDVQQD -ExZUaGF3dGUgRnJlZW1haWwgTWVtYmVyMR8wHQYJKoZIhvcNAQkBFhBzbWhhdW5jaEBtYWMuY29t -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAn90dPsYS3LjfMY211OSYrDQLzwNYPlAL -7+/0XA+kdy8/rRnyEHFGwhNCDmg0B6pxC7z3xxJD/8GfCd+IYUUNUQV5m9MkxfP9pTVXZVIYLaBw -o8xS3A0a1LXealcmlEbJibmKkEaoXci3MhryLgpaa+Kk/sH02SNatDO1vS28bPsibZpcc6deFrla -hSYnL+PW54mDTGHIcCN2fbx/Y6qspzqmtKaXrv75NBtuy9cB6KzU4j2xXbTkAwz3pRSghJJaAwdp -+yIivAD3vr0kJE3p+Ez34HMh33EXEpFoWcN+MCEQZD9WnmFViMrvfvMXLGVFQfAAcC060eGFSRJ1 -ZQ9UVQIDAQABoy0wKzAbBgNVHREEFDASgRBzbWhhdW5jaEBtYWMuY29tMAwGA1UdEwEB/wQCMAAw -DQYJKoZIhvcNAQEEBQADgYEAQMrg1n2pXVWteP7BBj+Pk3UfYtbuHb42uHcLJjfjnRlH7AxnSwrd -L3HED205w3Cq8T7tzVxIjRRLO/ljq0GedSCFBky7eYo1PrXhztGHCTSBhsiWdiyLWxKlOxGAwJc/ -lMMnwqLOdrQcoF/YgbjeaUFOQbUh94w9VDNpWZYCZwcwggM/MIICqKADAgECAgENMA0GCSqGSIb3 -DQEBBQUAMIHRMQswCQYDVQQGEwJaQTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIwEAYDVQQHEwlD -YXBlIFRvd24xGjAYBgNVBAoTEVRoYXd0ZSBDb25zdWx0aW5nMSgwJgYDVQQLEx9DZXJ0aWZpY2F0 -aW9uIFNlcnZpY2VzIERpdmlzaW9uMSQwIgYDVQQDExtUaGF3dGUgUGVyc29uYWwgRnJlZW1haWwg -Q0ExKzApBgkqhkiG9w0BCQEWHHBlcnNvbmFsLWZyZWVtYWlsQHRoYXd0ZS5jb20wHhcNMDMwNzE3 -MDAwMDAwWhcNMTMwNzE2MjM1OTU5WjBiMQswCQYDVQQGEwJaQTElMCMGA1UEChMcVGhhd3RlIENv -bnN1bHRpbmcgKFB0eSkgTHRkLjEsMCoGA1UEAxMjVGhhd3RlIFBlcnNvbmFsIEZyZWVtYWlsIElz -c3VpbmcgQ0EwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMSmPFVzVftOucqZWh5owHUEcJ3f -6f+jHuy9zfVb8hp2vX8MOmHyv1HOAdTlUAow1wJjWiyJFXCO3cnwK4Vaqj9xVsuvPAsH5/EfkTYk -KhPPK9Xzgnc9A74r/rsYPge/QIACZNenprufZdHFKlSFD0gEf6e20TxhBEAeZBlyYLf7AgMBAAGj -gZQwgZEwEgYDVR0TAQH/BAgwBgEB/wIBADBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3JsLnRo -YXd0ZS5jb20vVGhhd3RlUGVyc29uYWxGcmVlbWFpbENBLmNybDALBgNVHQ8EBAMCAQYwKQYDVR0R -BCIwIKQeMBwxGjAYBgNVBAMTEVByaXZhdGVMYWJlbDItMTM4MA0GCSqGSIb3DQEBBQUAA4GBAEiM -0VCD6gsuzA2jZqxnD3+vrL7CF6FDlpSdf0whuPg2H6otnzYvwPQcUCCTcDz9reFhYsPZOhl+hLGZ -GwDFGguCdJ4lUJRix9sncVcljd2pnDmOjCBPZV+V2vf3h9bGCE6u9uo05RAaWzVNd+NWIXiC3CEZ -Nd4ksdMdRv9dX2VPMYIC5zCCAuMCAQEwaTBiMQswCQYDVQQGEwJaQTElMCMGA1UEChMcVGhhd3Rl -IENvbnN1bHRpbmcgKFB0eSkgTHRkLjEsMCoGA1UEAxMjVGhhd3RlIFBlcnNvbmFsIEZyZWVtYWls -IElzc3VpbmcgQ0ECAw5c+TAJBgUrDgMCGgUAoIIBUzAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcB -MBwGCSqGSIb3DQEJBTEPFw0wNTA1MDgxODE3NDZaMCMGCSqGSIb3DQEJBDEWBBQSkG9j6+hB0pKp -fV9tCi/iP59sNTB4BgkrBgEEAYI3EAQxazBpMGIxCzAJBgNVBAYTAlpBMSUwIwYDVQQKExxUaGF3 -dGUgQ29uc3VsdGluZyAoUHR5KSBMdGQuMSwwKgYDVQQDEyNUaGF3dGUgUGVyc29uYWwgRnJlZW1h -aWwgSXNzdWluZyBDQQIDDlz5MHoGCyqGSIb3DQEJEAILMWugaTBiMQswCQYDVQQGEwJaQTElMCMG -A1UEChMcVGhhd3RlIENvbnN1bHRpbmcgKFB0eSkgTHRkLjEsMCoGA1UEAxMjVGhhd3RlIFBlcnNv -bmFsIEZyZWVtYWlsIElzc3VpbmcgQ0ECAw5c+TANBgkqhkiG9w0BAQEFAASCAQAm1GeF7dWfMvrW -8yMPjkhE+R8D1DsiCoWSCp+5gAQm7lcK7V3KrZh5howfpI3TmCZUbbaMxOH+7aKRKpFemxoBY5Q8 -rnCkbpg/++/+MI01T69hF/rgMmrGcrv2fIYy8EaARLG0xUVFSZHSP+NQSYz0TTmh4cAESHMzY3JA -nHOoUkuPyl8RXrimY1zn0lceMXlweZRouiPGuPNl1hQKw8P+GhOC5oLlM71UtStnrlk3P9gqX5v7 -Tj7Hx057oVfY8FMevjxGwU3EK5TczHezHbWWgTyum9l2ZQbUQsDJxSniD3BM46C1VcbDLPaotAZ0 -fTYLZizQfm5hcWEbfYVzkSzLAAAAAAAA -------=_Part_5028_7368284.1115579351471-- - diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email3 b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email3 deleted file mode 100644 index 8c05980b3..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email3 +++ /dev/null @@ -1,70 +0,0 @@ -From xxxx@xxxx.com Tue May 10 11:28:07 2005 -Return-Path: -X-Original-To: xxxx@xxxx.com -Delivered-To: xxxx@xxxx.com -Received: from localhost (localhost [127.0.0.1]) - by xxx.xxxxx.com (Postfix) with ESMTP id 50FD3A96F - for ; Tue, 10 May 2005 17:26:50 +0000 (GMT) -Received: from xxx.xxxxx.com ([127.0.0.1]) - by localhost (xxx.xxxxx.com [127.0.0.1]) (amavisd-new, port 10024) - with LMTP id 70060-03 for ; - Tue, 10 May 2005 17:26:49 +0000 (GMT) -Received: from xxx.xxxxx.com (xxx.xxxxx.com [69.36.39.150]) - by xxx.xxxxx.com (Postfix) with ESMTP id 8B957A94B - for ; Tue, 10 May 2005 17:26:48 +0000 (GMT) -Received: from xxx.xxxxx.com (xxx.xxxxx.com [64.233.184.203]) - by xxx.xxxxx.com (Postfix) with ESMTP id 9972514824C - for ; Tue, 10 May 2005 12:26:40 -0500 (CDT) -Received: by xxx.xxxxx.com with SMTP id 68so1694448wri - for ; Tue, 10 May 2005 10:26:40 -0700 (PDT) -DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; - s=beta; d=xxxxx.com; - h=received:message-id:date:from:reply-to:to:subject:mime-version:content-type; - b=g8ZO5ttS6GPEMAz9WxrRk9+9IXBUfQIYsZLL6T88+ECbsXqGIgfGtzJJFn6o9CE3/HMrrIGkN5AisxVFTGXWxWci5YA/7PTVWwPOhJff5BRYQDVNgRKqMl/SMttNrrRElsGJjnD1UyQ/5kQmcBxq2PuZI5Zc47u6CILcuoBcM+A= -Received: by 10.54.96.19 with SMTP id t19mr621017wrb; - Tue, 10 May 2005 10:26:39 -0700 (PDT) -Received: by 10.54.110.5 with HTTP; Tue, 10 May 2005 10:26:39 -0700 (PDT) -Message-ID: -Date: Tue, 10 May 2005 11:26:39 -0600 -From: Test Tester -Reply-To: Test Tester -To: xxxx@xxxx.com, xxxx@xxxx.com -Subject: Another PDF -Mime-Version: 1.0 -Content-Type: multipart/mixed; - boundary="----=_Part_2192_32400445.1115745999735" -X-Virus-Scanned: amavisd-new at textdrive.com - -------=_Part_2192_32400445.1115745999735 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: quoted-printable -Content-Disposition: inline - -Just attaching another PDF, here, to see what the message looks like, -and to see if I can figure out what is going wrong here. - -------=_Part_2192_32400445.1115745999735 -Content-Type: application/pdf; name="broken.pdf" -Content-Transfer-Encoding: base64 -Content-Disposition: attachment; filename="broken.pdf" - -JVBERi0xLjQNCiXk9tzfDQoxIDAgb2JqDQo8PCAvTGVuZ3RoIDIgMCBSDQogICAvRmlsdGVyIC9G -bGF0ZURlY29kZQ0KPj4NCnN0cmVhbQ0KeJy9Wt2KJbkNvm/od6jrhZxYln9hWEh2p+8HBvICySaE -ycLuTV4/1ifJ9qnq09NpSBimu76yLUuy/qzqcPz7+em3Ixx/CDc6CsXxs3b5+fvfjr/8cPz6/BRu -rbfAx/n3739/fuJylJ5u5fjX81OuDr4deK4Bz3z/aDP+8fz0yw8g0Ofq7ktr1Mn+u28rvhy/jVeD -QSa+9YNKHP/pxjvDNfVAx/m3MFz54FhvTbaseaxiDoN2LeMVMw+yA7RbHSCDzxZuaYB2E1Yay7QU -x89vz0+tyFDKMlAHK5yqLmnjF+c4RjEiQIUeKwblXMe+AsZjN1J5yGQL5DHpDHksurM81rF6PKab -gK6zAarIDzIiUY23rJsN9iorAE816aIu6lsgAdQFsuhhkHOUFgVjp2GjMqSewITXNQ27jrMeamkg -1rPI3iLWG2CIaSBB+V1245YVRICGbbpYKHc2USFDl6M09acQVQYhlwIrkBNLISvXhGlF1wi5FHCw -wxZkoGNJlVeJCEsqKA+3YAV5AMb6KkeaqEJQmFKKQU8T1pRi2ihE1Y4CDrqoYFFXYjJJOatsyzuI -8SIlykuxKTMibWK8H1PgEvqYgs4GmQSrEjJAalgGirIhik+p4ZQN9E3ETFPAHE1b8pp1l/0Rc1gl -fQs0ABWvyoZZzU8VnPXwVVcO9BEsyjEJaO6eBoZRyKGlrKoYoOygA8BGIzgwN3RQ15ouigG5idZQ -fx2U4Db2CqiLO0WHAZoylGiCAqhniNQjFjQPSkmjwfNTgQ6M1Ih+eWo36wFmjIxDJZiGUBiWsAyR -xX3EekGOizkGI96Ol9zVZTAivikURhRsHh2E3JhWMpSTZCnnonrLhMCodgrNcgo4uyJUJc6qnVss -nrGd1Ptr0YwisCOYyIbUwVjV4xBUNLbguSO2YHujonAMJkMdSI7bIw91Akq2AUlMUWGFTMAOamjU -OvZQCxIkY2pCpMFo/IwLdVLHs6nddwTRrgoVbvLU9eB0G4EMndV0TNoxHbt3JBWwK6hhv3iHfDtF -yokB302IpEBTnWICde4uYc/1khDbSIkQopO6lcqamGBu1OSE3N5IPSsZX00CkSHRiiyx6HQIShsS -HSVNswdVsaOUSAWq9aYhDtGDaoG5a3lBGkYt/lFlBFt1UqrYnzVtUpUQnLiZeouKgf1KhRBViRRk -ExepJCzTwEmFDalIRbLEGtw0gfpESOpIAF/NnpPzcVCG86s0g2DuSyd41uhNGbEgaSrWEXORErbw -------=_Part_2192_32400445.1115745999735-- - diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email4 b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email4 deleted file mode 100644 index a56bd1bf4..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email4 +++ /dev/null @@ -1,59 +0,0 @@ -Return-Path: -Received: from xxx.xxxx.xxx by xxx.xxxx.xxx with ESMTP id 6AAEE3B4D23 for ; Sun, 8 May 2005 12:30:23 -0500 -Received: from xxx.xxxx.xxx by xxx.xxxx.xxx with ESMTP id j48HUC213279 for ; Sun, 8 May 2005 12:30:13 -0500 -Received: from conversion-xxx.xxxx.xxx.net by xxx.xxxx.xxx id <0IG600901LQ64I@xxx.xxxx.xxx> for ; Sun, 8 May 2005 12:30:12 -0500 -Received: from agw1 by xxx.xxxx.xxx with ESMTP id <0IG600JFYLYCAxxx@xxxx.xxx> for ; Sun, 8 May 2005 12:30:12 -0500 -Date: Sun, 8 May 2005 12:30:08 -0500 -From: xxx@xxxx.xxx -To: xxx@xxxx.xxx -Message-Id: <7864245.1115573412626.JavaMxxx@xxxx.xxx> -Subject: Filth -Mime-Version: 1.0 -Content-Type: multipart/mixed; boundary=mimepart_427e4cb4ca329_133ae40413c81ef -X-Mms-Priority: 1 -X-Mms-Transaction-Id: 3198421808-0 -X-Mms-Message-Type: 0 -X-Mms-Sender-Visibility: 1 -X-Mms-Read-Reply: 1 -X-Original-To: xxx@xxxx.xxx -X-Mms-Message-Class: 0 -X-Mms-Delivery-Report: 0 -X-Mms-Mms-Version: 16 -Delivered-To: xxx@xxxx.xxx -X-Nokia-Ag-Version: 2.0 - -This is a multi-part message in MIME format. - ---mimepart_427e4cb4ca329_133ae40413c81ef -Content-Type: multipart/mixed; boundary=mimepart_427e4cb4cbd97_133ae40413c8217 - - - ---mimepart_427e4cb4cbd97_133ae40413c8217 -Content-Type: text/plain; charset=utf-8 -Content-Transfer-Encoding: 7bit -Content-Disposition: inline -Content-Location: text.txt - -Some text - ---mimepart_427e4cb4cbd97_133ae40413c8217-- - ---mimepart_427e4cb4ca329_133ae40413c81ef -Content-Type: text/plain; charset=us-ascii -Content-Transfer-Encoding: 7bit - - --- -This Orange Multi Media Message was sent wirefree from an Orange -MMS phone. If you would like to reply, please text or phone the -sender directly by using the phone number listed in the sender's -address. To learn more about Orange's Multi Media Messaging -Service, find us on the Web at xxx.xxxx.xxx.uk/mms - - ---mimepart_427e4cb4ca329_133ae40413c81ef - - ---mimepart_427e4cb4ca329_133ae40413c81ef- - diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email5 b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email5 deleted file mode 100644 index fdbb243ff..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email5 +++ /dev/null @@ -1,19 +0,0 @@ -Return-Path: -Received: from xxx.xxxx.xxx by xxx.xxxx.xxx with ESMTP id C1B953B4CB6 for ; Tue, 10 May 2005 15:27:05 -0500 -Received: from SMS-GTYxxx.xxxx.xxx by xxx.xxxx.xxx with ESMTP id ca for ; Tue, 10 May 2005 15:27:04 -0500 -Received: from xxx.xxxx.xxx by SMS-GTYxxx.xxxx.xxx with ESMTP id j4AKR3r23323 for ; Tue, 10 May 2005 15:27:03 -0500 -Date: Tue, 10 May 2005 15:27:03 -0500 -From: xxx@xxxx.xxx -Sender: xxx@xxxx.xxx -To: xxxxxxxxxxx@xxxx.xxxx.xxx -Message-Id: -X-Original-To: xxxxxxxxxxx@xxxx.xxxx.xxx -Delivered-To: xxx@xxxx.xxx -Importance: normal - -Test test. Hi. Waving. m - ----------------------------------------------------------------- -Sent via Bell Mobility's Text Messaging service. -Envoyé par le service de messagerie texte de Bell Mobilité. ----------------------------------------------------------------- diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email6 b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email6 deleted file mode 100644 index 9c7b41a16..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email6 +++ /dev/null @@ -1,20 +0,0 @@ -Return-Path: -Received: from xxx.xxxx.xxx by xxx.xxxx.xxx with ESMTP id C1B953B4CB6 for ; Tue, 10 May 2005 15:27:05 -0500 -Received: from SMS-GTYxxx.xxxx.xxx by xxx.xxxx.xxx with ESMTP id ca for ; Tue, 10 May 2005 15:27:04 -0500 -Received: from xxx.xxxx.xxx by SMS-GTYxxx.xxxx.xxx with ESMTP id j4AKR3r23323 for ; Tue, 10 May 2005 15:27:03 -0500 -Date: Tue, 10 May 2005 15:27:03 -0500 -From: xxx@xxxx.xxx -Sender: xxx@xxxx.xxx -To: xxxxxxxxxxx@xxxx.xxxx.xxx -Message-Id: -X-Original-To: xxxxxxxxxxx@xxxx.xxxx.xxx -Delivered-To: xxx@xxxx.xxx -Importance: normal -Content-Type: text/plain; charset=us-ascii - -Test test. Hi. Waving. m - ----------------------------------------------------------------- -Sent via Bell Mobility's Text Messaging service. -Envoyé par le service de messagerie texte de Bell Mobilité. ----------------------------------------------------------------- diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email7 b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email7 deleted file mode 100644 index c8c8e3462..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email7 +++ /dev/null @@ -1,66 +0,0 @@ -Mime-Version: 1.0 (Apple Message framework v730) -Content-Type: multipart/mixed; boundary=Apple-Mail-13-196941151 -Message-Id: <9169D984-4E0B-45EF-82D4-8F5E53AD7012@example.com> -From: foo@example.com -Subject: testing -Date: Mon, 6 Jun 2005 22:21:22 +0200 -To: blah@example.com - - ---Apple-Mail-13-196941151 -Content-Type: multipart/mixed; - boundary=Apple-Mail-12-196940926 - - ---Apple-Mail-12-196940926 -Content-Transfer-Encoding: quoted-printable -Content-Type: text/plain; - charset=ISO-8859-1; - delsp=yes; - format=flowed - -This is the first part. - ---Apple-Mail-12-196940926 -Content-Transfer-Encoding: 7bit -Content-Type: text/x-ruby-script; - x-unix-mode=0666; - name="test.rb" -Content-Disposition: attachment; - filename=test.rb - -puts "testing, testing" - ---Apple-Mail-12-196940926 -Content-Transfer-Encoding: base64 -Content-Type: application/pdf; - x-unix-mode=0666; - name="test.pdf" -Content-Disposition: inline; - filename=test.pdf - -YmxhaCBibGFoIGJsYWg= - ---Apple-Mail-12-196940926 -Content-Transfer-Encoding: 7bit -Content-Type: text/plain; - charset=US-ASCII; - format=flowed - - - ---Apple-Mail-12-196940926-- - ---Apple-Mail-13-196941151 -Content-Transfer-Encoding: base64 -Content-Type: application/pkcs7-signature; - name=smime.p7s -Content-Disposition: attachment; - filename=smime.p7s - -jamisSqGSIb3DQEHAqCAMIjamisxCzAJBgUrDgMCGgUAMIAGCSqGSjamisEHAQAAoIIFSjCCBUYw -ggQujamisQICBD++ukQwDQYJKojamisNAQEFBQAwMTELMAkGA1UEBhMCRjamisAKBgNVBAoTA1RE -QzEUMBIGjamisxMLVERDIE9DRVMgQ0jamisNMDQwMjI5MTE1OTAxWhcNMDYwMjamisIyOTAxWjCB -gDELMAkGA1UEjamisEsxKTAnBgNVBAoTIEjamisuIG9yZ2FuaXNhdG9yaXNrIHRpbjamisRuaW5= - ---Apple-Mail-13-196941151-- diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email8 b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email8 deleted file mode 100644 index 5dbcd2a41..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email8 +++ /dev/null @@ -1,47 +0,0 @@ -From xxxxxxxxx.xxxxxxx@gmail.com Sun May 8 19:07:09 2005 -Return-Path: -Message-ID: -Date: Sun, 8 May 2005 14:09:11 -0500 -From: xxxxxxxxx xxxxxxx -Reply-To: xxxxxxxxx xxxxxxx -To: xxxxx xxxx -Subject: Fwd: Signed email causes file attachments -In-Reply-To: -Mime-Version: 1.0 -Content-Type: multipart/mixed; - boundary="----=_Part_5028_7368284.1115579351471" -References: - -------=_Part_5028_7368284.1115579351471 -Content-Type: text/plain; charset=ISO-8859-1 -Content-Transfer-Encoding: quoted-printable -Content-Disposition: inline - -We should not include these files or vcards as attachments. - ----------- Forwarded message ---------- -From: xxxxx xxxxxx -Date: May 8, 2005 1:17 PM -Subject: Signed email causes file attachments -To: xxxxxxx@xxxxxxxxxx.com - - -Hi, - -Test attachments oddly encoded with japanese charset. - - -------=_Part_5028_7368284.1115579351471 -Content-Type: application/octet-stream; name*=iso-2022-jp'ja'01%20Quien%20Te%20Dij%8aat.%20Pitbull.mp3 -Content-Transfer-Encoding: base64 -Content-Disposition: attachment - -MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAQAAoIIGFDCCAs0w -ggI2oAMCAQICAw5c+TANBgkqhkiG9w0BAQQFADBiMQswCQYDVQQGEwJaQTElMCMGA1UEChMcVGhh -d3RlIENvbnN1bHRpbmcgKFB0eSkgTHRkLjEsMCoGA1UEAxMjVGhhd3RlIFBlcnNvbmFsIEZyZWVt -YWlsIElzc3VpbmcgQ0EwHhcNMDUwMzI5MDkzOTEwWhcNMDYwMzI5MDkzOTEwWjBCMR8wHQYDVQQD -ExZUaGF3dGUgRnJlZW1haWwgTWVtYmVyMR8wHQYJKoZIhvcNAQkBFhBzbWhhdW5jaEBtYWMuY29t -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAn90dPsYS3LjfMY211OSYrDQLzwNYPlAL -7+/0XA+kdy8/rRnyEHFGwhNCDmg0B6pxC7z3xxJD/8GfCd+IYUUNUQV5m9MkxfP9pTVXZVIYLaBw -------=_Part_5028_7368284.1115579351471-- - diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email9 b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email9 deleted file mode 100644 index ca913778d..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email9 +++ /dev/null @@ -1,28 +0,0 @@ -Received: from xxx.xxx.xxx ([xxx.xxx.xxx.xxx] verified) - by xxx.com (CommuniGate Pro SMTP 4.2.8) - with SMTP id 2532598 for xxx@xxx.com; Wed, 23 Feb 2005 17:51:49 -0500 -Received-SPF: softfail - receiver=xxx.com; client-ip=xxx.xxx.xxx.xxx; envelope-from=xxx@xxx.xxx -quite Delivered-To: xxx@xxx.xxx -Received: by xxx.xxx.xxx (Wostfix, from userid xxx) - id 0F87F333; Wed, 23 Feb 2005 16:16:17 -0600 -Date: Wed, 23 Feb 2005 18:20:17 -0400 -From: "xxx xxx" -Message-ID: <4D6AA7EB.6490534@xxx.xxx> -To: xxx@xxx.com -Subject: Stop adware/spyware once and for all. -X-Scanned-By: MIMEDefang 2.11 (www dot roaringpenguin dot com slash mimedefang) - -You are infected with: -Ad Ware and Spy Ware - -Get your free scan and removal download now, -before it gets any worse. - -http://xxx.xxx.info?aid=3D13&?stat=3D4327kdzt - - - - -no more? (you will still be infected) -http://xxx.xxx.info/discon/?xxx@xxx.com diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email_quoted_with_0d0a b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email_quoted_with_0d0a deleted file mode 100644 index 8a2c25a5d..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email_quoted_with_0d0a +++ /dev/null @@ -1,14 +0,0 @@ -Mime-Version: 1.0 (Apple Message framework v730) -Message-Id: <9169D984-4E0B-45EF-82D4-8F5E53AD7012@example.com> -From: foo@example.com -Subject: testing -Date: Mon, 6 Jun 2005 22:21:22 +0200 -To: blah@example.com -Content-Transfer-Encoding: quoted-printable -Content-Type: text/plain - -A fax has arrived from remote ID ''.=0D=0A-----------------------= --------------------------------------=0D=0ATime: 3/9/2006 3:50:52= - PM=0D=0AReceived from remote ID: =0D=0AInbound user ID XXXXXXXXXX, r= -outing code XXXXXXXXX=0D=0AResult: (0/352;0/0) Successful Send=0D=0AP= -age record: 1 - 1=0D=0AElapsed time: 00:58 on channel 11=0D=0A diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email_with_invalid_characters_in_content_type b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email_with_invalid_characters_in_content_type deleted file mode 100644 index 15c0bc499..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email_with_invalid_characters_in_content_type +++ /dev/null @@ -1,104 +0,0 @@ -Return-Path: -Received: from some.isp.com by baci with ESMTP id 632BD5758 for ; Sun, 21 Oct 2007 19:38:21 +1000 -Date: Sun, 21 Oct 2007 19:38:13 +1000 -From: Mikel Lindsaar -Reply-To: Mikel Lindsaar -To: mikel.lindsaar@baci -Message-Id: <009601c813c6$19df3510$0437d30a@mikel091a> -Subject: Testing outlook -Mime-Version: 1.0 -Content-Type: multipart/alternative; boundary=----=_NextPart_000_0093_01C81419.EB75E850 -Delivered-To: mikel.lindsaar@baci -X-Mimeole: Produced By Microsoft MimeOLE V6.00.2900.3138 -X-Msmail-Priority: Normal - -This is a multi-part message in MIME format. - - -------=_NextPart_000_0093_01C81419.EB75E850 -Content-Type: text/plain; charset=iso-8859-1 -Content-Transfer-Encoding: Quoted-printable - -Hello -This is an outlook test - -So there. - -Me. - -------=_NextPart_000_0093_01C81419.EB75E850 -Content-Type: text/html; charset=iso-8859-1 -Content-Transfer-Encoding: Quoted-printable - - - - - - - - -
Hello
-
This is an outlook=20 -test
-
 
-
So there.
-
 
-
Me.
- - -------=_NextPart_000_0093_01C81419.EB75E850-- - - -Return-Path: -Received: from some.isp.com by baci with ESMTP id 632BD5758 for ; Sun, 21 Oct 2007 19:38:21 +1000 -Date: Sun, 21 Oct 2007 19:38:13 +1000 -From: Mikel Lindsaar -Reply-To: Mikel Lindsaar -To: mikel.lindsaar@baci -Message-Id: <009601c813c6$19df3510$0437d30a@mikel091a> -Subject: Testing outlook -Mime-Version: 1.0 -Content-Type: multipart/alternative; boundary=----=_NextPart_000_0093_01C81419.EB75E850 -Delivered-To: mikel.lindsaar@baci -X-Mimeole: Produced By Microsoft MimeOLE V6.00.2900.3138 -X-Msmail-Priority: Normal - -This is a multi-part message in MIME format. - - -------=_NextPart_000_0093_01C81419.EB75E850 -Content-Type: text/plain; charset=iso-8859-1 -Content-Transfer-Encoding: Quoted-printable - -Hello -This is an outlook test - -So there. - -Me. - -------=_NextPart_000_0093_01C81419.EB75E850 -Content-Type: text/html; charset=iso-8859-1 -Content-Transfer-Encoding: Quoted-printable - - - - - - - - -
Hello
-
This is an outlook=20 -test
-
 
-
So there.
-
 
-
Me.
- - -------=_NextPart_000_0093_01C81419.EB75E850-- - - diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email_with_nested_attachment b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email_with_nested_attachment deleted file mode 100644 index 9d49e6fab..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email_with_nested_attachment +++ /dev/null @@ -1,100 +0,0 @@ -From jamis@37signals.com Thu Feb 22 11:20:31 2007 -Mime-Version: 1.0 (Apple Message framework v752.3) -Message-Id: <2CCE0408-10C7-4045-9B16-A1C11C31469B@37signals.com> -Content-Type: multipart/signed; - micalg=sha1; - boundary=Apple-Mail-42-587703407; - protocol="application/pkcs7-signature" -To: Jamis Buck -Subject: Testing attachments -From: Jamis Buck -Date: Thu, 22 Feb 2007 11:20:31 -0700 - - ---Apple-Mail-42-587703407 -Content-Type: multipart/mixed; - boundary=Apple-Mail-41-587703287 - - ---Apple-Mail-41-587703287 -Content-Transfer-Encoding: 7bit -Content-Type: text/plain; - charset=US-ASCII; - format=flowed - -Here is a test of an attachment via email. - -- Jamis - - ---Apple-Mail-41-587703287 -Content-Transfer-Encoding: base64 -Content-Type: image/png; - x-unix-mode=0644; - name=byo-ror-cover.png -Content-Disposition: inline; - filename=truncated.png - -iVBORw0KGgoAAAANSUhEUgAAAKUAAADXCAYAAAB7wZEQAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz -AAALEgAACxIB0t1+/AAAABd0RVh0Q3JlYXRpb24gVGltZQAxLzI1LzIwMDeD9CJVAAAAGHRFWHRT -b2Z0d2FyZQBBZG9iZSBGaXJld29ya3NPsx9OAAAyBWlUWHRYTUw6Y29tLmFkb2JlLnhtcDw/eHBh -Y2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+Cjx4OnhtcG1l -dGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDQuMS1j -MDIwIDEuMjU1NzE2LCBUdWUgT2N0IDEwIDIwMDYgMjM6MTY6MzQiPgogICA8cmRmOlJERiB4bWxu -czpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAg -ICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4YXA9Imh0 -dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iPgogICAgICAgICA8eGFwOkNyZWF0b3JUb29sPkFk -b2JlIEZpcmV3b3JrcyBDUzM8L3hhcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHhhcDpDcmVhdGVE -YXRlPjIwMDctMDEtMjVUMDU6Mjg6MjFaPC94YXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhhcDpN -b2RpZnlEYXRlPjIwMDctMDEtMjVUMDU6Mjg6MjFaPC94YXA6TW9kaWZ5RGF0ZT4KICAgICAgPC9y -ZGY6RGVzY3JpcHRpb24+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAg -ICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+CiAgICAg -ICAgIDxkYzpmb3JtYXQ+aW1hZ2UvcG5nPC9kYzpmb3JtYXQ+CiAgICAgIDwvcmRmOkRlc2NyaXB0 -hhojpmnJMfaYFmSkXWg5PGCmHXVj/c9At0hSK2xGdd8F3muk0VFjb4f5Ue0ksQ8qAcq0delaXhdb -DjKNnF+3B3t9kObZYmk7AZgWYqO9anpR3wpM9sQ5XslB9a+kWyTtNb0fOmudzGHfPFBQDKesyycm -DBL7Cw5bXjIEuci+SSOm/LYnXDZu6iuPEj8lYBb+OU8xx1f9m+e5rhJiYKqjo5vHfiZp+VUkW9xc -Ufd6JHNWc47PkQqb9ie3SLEZB/ZqyAssiqURY+G35iOMZUrHbasHnb80QAPv9FHtAbJIyro7bi5b -ai2TEAKen5+LJNWrglZjm3UbZvt7KryA2J5b5J1jZF8kL6GzvG1Zqx54Y1y7J7n20wMOt9frG2sW -uwGP07kNz3732vf6bfvAvLldfS+9fts2euXY37D+R29FGZdlnhzV4TTFmPJduBP2RbNNua4rTqcT -Qt7Xy1KUB0AHSdP5AZQYvHZg7WD1XvYeMO1A9HhZPqMX5KXbMBrn2efxns/ee21674efxz4Tp/fq -2HZ648dgYaC1i3Vq1IbNPq3PvDTPezY9FaRISjvnzWqdgcWN8EJgjnNq+Z7ktOm9l2Nfth28EZi4 -bG/we5JwxM+Tql47/D/X6b38I8/RyxvxPJrX6zvQbo3h9jyJx+C0ALX327QETHl5eYlaYCT5rPTb -+5/rAq26t3lKIxV/p88hq6ptngdgCzoPjJqndiLfc/6y5A14WeDFGNPct4iUsJBV2bYzLEV7m83s -6Rp63VPhHKC/g/LzaU9qexJRr56043JWinqAtfZqsSm1sjoznthl54dtCqv+uL4nIY+oYWuc3+nH -kGfn8b0HQpvOYLQAZUDanbJs3jQhITZEgdarZK+cO6ySlL13rut5nFaN23s7u3Snz6eRPTkCoc2/ -Vp1zHfZVFpZ87FiMVLV1iqyK5rlzfji2GzjfDsodlD+Weo5UD4h6PwKqzQMqID0tq2VjjFVSMpis -ZLRAs7sePZBZAHI+gIanB8I7MD+femAceeUe2Kxa5jS950kZ1p5eNEdeX1+jFmSpZ+1EdWCsDcne -NPNgUHNw3aYpnzv9PGTX0uo94EtN9qq1rOdxe3kc79T8ukeHJJ8Fnxej6qlylbLLsjQLOy6Xy2a1 -kefs/N+nM7+S7IG5/E5Yc7F003pWErLjbH0O5cGadiMptSB/DZ5U5DI9yeg5MFYyMj8lC/Y7/Xjq -OZlWcnpg9aQfXz2HRq+Wn5xOp6gN8tWq8R44e2pfyzLYemEgprst+XXk2Zj2nXlbsG05BprndTMv -C3QRaXczshhVsHnMgfYn80Y2g5JureA6wBasPeP7LkE/jvZMJAaf/g/U2RelHsisvan5FqweIAHg -Pwc7L68GxvVDAAAAAElFTkSuQmCC - ---Apple-Mail-41-587703287-- - ---Apple-Mail-42-587703407 -Content-Transfer-Encoding: base64 -Content-Type: application/pkcs7-signature; - name=smime.p7s -Content-Disposition: attachment; - filename=smime.p7s - -MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAQAAoIIGJzCCAuAw -ggJJoAMCAQICEFjnFNYXwDEZRWY5EkfzopUwDQYJKoZIhvcNAQEFBQAwYjELMAkGA1UEBhMCWkEx -JTAjBgNVBAoTHFRoYXd0ZSBDb25zdWx0aW5nIChQdHkpIEx0ZC4xLDAqBgNVBAMTI1RoYXd0ZSBQ -ZXJzb25hbCBGcmVlbWFpbCBJc3N1aW5nIENBMB4XDTA2MDkxMjE3MDExMloXDTA3MDkxMjE3MDEx -MlowRTEfMB0GA1UEAxMWVGhhd3RlIEZyZWVtYWlsIE1lbWJlcjEiMCAGCSqGSIb3DQEJARYTamFt -aXNAMzdzaWduYWxzLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAO2A9JeOFIFJ -G6z8pTcAldrZ2nMe+Xb1tNrbHgoVzN/QhHXM4qst2Ml93cmFLjMmwG7P9RJeU4oNx+jTqVoBB7NV -Ne1/o56Do0KhfMZ9iUDQdPLbkZMq4EEpFMdm6PyM3muRKwPhj66iAWe/osCb8DowUK2f66vaRx0Z -Y0MQHIIrXE02Ta4IfAhIfPqBLkZ4WgTYBHN9vMdYea1jF0GO4gqGk1wqwb3yxv2QMYMbwJ6SI+k/ -ZjkSR/OilTCBhwYLKoZIhvcNAQkQAgsxeKB2MGIxCzAJBgNVBAYTAlpBMSUwIwYDVQQKExxUaGF3 -dGUgQ29uc3VsdGluZyAoUHR5KSBMdGQuMSwwKgYDVQQDEyNUaGF3dGUgUGVyc29uYWwgRnJlZW1h -aWwgSXNzdWluZyBDQQIQWOcU1hfAMRlFZjkSR/OilTANBgkqhkiG9w0BAQEFAASCAQCfwQiC3v6/ -yleRDGv3bJ4nQYQ+c3mz3+mn3Xi6uU35n3piwxZZaWRdmLyiXPvU+QReHpSf3l2qsEZM3sdE0XF9 -eRul/+QTFJcDNXOEAxG1zC2Gpz+6c6RrX4Ou12Pwkp+pNrZWTSY/mZgdqcArupOBcZi7qBjoWcy5 -wb54dfvSSjrjmqLbkH/E8ww/6gGQuU/xXpAUZgUrTmQHrNKeIdSh5oDkOxFaFWvnmb8Z/2ixKqW/ -Ux6WqamyvBtTs/5YBEtnpZOk+uVoscYEUBhU+DVJ2OSvTdXSivMtBdXmGTsG22k+P1NGUHi/A7ev -xPaO0uk4V8xyjNlN4HPuGpkrlXwPAAAAAAAA - ---Apple-Mail-42-587703407-- diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email_with_partially_quoted_subject b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email_with_partially_quoted_subject deleted file mode 100644 index d8df28519..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/raw_email_with_partially_quoted_subject +++ /dev/null @@ -1,14 +0,0 @@ -From jamis@37signals.com Mon May 2 16:07:05 2005 -Mime-Version: 1.0 (Apple Message framework v622) -Content-Transfer-Encoding: base64 -Message-Id: -Content-Type: text/plain; - charset=EUC-KR; - format=flowed -To: jamis@37signals.com -From: Jamis Buck -Subject: Re: Test: =?UTF-8?B?Iua8ouWtlyI=?= mid =?UTF-8?B?Iua8ouWtlyI=?= tail -Date: Mon, 2 May 2005 16:07:05 -0600 - -tOu6zrrQwMcguLbC+bChwfa3ziwgv+y4rrTCIMfPs6q01MC7ILnPvcC0z7TZLg0KDQrBpiDAzLin -wLogSmFtaXPA1LTPtNku diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/second_mailer/share.erb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/second_mailer/share.erb deleted file mode 100644 index ba83285d3..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/second_mailer/share.erb +++ /dev/null @@ -1 +0,0 @@ -second mail diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/templates/signed_up.erb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/templates/signed_up.erb deleted file mode 100644 index 855338f1b..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/templates/signed_up.erb +++ /dev/null @@ -1,3 +0,0 @@ -Hello there, - -Mr. <%= @recipient %> \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/_subtemplate.text.erb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/_subtemplate.text.erb deleted file mode 100644 index 3b4ba35f2..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/_subtemplate.text.erb +++ /dev/null @@ -1 +0,0 @@ -let's go! \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/custom_templating_extension.html.haml b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/custom_templating_extension.html.haml deleted file mode 100644 index 8d53e36ad..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/custom_templating_extension.html.haml +++ /dev/null @@ -1,6 +0,0 @@ -%p Hello there, - -%p - Mr. - = @recipient - from haml \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/custom_templating_extension.text.haml b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/custom_templating_extension.text.haml deleted file mode 100644 index 8d53e36ad..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/custom_templating_extension.text.haml +++ /dev/null @@ -1,6 +0,0 @@ -%p Hello there, - -%p - Mr. - = @recipient - from haml \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.html.erb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.html.erb deleted file mode 100644 index eb35238e1..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.html.erb +++ /dev/null @@ -1,10 +0,0 @@ - - - HTML formatted message to <%= @recipient %>. - - - - - HTML formatted message to <%= @recipient %>. - - diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.html.erb~ b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.html.erb~ deleted file mode 100644 index eb35238e1..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.html.erb~ +++ /dev/null @@ -1,10 +0,0 @@ - - - HTML formatted message to <%= @recipient %>. - - - - - HTML formatted message to <%= @recipient %>. - - diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.ignored.erb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.ignored.erb deleted file mode 100644 index 4e67465d3..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.ignored.erb +++ /dev/null @@ -1 +0,0 @@ -Ignored when searching for implicitly multipart parts. diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.text.erb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.text.erb deleted file mode 100644 index 5335cf6bd..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.text.erb +++ /dev/null @@ -1,2 +0,0 @@ -Plain text to <%= @recipient %>. -Plain text to <%= @recipient %>. diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.yaml.erb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.yaml.erb deleted file mode 100644 index c14348c77..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.yaml.erb +++ /dev/null @@ -1 +0,0 @@ -yaml to: <%= @recipient %> \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/included_subtemplate.text.erb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/included_subtemplate.text.erb deleted file mode 100644 index a93c30ea1..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/included_subtemplate.text.erb +++ /dev/null @@ -1 +0,0 @@ -Hey Ho, <%= render :partial => "subtemplate" %> \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/multipart_alternative.html.erb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/multipart_alternative.html.erb deleted file mode 100644 index 73ea14f82..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/multipart_alternative.html.erb +++ /dev/null @@ -1 +0,0 @@ -foo <%= @foo %> \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/multipart_alternative.plain.erb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/multipart_alternative.plain.erb deleted file mode 100644 index 779fe4c1e..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/multipart_alternative.plain.erb +++ /dev/null @@ -1 +0,0 @@ -foo: <%= @foo %> \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/rxml_template.rxml b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/rxml_template.rxml deleted file mode 100644 index 6b87e6ae1..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/rxml_template.rxml +++ /dev/null @@ -1,2 +0,0 @@ -xml.instruct! -xml.test \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/signed_up.html.erb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/signed_up.html.erb deleted file mode 100644 index 855338f1b..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/test_mailer/signed_up.html.erb +++ /dev/null @@ -1,3 +0,0 @@ -Hello there, - -Mr. <%= @recipient %> \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/url_test_mailer/signed_up_with_url.erb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/url_test_mailer/signed_up_with_url.erb deleted file mode 100644 index f3a7b3c0b..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/fixtures/url_test_mailer/signed_up_with_url.erb +++ /dev/null @@ -1,5 +0,0 @@ -Hello there, - -Mr. <%= @recipient %>. Please see our greeting at <%= @welcome_url %> <%= welcome_url %> - -<%= image_tag "somelogo.png" %> \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/log_subscriber_test.rb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/log_subscriber_test.rb deleted file mode 100644 index 21a8505d2..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/log_subscriber_test.rb +++ /dev/null @@ -1,48 +0,0 @@ -require "abstract_unit" -require "active_support/log_subscriber/test_helper" -require "action_mailer/log_subscriber" - -class AMLogSubscriberTest < ActionMailer::TestCase - include ActiveSupport::LogSubscriber::TestHelper - - def setup - super - ActionMailer::LogSubscriber.attach_to :action_mailer - end - - class TestMailer < ActionMailer::Base - def basic - recipients "somewhere@example.com" - subject "basic" - from "basic@example.com" - body "Hello world" - end - - def receive(mail) - # Do nothing - end - end - - def set_logger(logger) - ActionMailer::Base.logger = logger - end - - def test_deliver_is_notified - TestMailer.basic.deliver - wait - assert_equal(1, @logger.logged(:info).size) - assert_match(/Sent mail to somewhere@example.com/, @logger.logged(:info).first) - assert_equal(1, @logger.logged(:debug).size) - assert_match(/Hello world/, @logger.logged(:debug).first) - end - - def test_receive_is_notified - fixture = File.read(File.dirname(__FILE__) + "/fixtures/raw_email") - TestMailer.receive(fixture) - wait - assert_equal(1, @logger.logged(:info).size) - assert_match(/Received mail/, @logger.logged(:info).first) - assert_equal(1, @logger.logged(:debug).size) - assert_match(/Jamis/, @logger.logged(:debug).first) - end -end \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/mail_helper_test.rb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/mail_helper_test.rb deleted file mode 100644 index e93462088..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/mail_helper_test.rb +++ /dev/null @@ -1,54 +0,0 @@ -require 'abstract_unit' - -class HelperMailer < ActionMailer::Base - def use_mail_helper - @text = "But soft! What light through yonder window breaks? It is the east, " + - "and Juliet is the sun. Arise, fair sun, and kill the envious moon, " + - "which is sick and pale with grief that thou, her maid, art far more " + - "fair than she. Be not her maid, for she is envious! Her vestal " + - "livery is but sick and green, and none but fools do wear it. Cast " + - "it off!" - - mail_with_defaults do |format| - format.html { render(:inline => "<%= block_format @text %>") } - end - end - - def use_mailer - mail_with_defaults do |format| - format.html { render(:inline => "<%= mailer.message.subject %>") } - end - end - - def use_message - mail_with_defaults do |format| - format.html { render(:inline => "<%= message.subject %>") } - end - end - - protected - - def mail_with_defaults(&block) - mail(:to => "test@localhost", :from => "tester@example.com", - :subject => "using helpers", &block) - end -end - -class MailerHelperTest < ActionMailer::TestCase - def test_use_mail_helper - mail = HelperMailer.use_mail_helper - assert_match %r{ But soft!}, mail.body.encoded - assert_match %r{east, and\r\n Juliet}, mail.body.encoded - end - - def test_use_mailer - mail = HelperMailer.use_mailer - assert_match "using helpers", mail.body.encoded - end - - def test_use_message - mail = HelperMailer.use_message - assert_match "using helpers", mail.body.encoded - end -end - diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/mailers/asset_mailer.rb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/mailers/asset_mailer.rb deleted file mode 100644 index 41252259d..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/mailers/asset_mailer.rb +++ /dev/null @@ -1,7 +0,0 @@ -class AssetMailer < ActionMailer::Base - self.mailer_name = "asset_mailer" - - def welcome - mail - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/mailers/base_mailer.rb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/mailers/base_mailer.rb deleted file mode 100644 index cfc6cdd19..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/mailers/base_mailer.rb +++ /dev/null @@ -1,130 +0,0 @@ -class BaseMailer < ActionMailer::Base - self.mailer_name = "base_mailer" - - default :to => 'system@test.lindsaar.net', - :from => 'jose@test.plataformatec.com', - :reply_to => 'mikel@test.lindsaar.net' - - def welcome(hash = {}) - headers['X-SPAM'] = "Not SPAM" - mail({:subject => "The first email on new API!"}.merge!(hash)) - end - - def welcome_with_fixnum_header(hash = {}) - headers['X-SPAM-COUNT'] = 2 - mail({:template_name => "welcome", :subject => "The first email on new API!"}.merge!(hash)) - end - - def welcome_with_headers(hash = {}) - headers hash - mail - end - - def welcome_from_another_path(path) - mail(:template_name => "welcome", :template_path => path) - end - - def html_only(hash = {}) - mail(hash) - end - - def plain_text_only(hash = {}) - mail(hash) - end - - def inline_attachment - attachments.inline['logo.png'] = "\312\213\254\232" - mail - end - - def attachment_with_content(hash = {}) - attachments['invoice.pdf'] = 'This is test File content' - mail(hash) - end - - def attachment_with_hash - attachments['invoice.jpg'] = { :data => "\312\213\254\232)b", - :mime_type => "image/x-jpg", - :transfer_encoding => "base64" } - mail - end - - def attachment_with_hash_default_encoding - attachments['invoice.jpg'] = { :data => "\312\213\254\232)b", - :mime_type => "image/x-jpg" } - mail - end - - def implicit_multipart(hash = {}) - attachments['invoice.pdf'] = 'This is test File content' if hash.delete(:attachments) - mail(hash) - end - - def implicit_with_locale(hash = {}) - mail(hash) - end - - def explicit_multipart(hash = {}) - attachments['invoice.pdf'] = 'This is test File content' if hash.delete(:attachments) - mail(hash) do |format| - format.text { render :text => "TEXT Explicit Multipart" } - format.html { render :text => "HTML Explicit Multipart" } - end - end - - def explicit_multipart_templates(hash = {}) - mail(hash) do |format| - format.html - format.text - end - end - - def explicit_multipart_with_any(hash = {}) - mail(hash) do |format| - format.any(:text, :html){ render :text => "Format with any!" } - end - end - - def explicit_multipart_with_options(include_html = false) - mail do |format| - format.text(:content_transfer_encoding => "base64"){ render "welcome" } - format.html{ render "welcome" } if include_html - end - end - - def explicit_multipart_with_one_template(hash = {}) - mail(hash) do |format| - format.html - format.text - end - end - - def implicit_different_template(template_name='') - mail(:template_name => template_name) - end - - def implicit_different_template_with_file(template_name='') - mail do |format| - format.text { render :file => template_name } - format.html { render :file => template_name } - end - end - - def explicit_different_template(template_name='') - mail do |format| - format.text { render :template => "#{mailer_name}/#{template_name}" } - format.html { render :template => "#{mailer_name}/#{template_name}" } - end - end - - def different_layout(layout_name='') - mail do |format| - format.text { render :layout => layout_name } - format.html { render :layout => layout_name } - end - end - - def email_with_translations - body render("email_with_translations.html") - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/mailers/proc_mailer.rb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/mailers/proc_mailer.rb deleted file mode 100644 index aa6dab1ba..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/mailers/proc_mailer.rb +++ /dev/null @@ -1,16 +0,0 @@ -class ProcMailer < ActionMailer::Base - default :to => 'system@test.lindsaar.net', - 'X-Proc-Method' => Proc.new { Time.now.to_i.to_s }, - :subject => Proc.new { give_a_greeting } - - def welcome - mail - end - - private - - def give_a_greeting - "Thanks for signing up this afternoon" - end - -end diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/old_base/adv_attr_test.rb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/old_base/adv_attr_test.rb deleted file mode 100644 index a1bab9483..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/old_base/adv_attr_test.rb +++ /dev/null @@ -1,36 +0,0 @@ -require 'abstract_unit' -require 'action_mailer/adv_attr_accessor' - -class AdvAttrTest < ActiveSupport::TestCase - class Person - cattr_reader :protected_instance_variables - @@protected_instance_variables = [] - - extend ActionMailer::AdvAttrAccessor - adv_attr_accessor :name - end - - def setup - @person = Person.new - end - - def test_adv_attr - assert_nil @person.name - @person.name 'Bob' - assert_equal 'Bob', @person.name - end - - def test_adv_attr_writer - assert_nil @person.name - @person.name = 'Bob' - assert_equal 'Bob', @person.name - end - - def test_raise_an_error_with_multiple_args - assert_raise(ArgumentError) { @person.name('x', 'y') } - end - - def test_ivar_is_added_to_protected_instnace_variables - assert Person.protected_instance_variables.include?('@name') - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/old_base/asset_host_test.rb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/old_base/asset_host_test.rb deleted file mode 100644 index fe1a16582..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/old_base/asset_host_test.rb +++ /dev/null @@ -1,56 +0,0 @@ -require 'abstract_unit' -require 'action_controller' - -class AssetHostMailer < ActionMailer::Base - def email_with_asset - recipients 'test@localhost' - subject "testing email containing asset path while asset_host is set" - from "tester@example.com" - end -end - -class AssetHostTest < Test::Unit::TestCase - def setup - set_delivery_method :test - ActionMailer::Base.perform_deliveries = true - ActionMailer::Base.deliveries.clear - AssetHostMailer.configure do |c| - c.asset_host = "http://www.example.com" - c.assets_dir = '' - end - end - - def teardown - restore_delivery_method - end - - def test_asset_host_as_string - mail = AssetHostMailer.email_with_asset - assert_equal %Q{Somelogo}, mail.body.to_s.strip - end - - def test_asset_host_as_one_arguement_proc - AssetHostMailer.config.asset_host = Proc.new { |source| - if source.starts_with?('/images') - "http://images.example.com" - else - "http://assets.example.com" - end - } - mail = AssetHostMailer.email_with_asset - assert_equal %Q{Somelogo}, mail.body.to_s.strip - end - - def test_asset_host_as_two_arguement_proc - ActionController::Base.config.asset_host = Proc.new {|source,request| - if request && request.ssl? - "https://www.example.com" - else - "http://www.example.com" - end - } - mail = nil - assert_nothing_raised { mail = AssetHostMailer.email_with_asset } - assert_equal %Q{Somelogo}, mail.body.to_s.strip - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/old_base/mail_layout_test.rb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/old_base/mail_layout_test.rb deleted file mode 100644 index 325dbaa27..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/old_base/mail_layout_test.rb +++ /dev/null @@ -1,126 +0,0 @@ -require 'abstract_unit' - -class AutoLayoutMailer < ActionMailer::Base - - def hello - recipients 'test@localhost' - subject "You have a mail" - from "tester@example.com" - end - - def spam - recipients 'test@localhost' - subject "You have a mail" - from "tester@example.com" - - @world = "Earth" - body render(:inline => "Hello, <%= @world %>", :layout => 'spam') - end - - def nolayout - recipients 'test@localhost' - subject "You have a mail" - from "tester@example.com" - - @world = "Earth" - body render(:inline => "Hello, <%= @world %>", :layout => false) - end - - def multipart(type = nil) - recipients 'test@localhost' - subject "You have a mail" - from "tester@example.com" - - content_type(type) if type - end -end - -class ExplicitLayoutMailer < ActionMailer::Base - layout 'spam', :except => [:logout] - - def signup - recipients 'test@localhost' - subject "You have a mail" - from "tester@example.com" - end - - def logout - recipients 'test@localhost' - subject "You have a mail" - from "tester@example.com" - end -end - -class LayoutMailerTest < Test::Unit::TestCase - def setup - set_delivery_method :test - ActionMailer::Base.perform_deliveries = true - ActionMailer::Base.deliveries.clear - end - - def teardown - restore_delivery_method - end - - def test_should_pickup_default_layout - mail = AutoLayoutMailer.hello - assert_equal "Hello from layout Inside", mail.body.to_s.strip - end - - def test_should_pickup_multipart_layout - mail = AutoLayoutMailer.multipart - assert_equal "multipart/alternative", mail.mime_type - assert_equal 2, mail.parts.size - - assert_equal 'text/plain', mail.parts.first.mime_type - assert_equal "text/plain layout - text/plain multipart", mail.parts.first.body.to_s - - assert_equal 'text/html', mail.parts.last.mime_type - assert_equal "Hello from layout text/html multipart", mail.parts.last.body.to_s - end - - def test_should_pickup_multipartmixed_layout - mail = AutoLayoutMailer.multipart("multipart/mixed") - assert_equal "multipart/mixed", mail.mime_type - assert_equal 2, mail.parts.size - - assert_equal 'text/plain', mail.parts.first.mime_type - assert_equal "text/plain layout - text/plain multipart", mail.parts.first.body.to_s - - assert_equal 'text/html', mail.parts.last.mime_type - assert_equal "Hello from layout text/html multipart", mail.parts.last.body.to_s - end - - def test_should_fix_multipart_layout - mail = AutoLayoutMailer.multipart("text/plain") - assert_equal "multipart/alternative", mail.mime_type - assert_equal 2, mail.parts.size - - assert_equal 'text/plain', mail.parts.first.mime_type - assert_equal "text/plain layout - text/plain multipart", mail.parts.first.body.to_s - - assert_equal 'text/html', mail.parts.last.mime_type - assert_equal "Hello from layout text/html multipart", mail.parts.last.body.to_s - end - - - def test_should_pickup_layout_given_to_render - mail = AutoLayoutMailer.spam - assert_equal "Spammer layout Hello, Earth", mail.body.to_s.strip - end - - def test_should_respect_layout_false - mail = AutoLayoutMailer.nolayout - assert_equal "Hello, Earth", mail.body.to_s.strip - end - - def test_explicit_class_layout - mail = ExplicitLayoutMailer.signup - assert_equal "Spammer layout We do not spam", mail.body.to_s.strip - end - - def test_explicit_layout_exceptions - mail = ExplicitLayoutMailer.logout - assert_equal "You logged out", mail.body.to_s.strip - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/old_base/mail_render_test.rb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/old_base/mail_render_test.rb deleted file mode 100644 index be9048099..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/old_base/mail_render_test.rb +++ /dev/null @@ -1,167 +0,0 @@ -require 'abstract_unit' - -class RenderMailer < ActionMailer::Base - def inline_template - recipients 'test@localhost' - subject "using helpers" - from "tester@example.com" - - @world = "Earth" - body render(:inline => "Hello, <%= @world %>") - end - - def file_template - recipients 'test@localhost' - subject "using helpers" - from "tester@example.com" - - @recipient = 'test@localhost' - body render(:file => "templates/signed_up") - end - - def rxml_template - recipients 'test@localhost' - subject "rendering rxml template" - from "tester@example.com" - end - - def included_subtemplate - recipients 'test@localhost' - subject "Including another template in the one being rendered" - from "tester@example.com" - end - - def no_instance_variable - recipients 'test@localhost' - subject "No Instance Variable" - from "tester@example.com" - - silence_warnings do - body render(:inline => "Look, subject.nil? is <%= @subject.nil? %>!") - end - end - - def initialize_defaults(method_name) - super - mailer_name "test_mailer" - end - - def multipart_alternative - recipients 'test@localhost' - subject 'multipart/alternative' - from 'tester@example.com' - - build_multipart_message(:foo => "bar") - end - - private - def build_multipart_message(assigns = {}) - content_type "multipart/alternative" - - part "text/plain" do |p| - p.body = build_body_part('plain', assigns, :layout => false) - end - - part "text/html" do |p| - p.body = build_body_part('html', assigns) - end - end - - def build_body_part(content_type, assigns, options = {}) - ActiveSupport::Deprecation.silence do - render "#{template}.#{content_type}", :body => assigns - end - end -end - -class FirstMailer < ActionMailer::Base - def share - recipients 'test@localhost' - subject "using helpers" - from "tester@example.com" - end -end - -class SecondMailer < ActionMailer::Base - def share - recipients 'test@localhost' - subject "using helpers" - from "tester@example.com" - end -end - -# CHANGED: Those tests were changed because body returns an object now -# Instead of mail.body.strip, we should mail.body.to_s.strip -class RenderHelperTest < Test::Unit::TestCase - def setup - set_delivery_method :test - ActionMailer::Base.perform_deliveries = true - ActionMailer::Base.deliveries.clear - - @recipient = 'test@localhost' - end - - def teardown - restore_delivery_method - end - - def test_inline_template - mail = RenderMailer.inline_template - assert_equal "Hello, Earth", mail.body.to_s.strip - end - - def test_file_template - mail = RenderMailer.file_template - assert_equal "Hello there,\n\nMr. test@localhost", mail.body.to_s.strip - end - - def test_rxml_template - mail = RenderMailer.rxml_template.deliver - assert_equal %(\n), mail.body.to_s.strip - end - - def test_included_subtemplate - mail = RenderMailer.included_subtemplate.deliver - assert_equal "Hey Ho, let's go!", mail.body.to_s.strip - end - - def test_no_instance_variable - mail = RenderMailer.no_instance_variable.deliver - assert_equal "Look, subject.nil? is true!", mail.body.to_s.strip - end - - def test_legacy_multipart_alternative - mail = RenderMailer.multipart_alternative.deliver - assert_equal(2, mail.parts.size) - assert_equal("multipart/alternative", mail.mime_type) - assert_equal("text/plain", mail.parts[0].mime_type) - assert_equal("foo: bar", mail.parts[0].body.encoded) - assert_equal("text/html", mail.parts[1].mime_type) - assert_equal("foo bar", mail.parts[1].body.encoded) - end -end - -class FirstSecondHelperTest < Test::Unit::TestCase - def setup - set_delivery_method :test - ActionMailer::Base.perform_deliveries = true - ActionMailer::Base.deliveries.clear - - @recipient = 'test@localhost' - end - - def teardown - restore_delivery_method - end - - def test_ordering - mail = FirstMailer.share - assert_equal "first mail", mail.body.to_s.strip - mail = SecondMailer.share - assert_equal "second mail", mail.body.to_s.strip - mail = FirstMailer.share - assert_equal "first mail", mail.body.to_s.strip - mail = SecondMailer.share - assert_equal "second mail", mail.body.to_s.strip - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/old_base/mail_service_test.rb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/old_base/mail_service_test.rb deleted file mode 100644 index acc318ade..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/old_base/mail_service_test.rb +++ /dev/null @@ -1,1206 +0,0 @@ -# encoding: utf-8 -require 'abstract_unit' - -class FunkyPathMailer < ActionMailer::Base - self.view_paths = "#{File.dirname(__FILE__)}/../fixtures/path.with.dots" - - def multipart_with_template_path_with_dots(recipient) - recipients recipient - subject "This path has dots" - from "Chad Fowler " - attachment :content_type => "text/plain", - :data => "dots dots dots..." - end -end - -class TestMailer < ActionMailer::Base - def signed_up(recipient) - recipients recipient - subject "[Signed up] Welcome #{recipient}" - from "system@loudthinking.com" - - @recipient = recipient - end - - def cancelled_account(recipient) - recipients recipient - subject "[Cancelled] Goodbye #{recipient}" - from "system@loudthinking.com" - sent_on Time.local(2004, 12, 12) - body "Goodbye, Mr. #{recipient}" - end - - def from_with_name - from "System " - recipients "root@loudthinking.com" - body "Nothing to see here." - end - - def from_without_name - from "system@loudthinking.com" - recipients "root@loudthinking.com" - body "Nothing to see here." - end - - def cc_bcc(recipient) - recipients recipient - subject "testing bcc/cc" - from "system@loudthinking.com" - sent_on Time.local(2004, 12, 12) - cc "nobody@loudthinking.com" - bcc "root@loudthinking.com" - - body "Nothing to see here." - end - - def different_reply_to(recipient) - recipients recipient - subject "testing reply_to" - from "system@loudthinking.com" - sent_on Time.local(2008, 5, 23) - reply_to "atraver@gmail.com" - - body "Nothing to see here." - end - - def iso_charset(recipient) - recipients recipient - subject "testing isø charsets" - from "system@loudthinking.com" - sent_on Time.local(2004, 12, 12) - cc "nobody@loudthinking.com" - bcc "root@loudthinking.com" - charset "iso-8859-1" - - body "Nothing to see here." - end - - def unencoded_subject(recipient) - recipients recipient - subject "testing unencoded subject" - from "system@loudthinking.com" - sent_on Time.local(2004, 12, 12) - cc "nobody@loudthinking.com" - bcc "root@loudthinking.com" - - body "Nothing to see here." - end - - def extended_headers(recipient) - recipients recipient - subject "testing extended headers" - from "Grytøyr " - sent_on Time.local(2004, 12, 12) - cc "Grytøyr " - bcc "Grytøyr " - charset "iso-8859-1" - - body "Nothing to see here." - end - - def utf8_body(recipient) - recipients recipient - subject "testing utf-8 body" - from "Foo áëô îü " - sent_on Time.local(2004, 12, 12) - cc "Foo áëô îü " - bcc "Foo áëô îü " - charset "UTF-8" - - body "åœö blah" - end - - def multipart_with_mime_version(recipient) - recipients recipient - subject "multipart with mime_version" - from "test@example.com" - sent_on Time.local(2004, 12, 12) - mime_version "1.1" - content_type "multipart/alternative" - - part "text/plain" do |p| - p.body = render(:text => "blah") - end - - part "text/html" do |p| - p.body = render(:inline => "<%= content_tag(:b, 'blah') %>") - end - end - - def multipart_with_utf8_subject(recipient) - recipients recipient - subject "Foo áëô îü" - from "test@example.com" - charset "UTF-8" - - part "text/plain" do |p| - p.body = "blah" - end - - part "text/html" do |p| - p.body = "blah" - end - end - - def explicitly_multipart_example(recipient, ct=nil) - recipients recipient - subject "multipart example" - from "test@example.com" - sent_on Time.local(2004, 12, 12) - content_type ct if ct - - part "text/html" do |p| - p.charset = "iso-8859-1" - p.body = "blah" - end - - attachment :content_type => "image/jpeg", :filename => File.join(File.dirname(__FILE__), "fixtures", "attachments", "foo.jpg"), - :data => "123456789" - - body "plain text default" - end - - def implicitly_multipart_example(recipient, cs = nil, order = nil) - recipients recipient - subject "multipart example" - from "test@example.com" - sent_on Time.local(2004, 12, 12) - - @charset = cs if cs - @recipient = recipient - @implicit_parts_order = order if order - end - - def implicitly_multipart_with_utf8 - recipients "no.one@nowhere.test" - subject "Foo áëô îü" - from "some.one@somewhere.test" - template "implicitly_multipart_example" - - @recipient = "no.one@nowhere.test" - end - - def html_mail(recipient) - recipients recipient - subject "html mail" - from "test@example.com" - content_type "text/html" - - body "Emphasize this" - end - - def html_mail_with_underscores(recipient) - subject "html mail with underscores" - body %{_Google} - end - - def custom_template(recipient) - recipients recipient - subject "[Signed up] Welcome #{recipient}" - from "system@loudthinking.com" - sent_on Time.local(2004, 12, 12) - template "signed_up" - - @recipient = recipient - end - - def custom_templating_extension(recipient) - recipients recipient - subject "[Signed up] Welcome #{recipient}" - from "system@loudthinking.com" - sent_on Time.local(2004, 12, 12) - - @recipient = recipient - end - - def various_newlines(recipient) - recipients recipient - subject "various newlines" - from "test@example.com" - - body "line #1\nline #2\rline #3\r\nline #4\r\r" + - "line #5\n\nline#6\r\n\r\nline #7" - end - - def various_newlines_multipart(recipient) - recipients recipient - subject "various newlines multipart" - from "test@example.com" - content_type "multipart/alternative" - - part :content_type => "text/plain", :body => "line #1\nline #2\rline #3\r\nline #4\r\r" - part :content_type => "text/html", :body => "

line #1

\n

line #2

\r

line #3

\r\n

line #4

\r\r" - end - - def nested_multipart(recipient) - recipients recipient - subject "nested multipart" - from "test@example.com" - content_type "multipart/mixed" - - part :content_type => "multipart/alternative", :content_disposition => "inline", "foo" => "bar" do |p| - p.part :content_type => "text/plain", :body => "test text\nline #2" - p.part :content_type => "text/html", :body => "test HTML
\nline #2" - end - - attachment :content_type => "application/octet-stream", :filename => "test.txt", :data => "test abcdefghijklmnopqstuvwxyz" - end - - def nested_multipart_with_body(recipient) - recipients recipient - subject "nested multipart with body" - from "test@example.com" - content_type "multipart/mixed" - - part :content_type => "multipart/alternative", :content_disposition => "inline", :body => "Nothing to see here." do |p| - p.part :content_type => "text/html", :body => "test HTML
" - end - end - - def attachment_with_custom_header(recipient) - recipients recipient - subject "custom header in attachment" - from "test@example.com" - content_type "multipart/related" - part :content_type => "text/html", :body => 'yo' - attachment :content_type => "image/jpeg", :filename => File.join(File.dirname(__FILE__), "fixtures", "attachments", "test.jpg"), :data => "i am not a real picture", 'Content-ID' => '' - end - - def unnamed_attachment(recipient) - recipients recipient - subject "nested multipart" - from "test@example.com" - content_type "multipart/mixed" - part :content_type => "text/plain", :body => "hullo" - attachment :content_type => "application/octet-stream", :data => "test abcdefghijklmnopqstuvwxyz" - end - - def headers_with_nonalpha_chars(recipient) - recipients recipient - subject "nonalpha chars" - from "One: Two " - cc "Three: Four " - bcc "Five: Six " - body "testing" - end - - def custom_content_type_attributes - recipients "no.one@nowhere.test" - subject "custom content types" - from "some.one@somewhere.test" - content_type "text/plain; format=flowed" - body "testing" - end - - def return_path - recipients "no.one@nowhere.test" - subject "return path test" - from "some.one@somewhere.test" - headers["return-path"] = "another@somewhere.test" - body "testing" - end - - def subject_with_i18n(recipient) - recipients recipient - from "system@loudthinking.com" - body "testing" - end - - class << self - attr_accessor :received_body - end - - def receive(mail) - self.class.received_body = mail.body - end -end - -class ActionMailerTest < Test::Unit::TestCase - - def encode( text, charset="UTF-8" ) - Mail::Encodings.q_value_encode( text, charset ) - end - - def new_mail( charset="UTF-8" ) - mail = Mail.new - mail.charset = charset - mail.mime_version = "1.0" - mail - end - - # Replacing logger work around for mocha bug. Should be fixed in mocha 0.3.3 - def setup - set_delivery_method :test - ActionMailer::Base.perform_deliveries = true - ActionMailer::Base.raise_delivery_errors = true - ActionMailer::Base.deliveries.clear - - @original_logger = TestMailer.logger - @recipient = 'test@localhost' - - TestMailer.delivery_method = :test - end - - def teardown - TestMailer.logger = @original_logger - restore_delivery_method - end - - def test_nested_parts - created = nil - assert_nothing_raised { created = TestMailer.nested_multipart(@recipient)} - assert_equal 2, created.parts.size - assert_equal 2, created.parts.first.parts.size - - assert_equal "multipart/mixed", created.mime_type - assert_equal "multipart/alternative", created.parts[0].mime_type - assert_equal "bar", created.parts[0].header['foo'].to_s - assert_not_nil created.parts[0].charset - assert_equal "text/plain", created.parts[0].parts[0].mime_type - assert_equal "text/html", created.parts[0].parts[1].mime_type - assert_equal "application/octet-stream", created.parts[1].mime_type - - end - - def test_nested_parts_with_body - created = nil - TestMailer.nested_multipart_with_body(@recipient) - assert_nothing_raised { created = TestMailer.nested_multipart_with_body(@recipient)} - - assert_equal 1,created.parts.size - assert_equal 2,created.parts.first.parts.size - - assert_equal "multipart/mixed", created.mime_type - assert_equal "multipart/alternative", created.parts.first.mime_type - assert_equal "text/plain", created.parts.first.parts.first.mime_type - assert_equal "Nothing to see here.", created.parts.first.parts.first.body.to_s - assert_equal "text/html", created.parts.first.parts.second.mime_type - assert_equal "test HTML
", created.parts.first.parts.second.body.to_s - end - - def test_attachment_with_custom_header - created = nil - assert_nothing_raised { created = TestMailer.attachment_with_custom_header(@recipient) } - assert created.parts.any? { |p| p.header['content-id'].to_s == "" } - end - - def test_signed_up - TestMailer.delivery_method = :test - - Time.stubs(:now => Time.now) - - expected = new_mail - expected.to = @recipient - expected.subject = "[Signed up] Welcome #{@recipient}" - expected.body = "Hello there,\n\nMr. #{@recipient}" - expected.from = "system@loudthinking.com" - expected.date = Time.now - - created = nil - assert_nothing_raised { created = TestMailer.signed_up(@recipient) } - assert_not_nil created - - expected.message_id = '<123@456>' - created.message_id = '<123@456>' - - assert_equal expected.encoded, created.encoded - - assert_nothing_raised { TestMailer.signed_up(@recipient).deliver } - - delivered = ActionMailer::Base.deliveries.first - assert_not_nil delivered - - expected.message_id = '<123@456>' - delivered.message_id = '<123@456>' - - assert_equal expected.encoded, delivered.encoded - end - - def test_custom_template - expected = new_mail - expected.to = @recipient - expected.subject = "[Signed up] Welcome #{@recipient}" - expected.body = "Hello there,\n\nMr. #{@recipient}" - expected.from = "system@loudthinking.com" - expected.date = Time.local(2004, 12, 12) - - created = nil - assert_nothing_raised { created = TestMailer.custom_template(@recipient) } - assert_not_nil created - expected.message_id = '<123@456>' - created.message_id = '<123@456>' - assert_equal expected.encoded, created.encoded - end - - def test_custom_templating_extension - assert ActionView::Template.template_handler_extensions.include?("haml"), "haml extension was not registered" - - # N.b., custom_templating_extension.text.plain.haml is expected to be in fixtures/test_mailer directory - expected = new_mail - expected.to = @recipient - expected.subject = "[Signed up] Welcome #{@recipient}" - expected.body = "Hello there, \n\nMr. #{@recipient}" - expected.from = "system@loudthinking.com" - expected.date = Time.local(2004, 12, 12) - - # Now that the template is registered, there should be one part. The text/plain part. - created = nil - assert_nothing_raised { created = TestMailer.custom_templating_extension(@recipient) } - assert_not_nil created - assert_equal 2, created.parts.length - assert_equal 'text/plain', created.parts[0].mime_type - assert_equal 'text/html', created.parts[1].mime_type - end - - def test_cancelled_account - expected = new_mail - expected.to = @recipient - expected.subject = "[Cancelled] Goodbye #{@recipient}" - expected.body = "Goodbye, Mr. #{@recipient}" - expected.from = "system@loudthinking.com" - expected.date = Time.local(2004, 12, 12) - - created = nil - assert_nothing_raised { created = TestMailer.cancelled_account(@recipient) } - assert_not_nil created - expected.message_id = '<123@456>' - created.message_id = '<123@456>' - assert_equal expected.encoded, created.encoded - - assert_nothing_raised { TestMailer.cancelled_account(@recipient).deliver } - assert_not_nil ActionMailer::Base.deliveries.first - delivered = ActionMailer::Base.deliveries.first - expected.message_id = '<123@456>' - delivered.message_id = '<123@456>' - - assert_equal expected.encoded, delivered.encoded - end - - def test_cc_bcc - expected = new_mail - expected.to = @recipient - expected.subject = "testing bcc/cc" - expected.body = "Nothing to see here." - expected.from = "system@loudthinking.com" - expected.cc = "nobody@loudthinking.com" - expected.bcc = "root@loudthinking.com" - expected.date = Time.local 2004, 12, 12 - - created = nil - assert_nothing_raised do - created = TestMailer.cc_bcc @recipient - end - assert_not_nil created - expected.message_id = '<123@456>' - created.message_id = '<123@456>' - assert_equal expected.encoded, created.encoded - - assert_nothing_raised do - TestMailer.cc_bcc(@recipient).deliver - end - - assert_not_nil ActionMailer::Base.deliveries.first - delivered = ActionMailer::Base.deliveries.first - expected.message_id = '<123@456>' - delivered.message_id = '<123@456>' - - assert_equal expected.encoded, delivered.encoded - end - - def test_from_without_name_for_smtp - TestMailer.delivery_method = :smtp - TestMailer.from_without_name.deliver - - mail = MockSMTP.deliveries.first - assert_not_nil mail - mail, from, to = mail - - assert_equal 'system@loudthinking.com', from.to_s - end - - def test_from_with_name_for_smtp - TestMailer.delivery_method = :smtp - TestMailer.from_with_name.deliver - - mail = MockSMTP.deliveries.first - assert_not_nil mail - mail, from, to = mail - - assert_equal 'system@loudthinking.com', from - end - - def test_reply_to - TestMailer.delivery_method = :test - - expected = new_mail - - expected.to = @recipient - expected.subject = "testing reply_to" - expected.body = "Nothing to see here." - expected.from = "system@loudthinking.com" - expected.reply_to = "atraver@gmail.com" - expected.date = Time.local 2008, 5, 23 - - created = nil - assert_nothing_raised do - created = TestMailer.different_reply_to @recipient - end - assert_not_nil created - - expected.message_id = '<123@456>' - created.message_id = '<123@456>' - - assert_equal expected.encoded, created.encoded - - assert_nothing_raised do - TestMailer.different_reply_to(@recipient).deliver - end - - delivered = ActionMailer::Base.deliveries.first - assert_not_nil delivered - - expected.message_id = '<123@456>' - delivered.message_id = '<123@456>' - - assert_equal expected.encoded, delivered.encoded - end - - def test_iso_charset - TestMailer.delivery_method = :test - expected = new_mail( "iso-8859-1" ) - expected.to = @recipient - expected.subject = encode "testing isø charsets", "iso-8859-1" - expected.body = "Nothing to see here." - expected.from = "system@loudthinking.com" - expected.cc = "nobody@loudthinking.com" - expected.bcc = "root@loudthinking.com" - expected.date = Time.local 2004, 12, 12 - - created = nil - assert_nothing_raised do - created = TestMailer.iso_charset @recipient - end - assert_not_nil created - - expected.message_id = '<123@456>' - created.message_id = '<123@456>' - - assert_equal expected.encoded, created.encoded - - assert_nothing_raised do - TestMailer.iso_charset(@recipient).deliver - end - - delivered = ActionMailer::Base.deliveries.first - assert_not_nil delivered - - expected.message_id = '<123@456>' - delivered.message_id = '<123@456>' - - assert_equal expected.encoded, delivered.encoded - end - - def test_unencoded_subject - TestMailer.delivery_method = :test - expected = new_mail - expected.to = @recipient - expected.subject = "testing unencoded subject" - expected.body = "Nothing to see here." - expected.from = "system@loudthinking.com" - expected.cc = "nobody@loudthinking.com" - expected.bcc = "root@loudthinking.com" - expected.date = Time.local 2004, 12, 12 - - created = nil - assert_nothing_raised do - created = TestMailer.unencoded_subject @recipient - end - assert_not_nil created - - expected.message_id = '<123@456>' - created.message_id = '<123@456>' - - assert_equal expected.encoded, created.encoded - - assert_nothing_raised do - TestMailer.unencoded_subject(@recipient).deliver - end - - delivered = ActionMailer::Base.deliveries.first - assert_not_nil delivered - - expected.message_id = '<123@456>' - delivered.message_id = '<123@456>' - - assert_equal expected.encoded, delivered.encoded - end - - def test_deliveries_array - assert_not_nil ActionMailer::Base.deliveries - assert_equal 0, ActionMailer::Base.deliveries.size - TestMailer.signed_up(@recipient).deliver - assert_equal 1, ActionMailer::Base.deliveries.size - assert_not_nil ActionMailer::Base.deliveries.first - end - - def test_perform_deliveries_flag - ActionMailer::Base.perform_deliveries = false - TestMailer.signed_up(@recipient).deliver - assert_equal 0, ActionMailer::Base.deliveries.size - ActionMailer::Base.perform_deliveries = true - TestMailer.signed_up(@recipient).deliver - assert_equal 1, ActionMailer::Base.deliveries.size - end - - def test_doesnt_raise_errors_when_raise_delivery_errors_is_false - ActionMailer::Base.raise_delivery_errors = false - Mail::TestMailer.any_instance.expects(:deliver!).raises(Exception) - assert_nothing_raised { TestMailer.signed_up(@recipient).deliver } - end - - def test_performs_delivery_via_sendmail - IO.expects(:popen).once.with('/usr/sbin/sendmail -i -t -f "system@loudthinking.com" test@localhost', 'w+') - TestMailer.delivery_method = :sendmail - TestMailer.signed_up(@recipient).deliver - end - - def test_unquote_quoted_printable_subject - msg = <" - - expected = new_mail "iso-8859-1" - expected.to = @recipient - expected.subject = "testing extended headers" - expected.body = "Nothing to see here." - expected.from = "Grytøyr " - expected.cc = "Grytøyr " - expected.bcc = "Grytøyr " - expected.date = Time.local 2004, 12, 12 - - created = nil - assert_nothing_raised do - created = TestMailer.extended_headers @recipient - end - - assert_not_nil created - expected.message_id = '<123@456>' - created.message_id = '<123@456>' - - assert_equal expected.encoded, created.encoded - - assert_nothing_raised do - TestMailer.extended_headers(@recipient).deliver - end - - delivered = ActionMailer::Base.deliveries.first - assert_not_nil delivered - - expected.message_id = '<123@456>' - delivered.message_id = '<123@456>' - - assert_equal expected.encoded, delivered.encoded - end - - def test_utf8_body_is_not_quoted - @recipient = "Foo áëô îü " - expected = new_mail "UTF-8" - expected.to = @recipient - expected.subject = "testing UTF-8 body" - expected.body = "åœö blah" - expected.from = @recipient - expected.cc = @recipient - expected.bcc = @recipient - expected.date = Time.local 2004, 12, 12 - - created = TestMailer.utf8_body @recipient - assert_match(/åœö blah/, created.decoded) - end - - def test_multiple_utf8_recipients - @recipient = ["\"Foo áëô îü\" ", "\"Example Recipient\" "] - expected = new_mail "UTF-8" - expected.to = @recipient - expected.subject = "testing UTF-8 body" - expected.body = "åœö blah" - expected.from = @recipient.first - expected.cc = @recipient - expected.bcc = @recipient - expected.date = Time.local 2004, 12, 12 - - created = TestMailer.utf8_body @recipient - from_regexp = Regexp.escape('From: Foo =?UTF-8?B?w6HDq8O0?= =?UTF-8?B?IMOuw7w=?=') - assert_match(/#{from_regexp}/m, created.encoded) - - to_regexp = Regexp.escape("To: =?UTF-8?B?Rm9vIMOhw6vDtCDDrsO8?= ") - assert_match(/#{to_regexp}/m, created.encoded) - end - - def test_receive_decodes_base64_encoded_mail - fixture = File.read(File.dirname(__FILE__) + "/../fixtures/raw_email") - TestMailer.receive(fixture) - assert_match(/Jamis/, TestMailer.received_body.to_s) - end - - def test_receive_attachments - fixture = File.read(File.dirname(__FILE__) + "/../fixtures/raw_email2") - mail = Mail.new(fixture) - attachment = mail.attachments.last - assert_equal "smime.p7s", attachment.filename - assert_equal "application/pkcs7-signature", mail.parts.last.mime_type - end - - def test_decode_attachment_without_charset - fixture = File.read(File.dirname(__FILE__) + "/../fixtures/raw_email3") - mail = Mail.new(fixture) - attachment = mail.attachments.last - assert_equal 1026, attachment.read.length - end - - def test_attachment_using_content_location - fixture = File.read(File.dirname(__FILE__) + "/../fixtures/raw_email12") - mail = Mail.new(fixture) - assert_equal 1, mail.attachments.length - assert_equal "Photo25.jpg", mail.attachments.first.filename - end - - def test_attachment_with_text_type - fixture = File.read(File.dirname(__FILE__) + "/../fixtures/raw_email13") - mail = Mail.new(fixture) - assert mail.has_attachments? - assert_equal 1, mail.attachments.length - assert_equal "hello.rb", mail.attachments.first.filename - end - - def test_decode_part_without_content_type - fixture = File.read(File.dirname(__FILE__) + "/../fixtures/raw_email4") - mail = Mail.new(fixture) - assert_nothing_raised { mail.body } - end - - def test_decode_message_without_content_type - fixture = File.read(File.dirname(__FILE__) + "/../fixtures/raw_email5") - mail = Mail.new(fixture) - assert_nothing_raised { mail.body } - end - - def test_decode_message_with_incorrect_charset - fixture = File.read(File.dirname(__FILE__) + "/../fixtures/raw_email6") - mail = Mail.new(fixture) - assert_nothing_raised { mail.body } - end - - def test_multipart_with_mime_version - mail = TestMailer.multipart_with_mime_version(@recipient) - assert_equal "1.1", mail.mime_version - end - - def test_multipart_with_utf8_subject - mail = TestMailer.multipart_with_utf8_subject(@recipient) - regex = Regexp.escape('Subject: =?UTF-8?Q?Foo_=C3=A1=C3=AB=C3=B4_=C3=AE=C3=BC?=') - assert_match(/#{regex}/, mail.encoded) - string = "Foo áëô îü" - assert_match(string, mail.subject) - end - - def test_implicitly_multipart_with_utf8 - mail = TestMailer.implicitly_multipart_with_utf8 - regex = Regexp.escape('Subject: =?UTF-8?Q?Foo_=C3=A1=C3=AB=C3=B4_=C3=AE=C3=BC?=') - assert_match(/#{regex}/, mail.encoded) - string = "Foo áëô îü" - assert_match(string, mail.subject) - end - - def test_explicitly_multipart_messages - mail = TestMailer.explicitly_multipart_example(@recipient) - assert_equal 3, mail.parts.length - assert_equal 'multipart/mixed', mail.mime_type - assert_equal "text/plain", mail.parts[0].mime_type - - assert_equal "text/html", mail.parts[1].mime_type - assert_equal "iso-8859-1", mail.parts[1].charset - - assert_equal "image/jpeg", mail.parts[2].mime_type - - assert_equal "attachment", mail.parts[2][:content_disposition].disposition_type - assert_equal "foo.jpg", mail.parts[2][:content_disposition].filename - assert_equal "foo.jpg", mail.parts[2][:content_type].filename - assert_nil mail.parts[2].charset - end - - def test_explicitly_multipart_with_content_type - mail = TestMailer.explicitly_multipart_example(@recipient, "multipart/alternative") - assert_equal 3, mail.parts.length - assert_equal "multipart/alternative", mail.mime_type - end - - def test_explicitly_multipart_with_invalid_content_type - mail = TestMailer.explicitly_multipart_example(@recipient, "text/xml") - assert_equal 3, mail.parts.length - assert_equal 'multipart/mixed', mail.mime_type - end - - def test_implicitly_multipart_messages - assert ActionView::Template.template_handler_extensions.include?("bak"), "bak extension was not registered" - - mail = TestMailer.implicitly_multipart_example(@recipient) - assert_equal 3, mail.parts.length - assert_equal "1.0", mail.mime_version.to_s - assert_equal "multipart/alternative", mail.mime_type - assert_equal "text/plain", mail.parts[0].mime_type - assert_equal "UTF-8", mail.parts[0].charset - assert_equal "text/html", mail.parts[1].mime_type - assert_equal "UTF-8", mail.parts[1].charset - assert_equal "application/x-yaml", mail.parts[2].mime_type - assert_equal "UTF-8", mail.parts[2].charset - end - - def test_implicitly_multipart_messages_with_custom_order - assert ActionView::Template.template_handler_extensions.include?("bak"), "bak extension was not registered" - - mail = TestMailer.implicitly_multipart_example(@recipient, nil, ["application/x-yaml", "text/plain"]) - assert_equal 3, mail.parts.length - assert_equal "application/x-yaml", mail.parts[0].mime_type - assert_equal "text/plain", mail.parts[1].mime_type - assert_equal "text/html", mail.parts[2].mime_type - end - - def test_implicitly_multipart_messages_with_charset - mail = TestMailer.implicitly_multipart_example(@recipient, 'iso-8859-1') - - assert_equal "multipart/alternative", mail.header['content-type'].content_type - - assert_equal 'iso-8859-1', mail.parts[0].content_type_parameters[:charset] - assert_equal 'iso-8859-1', mail.parts[1].content_type_parameters[:charset] - assert_equal 'iso-8859-1', mail.parts[2].content_type_parameters[:charset] - end - - def test_html_mail - mail = TestMailer.html_mail(@recipient) - assert_equal "text/html", mail.mime_type - end - - def test_html_mail_with_underscores - mail = TestMailer.html_mail_with_underscores(@recipient) - assert_equal %{_Google}, mail.body.to_s - end - - def test_various_newlines - mail = TestMailer.various_newlines(@recipient) - assert_equal("line #1\nline #2\nline #3\nline #4\n\n" + - "line #5\n\nline#6\n\nline #7", mail.body.to_s) - end - - def test_various_newlines_multipart - mail = TestMailer.various_newlines_multipart(@recipient) - assert_equal "line #1\nline #2\nline #3\nline #4\n\n", mail.parts[0].body.to_s - assert_equal "

line #1

\n

line #2

\n

line #3

\n

line #4

\n\n", mail.parts[1].body.to_s - assert_equal "line #1\r\nline #2\r\nline #3\r\nline #4\r\n\r\n", mail.parts[0].body.encoded - assert_equal "

line #1

\r\n

line #2

\r\n

line #3

\r\n

line #4

\r\n\r\n", mail.parts[1].body.encoded - end - - def test_headers_removed_on_smtp_delivery - TestMailer.delivery_method = :smtp - TestMailer.cc_bcc(@recipient).deliver - assert MockSMTP.deliveries[0][2].include?("root@loudthinking.com") - assert MockSMTP.deliveries[0][2].include?("nobody@loudthinking.com") - assert MockSMTP.deliveries[0][2].include?(@recipient) - assert_match %r{^Cc: nobody@loudthinking.com}, MockSMTP.deliveries[0][0] - assert_match %r{^To: #{@recipient}}, MockSMTP.deliveries[0][0] - assert_no_match %r{^Bcc: root@loudthinking.com}, MockSMTP.deliveries[0][0] - end - - def test_file_delivery_should_create_a_file - TestMailer.delivery_method = :file - tmp_location = TestMailer.file_settings[:location] - - result = TestMailer.cc_bcc(@recipient).deliver - assert File.exists?(tmp_location) - assert File.directory?(tmp_location) - assert File.exists?(File.join(tmp_location, @recipient)) - assert File.exists?(File.join(tmp_location, 'nobody@loudthinking.com')) - assert File.exists?(File.join(tmp_location, 'root@loudthinking.com')) - end - - def test_recursive_multipart_processing - fixture = File.read(File.dirname(__FILE__) + "/../fixtures/raw_email7") - mail = Mail.new(fixture) - assert_equal(2, mail.parts.length) - assert_equal(4, mail.parts.first.parts.length) - assert_equal("This is the first part.", mail.parts.first.parts.first.body.to_s) - assert_equal("test.rb", mail.parts.first.parts.second.filename) - assert_equal("flowed", mail.parts.first.parts.fourth.content_type_parameters[:format]) - assert_equal('smime.p7s', mail.parts.second.filename) - end - - def test_decode_encoded_attachment_filename - fixture = File.read(File.dirname(__FILE__) + "/../fixtures/raw_email8") - mail = Mail.new(fixture) - attachment = mail.attachments.last - - expected = "01 Quien Te Dij\212at. Pitbull.mp3" - - if expected.respond_to?(:force_encoding) - result = attachment.filename.dup - expected.force_encoding(Encoding::ASCII_8BIT) - result.force_encoding(Encoding::ASCII_8BIT) - assert_equal expected, result - else - assert_equal expected, attachment.filename - end - end - - def test_decode_message_with_unknown_charset - fixture = File.read(File.dirname(__FILE__) + "/../fixtures/raw_email10") - mail = Mail.new(fixture) - assert_nothing_raised { mail.body } - end - - def test_empty_header_values_omitted - result = TestMailer.unnamed_attachment(@recipient).encoded - assert_match %r{Content-Type: application/octet-stream}, result - assert_match %r{Content-Disposition: attachment}, result - end - - def test_headers_with_nonalpha_chars - mail = TestMailer.headers_with_nonalpha_chars(@recipient) - assert !mail.from_addrs.empty? - assert !mail.cc_addrs.empty? - assert !mail.bcc_addrs.empty? - assert_match(/:/, mail[:from].decoded) - assert_match(/:/, mail[:cc].decoded) - assert_match(/:/, mail[:bcc].decoded) - end - - def test_with_mail_object_deliver - TestMailer.delivery_method = :test - mail = TestMailer.headers_with_nonalpha_chars(@recipient) - assert_nothing_raised { mail.deliver } - assert_equal 1, TestMailer.deliveries.length - end - - def test_multipart_with_template_path_with_dots - mail = FunkyPathMailer.multipart_with_template_path_with_dots(@recipient) - assert_equal 2, mail.parts.length - assert_equal "text/plain", mail.parts[0].mime_type - assert_equal "text/html", mail.parts[1].mime_type - assert_equal "UTF-8", mail.parts[1].charset - end - - def test_custom_content_type_attributes - mail = TestMailer.custom_content_type_attributes - assert_match %r{format=flowed}, mail.content_type - assert_match %r{charset=UTF-8}, mail.content_type - end - - def test_return_path_with_create - mail = TestMailer.return_path - assert_equal "another@somewhere.test", mail.return_path - end - - def test_return_path_with_deliver - TestMailer.delivery_method = :smtp - TestMailer.return_path.deliver - assert_match %r{^Return-Path: }, MockSMTP.deliveries[0][0] - assert_equal "another@somewhere.test", MockSMTP.deliveries[0][1].to_s - end - - def test_starttls_is_enabled_if_supported - TestMailer.smtp_settings.merge!(:enable_starttls_auto => true) - MockSMTP.any_instance.expects(:respond_to?).with(:enable_starttls_auto).returns(true) - MockSMTP.any_instance.expects(:enable_starttls_auto) - TestMailer.delivery_method = :smtp - TestMailer.signed_up(@recipient).deliver - end - - def test_starttls_is_disabled_if_not_supported - TestMailer.smtp_settings.merge!(:enable_starttls_auto => true) - MockSMTP.any_instance.expects(:respond_to?).with(:enable_starttls_auto).returns(false) - MockSMTP.any_instance.expects(:enable_starttls_auto).never - TestMailer.delivery_method = :smtp - TestMailer.signed_up(@recipient).deliver - end - - def test_starttls_is_not_enabled - TestMailer.smtp_settings.merge!(:enable_starttls_auto => false) - MockSMTP.any_instance.expects(:respond_to?).never - TestMailer.delivery_method = :smtp - TestMailer.signed_up(@recipient).deliver - ensure - TestMailer.smtp_settings.merge!(:enable_starttls_auto => true) - end -end - -class InheritableTemplateRootTest < ActiveSupport::TestCase - def test_attr - expected = File.expand_path("#{File.dirname(__FILE__)}/../fixtures/path.with.dots") - assert_equal expected, FunkyPathMailer.template_root.to_s - - sub = Class.new(FunkyPathMailer) - assert_deprecated do - sub.template_root = 'test/path' - end - - assert_equal File.expand_path('test/path'), sub.template_root.to_s - assert_equal expected, FunkyPathMailer.template_root.to_s - end -end - -class MethodNamingTest < ActiveSupport::TestCase - include ActionMailer::TestHelper - - class TestMailer < ActionMailer::Base - def send - body 'foo' - end - end - - def setup - set_delivery_method :test - ActionMailer::Base.perform_deliveries = true - ActionMailer::Base.deliveries.clear - end - - def teardown - restore_delivery_method - end - - def test_send_method - assert_nothing_raised do - assert_emails 1 do - assert_deprecated do - TestMailer.deliver_send - end - end - end - end -end -class RespondToTest < Test::Unit::TestCase - class RespondToMailer < ActionMailer::Base; end - - def setup - set_delivery_method :test - end - - def teardown - restore_delivery_method - end - - def test_should_respond_to_new - assert_respond_to RespondToMailer, :new - end - - def test_should_respond_to_create_with_template_suffix - assert_respond_to RespondToMailer, :create_any_old_template - end - - def test_should_respond_to_deliver_with_template_suffix - assert_respond_to RespondToMailer, :deliver_any_old_template - end - - def test_should_not_respond_to_new_with_template_suffix - assert !RespondToMailer.respond_to?(:new_any_old_template) - end - - def test_should_not_respond_to_create_with_template_suffix_unless_it_is_separated_by_an_underscore - assert !RespondToMailer.respond_to?(:createany_old_template) - end - - def test_should_not_respond_to_deliver_with_template_suffix_unless_it_is_separated_by_an_underscore - assert !RespondToMailer.respond_to?(:deliverany_old_template) - end - - def test_should_not_respond_to_create_with_template_suffix_if_it_begins_with_a_uppercase_letter - assert !RespondToMailer.respond_to?(:create_Any_old_template) - end - - def test_should_not_respond_to_deliver_with_template_suffix_if_it_begins_with_a_uppercase_letter - assert !RespondToMailer.respond_to?(:deliver_Any_old_template) - end - - def test_should_not_respond_to_create_with_template_suffix_if_it_begins_with_a_digit - assert !RespondToMailer.respond_to?(:create_1_template) - end - - def test_should_not_respond_to_deliver_with_template_suffix_if_it_begins_with_a_digit - assert !RespondToMailer.respond_to?(:deliver_1_template) - end - - def test_should_not_respond_to_method_where_deliver_is_not_a_suffix - assert !RespondToMailer.respond_to?(:foo_deliver_template) - end - - def test_should_still_raise_exception_with_expected_message_when_calling_an_undefined_method - error = assert_raise NoMethodError do - RespondToMailer.not_a_method - end - - assert_match(/method.*not_a_method/, error.message) - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/old_base/tmail_compat_test.rb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/old_base/tmail_compat_test.rb deleted file mode 100644 index 2953c7452..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/old_base/tmail_compat_test.rb +++ /dev/null @@ -1,35 +0,0 @@ -require 'abstract_unit' - -class TmailCompatTest < ActiveSupport::TestCase - - def test_set_content_type_raises_deprecation_warning - mail = Mail.new - assert_deprecated do - assert_nothing_raised do - mail.set_content_type "text/plain" - end - end - assert_equal mail.mime_type, "text/plain" - end - - def test_transfer_encoding_raises_deprecation_warning - mail = Mail.new - assert_deprecated do - assert_nothing_raised do - mail.transfer_encoding "base64" - end - end - assert_equal mail.content_transfer_encoding, "base64" - end - - def test_transfer_encoding_setter_raises_deprecation_warning - mail = Mail.new - assert_deprecated do - assert_nothing_raised do - mail.transfer_encoding = "base64" - end - end - assert_equal mail.content_transfer_encoding, "base64" - end - -end diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/old_base/url_test.rb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/old_base/url_test.rb deleted file mode 100644 index e5a4b8008..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/old_base/url_test.rb +++ /dev/null @@ -1,90 +0,0 @@ -require 'abstract_unit' -require 'action_controller' - -class WelcomeController < ActionController::Base -end - -AppRoutes = ActionDispatch::Routing::RouteSet.new - -class ActionMailer::Base - include AppRoutes.url_helpers -end - -class UrlTestMailer < ActionMailer::Base - default_url_options[:host] = 'www.basecamphq.com' - - configure do |c| - c.assets_dir = '' # To get the tests to pass - end - - def signed_up_with_url(recipient) - @recipients = recipient - @subject = "[Signed up] Welcome #{recipient}" - @from = "system@loudthinking.com" - @sent_on = Time.local(2004, 12, 12) - - @recipient = recipient - @welcome_url = url_for :host => "example.com", :controller => "welcome", :action => "greeting" - end -end - -class ActionMailerUrlTest < ActionMailer::TestCase - - def encode( text, charset="UTF-8" ) - quoted_printable( text, charset ) - end - - def new_mail( charset="UTF-8" ) - mail = Mail.new - mail.mime_version = "1.0" - if charset - mail.content_type ["text", "plain", { "charset" => charset }] - end - mail - end - - def setup - set_delivery_method :test - ActionMailer::Base.perform_deliveries = true - ActionMailer::Base.deliveries.clear - - @recipient = 'test@localhost' - end - - def teardown - restore_delivery_method - end - - def test_signed_up_with_url - UrlTestMailer.delivery_method = :test - - assert_deprecated do - AppRoutes.draw do |map| - map.connect ':controller/:action/:id' - map.welcome 'welcome', :controller=>"foo", :action=>"bar" - end - end - - expected = new_mail - expected.to = @recipient - expected.subject = "[Signed up] Welcome #{@recipient}" - expected.body = "Hello there,\n\nMr. #{@recipient}. Please see our greeting at http://example.com/welcome/greeting http://www.basecamphq.com/welcome\n\n\"Somelogo\"" - expected.from = "system@loudthinking.com" - expected.date = Time.local(2004, 12, 12) - - created = nil - assert_nothing_raised { created = UrlTestMailer.signed_up_with_url(@recipient) } - assert_not_nil created - - expected.message_id = '<123@456>' - created.message_id = '<123@456>' - assert_equal expected.encoded, created.encoded - - assert_nothing_raised { UrlTestMailer.signed_up_with_url(@recipient).deliver } - assert_not_nil ActionMailer::Base.deliveries.first - delivered = ActionMailer::Base.deliveries.first - - delivered.message_id = '<123@456>' - assert_equal expected.encoded, delivered.encoded - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionmailer/test/test_helper_test.rb b/Tests/Libraries/Rails-3.0.0/actionmailer/test/test_helper_test.rb deleted file mode 100644 index a8d22f97e..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionmailer/test/test_helper_test.rb +++ /dev/null @@ -1,127 +0,0 @@ -require 'abstract_unit' - -class TestHelperMailer < ActionMailer::Base - def test - recipients "test@example.com" - from "tester@example.com" - - @world = "Earth" - render(:inline => "Hello, <%= @world %>") - end -end - -class TestHelperMailerTest < ActionMailer::TestCase - def test_setup_sets_right_action_mailer_options - assert_equal :test, ActionMailer::Base.delivery_method - assert ActionMailer::Base.perform_deliveries - assert_equal [], ActionMailer::Base.deliveries - end - - def test_setup_creates_the_expected_mailer - assert_kind_of Mail::Message, @expected - assert_equal "1.0", @expected.mime_version - assert_equal "text/plain", @expected.mime_type - end - - def test_mailer_class_is_correctly_inferred - assert_equal TestHelperMailer, self.class.mailer_class - end - - def test_determine_default_mailer_raises_correct_error - assert_raise(ActionMailer::NonInferrableMailerError) do - self.class.determine_default_mailer("NotAMailerTest") - end - end - - def test_charset_is_utf_8 - assert_equal "UTF-8", charset - end - - def test_assert_emails - assert_nothing_raised do - assert_emails 1 do - TestHelperMailer.test.deliver - end - end - end - - def test_repeated_assert_emails_calls - assert_nothing_raised do - assert_emails 1 do - TestHelperMailer.test.deliver - end - end - - assert_nothing_raised do - assert_emails 2 do - TestHelperMailer.test.deliver - TestHelperMailer.test.deliver - end - end - end - - def test_assert_emails_with_no_block - assert_nothing_raised do - TestHelperMailer.test.deliver - assert_emails 1 - end - - assert_nothing_raised do - TestHelperMailer.test.deliver - TestHelperMailer.test.deliver - assert_emails 3 - end - end - - def test_assert_no_emails - assert_nothing_raised do - assert_no_emails do - TestHelperMailer.test - end - end - end - - def test_assert_emails_too_few_sent - error = assert_raise ActiveSupport::TestCase::Assertion do - assert_emails 2 do - TestHelperMailer.test.deliver - end - end - - assert_match(/2 .* but 1/, error.message) - end - - def test_assert_emails_too_many_sent - error = assert_raise ActiveSupport::TestCase::Assertion do - assert_emails 1 do - TestHelperMailer.test.deliver - TestHelperMailer.test.deliver - end - end - - assert_match(/1 .* but 2/, error.message) - end - - def test_assert_no_emails_failure - error = assert_raise ActiveSupport::TestCase::Assertion do - assert_no_emails do - TestHelperMailer.test.deliver - end - end - - assert_match(/0 .* but 1/, error.message) - end -end - -class AnotherTestHelperMailerTest < ActionMailer::TestCase - tests TestHelperMailer - - def setup - @test_var = "a value" - end - - def test_setup_shouldnt_conflict_with_mailer_setup - assert_kind_of Mail::Message, @expected - assert_equal 'a value', @test_var - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/MIT-LICENSE b/Tests/Libraries/Rails-3.0.0/actionpack/MIT-LICENSE deleted file mode 100644 index 77d558ab8..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/MIT-LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -Copyright (c) 2004-2010 David Heinemeier Hansson - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/abstract_controller_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/abstract_controller_test.rb deleted file mode 100644 index f4599c83b..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/abstract_controller_test.rb +++ /dev/null @@ -1,268 +0,0 @@ -require 'abstract_unit' - -module AbstractController - module Testing - - # Test basic dispatching. - # ==== - # * Call process - # * Test that the response_body is set correctly - class SimpleController < AbstractController::Base - end - - class Me < SimpleController - def index - self.response_body = "Hello world" - "Something else" - end - end - - class TestBasic < ActiveSupport::TestCase - test "dispatching works" do - controller = Me.new - controller.process(:index) - assert_equal "Hello world", controller.response_body - end - end - - # Test Render mixin - # ==== - class RenderingController < AbstractController::Base - include ::AbstractController::Rendering - - def _prefix() end - - def render(options = {}) - if options.is_a?(String) - options = {:_template_name => options} - end - - options[:_prefix] = _prefix - super - end - - append_view_path File.expand_path(File.join(File.dirname(__FILE__), "views")) - end - - class Me2 < RenderingController - def index - render "index.erb" - end - - def index_to_string - self.response_body = render_to_string "index.erb" - end - - def action_with_ivars - @my_ivar = "Hello" - render "action_with_ivars.erb" - end - - def naked_render - render - end - - def rendering_to_body - self.response_body = render_to_body :template => "naked_render.erb" - end - - def rendering_to_string - self.response_body = render_to_string :template => "naked_render.erb" - end - end - - class TestRenderingController < ActiveSupport::TestCase - def setup - @controller = Me2.new - end - - test "rendering templates works" do - @controller.process(:index) - assert_equal "Hello from index.erb", @controller.response_body - end - - test "render_to_string works with a String as an argument" do - @controller.process(:index_to_string) - assert_equal "Hello from index.erb", @controller.response_body - end - - test "rendering passes ivars to the view" do - @controller.process(:action_with_ivars) - assert_equal "Hello from index_with_ivars.erb", @controller.response_body - end - - test "rendering with no template name" do - @controller.process(:naked_render) - assert_equal "Hello from naked_render.erb", @controller.response_body - end - - test "rendering to a rack body" do - @controller.process(:rendering_to_body) - assert_equal "Hello from naked_render.erb", @controller.response_body - end - - test "rendering to a string" do - @controller.process(:rendering_to_string) - assert_equal "Hello from naked_render.erb", @controller.response_body - end - end - - # Test rendering with prefixes - # ==== - # * self._prefix is used when defined - class PrefixedViews < RenderingController - private - def self.prefix - name.underscore - end - - def _prefix - self.class.prefix - end - end - - class Me3 < PrefixedViews - def index - render - end - - def formatted - self.formats = [:html] - render - end - end - - class TestPrefixedViews < ActiveSupport::TestCase - def setup - @controller = Me3.new - end - - test "templates are located inside their 'prefix' folder" do - @controller.process(:index) - assert_equal "Hello from me3/index.erb", @controller.response_body - end - - test "templates included their format" do - @controller.process(:formatted) - assert_equal "Hello from me3/formatted.html.erb", @controller.response_body - end - end - - # Test rendering with layouts - # ==== - # self._layout is used when defined - class WithLayouts < PrefixedViews - include Layouts - - private - def self.layout(formats) - begin - find_template(name.underscore, {:formats => formats}, :_prefix => "layouts") - rescue ActionView::MissingTemplate - begin - find_template("application", {:formats => formats}, :_prefix => "layouts") - rescue ActionView::MissingTemplate - end - end - end - - def render_to_body(options = {}) - options[:_layout] = options[:layout] || _default_layout({}) - super - end - end - - class Me4 < WithLayouts - def index - render - end - end - - class Me5 < WithLayouts - def index - render - end - end - - class TestLayouts < ActiveSupport::TestCase - test "layouts are included" do - controller = Me4.new - result = controller.process(:index) - assert_equal "Me4 Enter : Hello from me4/index.erb : Exit", controller.response_body - end - end - - # respond_to_action?(action_name) - # ==== - # * A method can be used as an action only if this method - # returns true when passed the method name as an argument - # * Defaults to true in AbstractController - class DefaultRespondToActionController < AbstractController::Base - def index() self.response_body = "success" end - end - - class ActionMissingRespondToActionController < AbstractController::Base - # No actions - private - def action_missing(action_name) - self.response_body = "success" - end - end - - class RespondToActionController < AbstractController::Base; - def index() self.response_body = "success" end - - def fail() self.response_body = "fail" end - - private - - def method_for_action(action_name) - action_name.to_s != "fail" && action_name - end - end - - class TestRespondToAction < ActiveSupport::TestCase - - def assert_dispatch(klass, body = "success", action = :index) - controller = klass.new - controller.process(action) - assert_equal body, controller.response_body - end - - test "an arbitrary method is available as an action by default" do - assert_dispatch DefaultRespondToActionController, "success", :index - end - - test "raises ActionNotFound when method does not exist and action_missing is not defined" do - assert_raise(ActionNotFound) { DefaultRespondToActionController.new.process(:fail) } - end - - test "dispatches to action_missing when method does not exist and action_missing is defined" do - assert_dispatch ActionMissingRespondToActionController, "success", :ohai - end - - test "a method is available as an action if respond_to_action? returns true" do - assert_dispatch RespondToActionController, "success", :index - end - - test "raises ActionNotFound if method is defined but respond_to_action? returns false" do - assert_raise(ActionNotFound) { RespondToActionController.new.process(:fail) } - end - end - - class Me6 < AbstractController::Base - self.action_methods - - def index - end - end - - class TestActionMethodsReloading < ActiveSupport::TestCase - - test "action_methods should be reloaded after defining a new method" do - assert_equal ["index"], Me6.action_methods - end - end - - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/callbacks_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/callbacks_test.rb deleted file mode 100644 index 20eb75af8..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/callbacks_test.rb +++ /dev/null @@ -1,248 +0,0 @@ -require 'abstract_unit' - -module AbstractController - module Testing - - class ControllerWithCallbacks < AbstractController::Base - include AbstractController::Callbacks - end - - class Callback1 < ControllerWithCallbacks - set_callback :process_action, :before, :first - - def first - @text = "Hello world" - end - - def index - self.response_body = @text - end - end - - class TestCallbacks1 < ActiveSupport::TestCase - test "basic callbacks work" do - controller = Callback1.new - result = controller.process(:index) - assert_equal "Hello world", controller.response_body - end - end - - class Callback2 < ControllerWithCallbacks - before_filter :first - after_filter :second - around_filter :aroundz - - def first - @text = "Hello world" - end - - def second - @second = "Goodbye" - end - - def aroundz - @aroundz = "FIRST" - yield - @aroundz << "SECOND" - end - - def index - self.response_body = @text.to_s - end - end - - class Callback2Overwrite < Callback2 - before_filter :first, :except => :index - end - - class TestCallbacks2 < ActiveSupport::TestCase - def setup - @controller = Callback2.new - end - - test "before_filter works" do - result = @controller.process(:index) - assert_equal "Hello world", @controller.response_body - end - - test "after_filter works" do - @controller.process(:index) - assert_equal "Goodbye", @controller.instance_variable_get("@second") - end - - test "around_filter works" do - @controller.process(:index) - assert_equal "FIRSTSECOND", @controller.instance_variable_get("@aroundz") - end - - test "before_filter with overwritten condition" do - @controller = Callback2Overwrite.new - result = @controller.process(:index) - assert_equal "", @controller.response_body - end - end - - class Callback3 < ControllerWithCallbacks - before_filter do |c| - c.instance_variable_set("@text", "Hello world") - end - - after_filter do |c| - c.instance_variable_set("@second", "Goodbye") - end - - def index - self.response_body = @text - end - end - - class TestCallbacks3 < ActiveSupport::TestCase - def setup - @controller = Callback3.new - end - - test "before_filter works with procs" do - result = @controller.process(:index) - assert_equal "Hello world", @controller.response_body - end - - test "after_filter works with procs" do - result = @controller.process(:index) - assert_equal "Goodbye", @controller.instance_variable_get("@second") - end - end - - class CallbacksWithConditions < ControllerWithCallbacks - before_filter :list, :only => :index - before_filter :authenticate, :except => :index - - def index - self.response_body = @list.join(", ") - end - - def sekrit_data - self.response_body = (@list + [@authenticated]).join(", ") - end - - private - def list - @list = ["Hello", "World"] - end - - def authenticate - @list = [] - @authenticated = "true" - end - end - - class TestCallbacksWithConditions < ActiveSupport::TestCase - def setup - @controller = CallbacksWithConditions.new - end - - test "when :only is specified, a before filter is triggered on that action" do - @controller.process(:index) - assert_equal "Hello, World", @controller.response_body - end - - test "when :only is specified, a before filter is not triggered on other actions" do - @controller.process(:sekrit_data) - assert_equal "true", @controller.response_body - end - - test "when :except is specified, an after filter is not triggered on that action" do - result = @controller.process(:index) - assert_nil @controller.instance_variable_get("@authenticated") - end - end - - class CallbacksWithArrayConditions < ControllerWithCallbacks - before_filter :list, :only => [:index, :listy] - before_filter :authenticate, :except => [:index, :listy] - - def index - self.response_body = @list.join(", ") - end - - def sekrit_data - self.response_body = (@list + [@authenticated]).join(", ") - end - - private - def list - @list = ["Hello", "World"] - end - - def authenticate - @list = [] - @authenticated = "true" - end - end - - class TestCallbacksWithArrayConditions < ActiveSupport::TestCase - def setup - @controller = CallbacksWithArrayConditions.new - end - - test "when :only is specified with an array, a before filter is triggered on that action" do - result = @controller.process(:index) - assert_equal "Hello, World", @controller.response_body - end - - test "when :only is specified with an array, a before filter is not triggered on other actions" do - result = @controller.process(:sekrit_data) - assert_equal "true", @controller.response_body - end - - test "when :except is specified with an array, an after filter is not triggered on that action" do - result = @controller.process(:index) - assert_nil @controller.instance_variable_get("@authenticated") - end - end - - class ChangedConditions < Callback2 - before_filter :first, :only => :index - - def not_index - self.response_body = @text.to_s - end - end - - class TestCallbacksWithChangedConditions < ActiveSupport::TestCase - def setup - @controller = ChangedConditions.new - end - - test "when a callback is modified in a child with :only, it works for the :only action" do - result = @controller.process(:index) - assert_equal "Hello world", @controller.response_body - end - - test "when a callback is modified in a child with :only, it does not work for other actions" do - result = @controller.process(:not_index) - assert_equal "", @controller.response_body - end - end - - class SetsResponseBody < ControllerWithCallbacks - before_filter :set_body - - def index - self.response_body = "Fail" - end - - def set_body - self.response_body = "Success" - end - end - - class TestHalting < ActiveSupport::TestCase - test "when a callback sets the response body, the action should not be invoked" do - controller = SetsResponseBody.new - controller.process(:index) - assert_equal "Success", controller.response_body - end - end - - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/collector_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/collector_test.rb deleted file mode 100644 index a0cac3f3f..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/collector_test.rb +++ /dev/null @@ -1,57 +0,0 @@ -require 'abstract_unit' - -module AbstractController - module Testing - class MyCollector - include Collector - attr_accessor :responses - - def initialize - @responses = [] - end - - def custom(mime, *args, &block) - @responses << [mime, args, block] - end - end - - class TestCollector < ActiveSupport::TestCase - test "responds to default mime types" do - collector = MyCollector.new - assert_respond_to collector, :html - assert_respond_to collector, :text - end - - test "does not respond to unknown mime types" do - collector = MyCollector.new - assert !collector.respond_to?(:unknown) - end - - test "register mime types on method missing" do - AbstractController::Collector.send(:remove_method, :js) - collector = MyCollector.new - assert !collector.respond_to?(:js) - collector.js - assert_respond_to collector, :js - end - - test "does not register unknown mime types" do - collector = MyCollector.new - assert_raise NameError do - collector.unknown - end - end - - test "generated methods call custom with args received" do - collector = MyCollector.new - collector.html - collector.text(:foo) - collector.js(:bar) { :baz } - assert_equal [Mime::HTML, [], nil], collector.responses[0] - assert_equal [Mime::TEXT, [:foo], nil], collector.responses[1] - assert_equal [Mime::JS, [:bar]], collector.responses[2][0,2] - assert_equal :baz, collector.responses[2][2].call - end - end - end -end \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/helper_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/helper_test.rb deleted file mode 100644 index 6d3ce7984..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/helper_test.rb +++ /dev/null @@ -1,98 +0,0 @@ -require 'abstract_unit' - -ActionController::Base.helpers_path = File.expand_path('../../fixtures/helpers', __FILE__) - -module AbstractController - module Testing - - class ControllerWithHelpers < AbstractController::Base - include AbstractController::Rendering - include Helpers - - def with_module - render :inline => "Module <%= included_method %>" - end - end - - module HelperyTest - def included_method - "Included" - end - end - - class AbstractHelpers < ControllerWithHelpers - helper(HelperyTest) do - def helpery_test - "World" - end - end - - helper :abc - - def with_block - render :inline => "Hello <%= helpery_test %>" - end - - def with_symbol - render :inline => "I respond to bare_a: <%= respond_to?(:bare_a) %>" - end - end - - class ::HelperyTestController < AbstractHelpers - clear_helpers - end - - class AbstractHelpersBlock < ControllerWithHelpers - helper do - include ::AbstractController::Testing::HelperyTest - end - end - - class TestHelpers < ActiveSupport::TestCase - def setup - @controller = AbstractHelpers.new - end - - def test_helpers_with_block - @controller.process(:with_block) - assert_equal "Hello World", @controller.response_body - end - - def test_helpers_with_module - @controller.process(:with_module) - assert_equal "Module Included", @controller.response_body - end - - def test_helpers_with_symbol - @controller.process(:with_symbol) - assert_equal "I respond to bare_a: true", @controller.response_body - end - - def test_declare_missing_helper - assert_raise(MissingSourceFile) { AbstractHelpers.helper :missing } - end - - def test_helpers_with_module_through_block - @controller = AbstractHelpersBlock.new - @controller.process(:with_module) - assert_equal "Module Included", @controller.response_body - end - end - - class ClearHelpersTest < ActiveSupport::TestCase - def setup - @controller = HelperyTestController.new - end - - def test_clears_up_previous_helpers - @controller.process(:with_symbol) - assert_equal "I respond to bare_a: false", @controller.response_body - end - - def test_includes_controller_default_helper - @controller.process(:with_block) - assert_equal "Hello Default", @controller.response_body - end - end - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/layouts_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/layouts_test.rb deleted file mode 100644 index e721652cb..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/layouts_test.rb +++ /dev/null @@ -1,277 +0,0 @@ -require 'abstract_unit' - -module AbstractControllerTests - module Layouts - - # Base controller for these tests - class Base < AbstractController::Base - include AbstractController::Rendering - include AbstractController::Layouts - - self.view_paths = [ActionView::FixtureResolver.new( - "layouts/hello.erb" => "With String <%= yield %>", - "layouts/hello_override.erb" => "With Override <%= yield %>", - "layouts/overwrite.erb" => "Overwrite <%= yield %>", - "layouts/with_false_layout.erb" => "False Layout <%= yield %>", - "abstract_controller_tests/layouts/with_string_implied_child.erb" => - "With Implied <%= yield %>" - )] - end - - class Blank < Base - self.view_paths = [] - - def index - render :template => ActionView::Template::Text.new("Hello blank!") - end - end - - class WithString < Base - layout "hello" - - def index - render :template => ActionView::Template::Text.new("Hello string!") - end - - def overwrite_default - render :template => ActionView::Template::Text.new("Hello string!"), :layout => :default - end - - def overwrite_false - render :template => ActionView::Template::Text.new("Hello string!"), :layout => false - end - - def overwrite_string - render :template => ActionView::Template::Text.new("Hello string!"), :layout => "overwrite" - end - - def overwrite_skip - render :text => "Hello text!" - end - end - - class WithStringChild < WithString - end - - class WithStringOverriddenChild < WithString - layout "hello_override" - end - - class WithNilChild < WithString - layout nil - end - - class WithStringImpliedChild < WithString - end - - class WithChildOfImplied < WithStringImpliedChild - end - - class WithProc < Base - layout proc { |c| "overwrite" } - - def index - render :template => ActionView::Template::Text.new("Hello proc!") - end - end - - class WithSymbol < Base - layout :hello - - def index - render :template => ActionView::Template::Text.new("Hello symbol!") - end - private - def hello - "overwrite" - end - end - - class WithSymbolReturningString < Base - layout :no_hello - - def index - render :template => ActionView::Template::Text.new("Hello missing symbol!") - end - private - def no_hello - nil - end - end - - class WithSymbolReturningNil < Base - layout :nilz - - def index - render :template => ActionView::Template::Text.new("Hello nilz!") - end - - def nilz() end - end - - class WithSymbolReturningObj < Base - layout :objekt - - def index - render :template => ActionView::Template::Text.new("Hello nilz!") - end - - def objekt - Object.new - end - end - - class WithSymbolAndNoMethod < Base - layout :no_method - - def index - render :template => ActionView::Template::Text.new("Hello boom!") - end - end - - class WithMissingLayout < Base - layout "missing" - - def index - render :template => ActionView::Template::Text.new("Hello missing!") - end - end - - class WithFalseLayout < Base - layout false - - def index - render :template => ActionView::Template::Text.new("Hello false!") - end - end - - class WithNilLayout < Base - layout nil - - def index - render :template => ActionView::Template::Text.new("Hello nil!") - end - end - - class TestBase < ActiveSupport::TestCase - test "when no layout is specified, and no default is available, render without a layout" do - controller = Blank.new - controller.process(:index) - assert_equal "Hello blank!", controller.response_body - end - - test "when layout is specified as a string, render with that layout" do - controller = WithString.new - controller.process(:index) - assert_equal "With String Hello string!", controller.response_body - end - - test "when layout is overwriten by :default in render, render default layout" do - controller = WithString.new - controller.process(:overwrite_default) - assert_equal "With String Hello string!", controller.response_body - end - - test "when layout is overwriten by string in render, render new layout" do - controller = WithString.new - controller.process(:overwrite_string) - assert_equal "Overwrite Hello string!", controller.response_body - end - - test "when layout is overwriten by false in render, render no layout" do - controller = WithString.new - controller.process(:overwrite_false) - assert_equal "Hello string!", controller.response_body - end - - test "when text is rendered, render no layout" do - controller = WithString.new - controller.process(:overwrite_skip) - assert_equal "Hello text!", controller.response_body - end - - test "when layout is specified as a string, but the layout is missing, raise an exception" do - assert_raises(ActionView::MissingTemplate) { WithMissingLayout.new.process(:index) } - end - - test "when layout is specified as false, do not use a layout" do - controller = WithFalseLayout.new - controller.process(:index) - assert_equal "Hello false!", controller.response_body - end - - test "when layout is specified as nil, do not use a layout" do - controller = WithNilLayout.new - controller.process(:index) - assert_equal "Hello nil!", controller.response_body - end - - test "when layout is specified as a proc, call it and use the layout returned" do - controller = WithProc.new - controller.process(:index) - assert_equal "Overwrite Hello proc!", controller.response_body - end - - test "when layout is specified as a symbol, call the requested method and use the layout returned" do - controller = WithSymbol.new - controller.process(:index) - assert_equal "Overwrite Hello symbol!", controller.response_body - end - - test "when layout is specified as a symbol and the method returns nil, don't use a layout" do - controller = WithSymbolReturningNil.new - controller.process(:index) - assert_equal "Hello nilz!", controller.response_body - end - - test "when the layout is specified as a symbol and the method doesn't exist, raise an exception" do - assert_raises(NoMethodError) { WithSymbolAndNoMethod.new.process(:index) } - end - - test "when the layout is specified as a symbol and the method returns something besides a string/false/nil, raise an exception" do - assert_raises(ArgumentError) { WithSymbolReturningObj.new.process(:index) } - end - - test "when a child controller does not have a layout, use the parent controller layout" do - controller = WithStringChild.new - controller.process(:index) - assert_equal "With String Hello string!", controller.response_body - end - - test "when a child controller has specified a layout, use that layout and not the parent controller layout" do - controller = WithStringOverriddenChild.new - controller.process(:index) - assert_equal "With Override Hello string!", controller.response_body - end - - test "when a child controller has an implied layout, use that layout and not the parent controller layout" do - controller = WithStringImpliedChild.new - controller.process(:index) - assert_equal "With Implied Hello string!", controller.response_body - end - - test "when a child controller specifies layout nil, do not use the parent layout" do - controller = WithNilChild.new - controller.process(:index) - assert_equal "Hello string!", controller.response_body - end - - test "when a grandchild has no layout specified, the child has an implied layout, and the " \ - "parent has specified a layout, use the child controller layout" do - controller = WithChildOfImplied.new - controller.process(:index) - assert_equal "With Implied Hello string!", controller.response_body - end - - test "raises an exception when specifying layout true" do - assert_raises ArgumentError do - Object.class_eval do - class ::BadFailLayout < AbstractControllerTests::Layouts::Base - layout true - end - end - end - end - end - end -end \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/render_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/render_test.rb deleted file mode 100644 index 70fe746d5..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/render_test.rb +++ /dev/null @@ -1,102 +0,0 @@ -require 'abstract_unit' - -module AbstractController - module Testing - - class ControllerRenderer < AbstractController::Base - include AbstractController::Rendering - - def _prefix - "renderer" - end - - self.view_paths = [ActionView::FixtureResolver.new( - "template.erb" => "With Template", - "renderer/default.erb" => "With Default", - "renderer/string.erb" => "With String", - "renderer/symbol.erb" => "With Symbol", - "string/with_path.erb" => "With String With Path", - "some/file.erb" => "With File" - )] - - def template - render :template => "template" - end - - def file - render :file => "some/file" - end - - def inline - render :inline => "With <%= :Inline %>" - end - - def text - render :text => "With Text" - end - - def default - render - end - - def string - render "string" - end - - def string_with_path - render "string/with_path" - end - - def symbol - render :symbol - end - end - - class TestRenderer < ActiveSupport::TestCase - - def setup - @controller = ControllerRenderer.new - end - - def test_render_template - @controller.process(:template) - assert_equal "With Template", @controller.response_body - end - - def test_render_file - @controller.process(:file) - assert_equal "With File", @controller.response_body - end - - def test_render_inline - @controller.process(:inline) - assert_equal "With Inline", @controller.response_body - end - - def test_render_text - @controller.process(:text) - assert_equal "With Text", @controller.response_body - end - - def test_render_default - @controller.process(:default) - assert_equal "With Default", @controller.response_body - end - - def test_render_string - @controller.process(:string) - assert_equal "With String", @controller.response_body - end - - def test_render_symbol - @controller.process(:symbol) - assert_equal "With Symbol", @controller.response_body - end - - def test_render_string_with_path - @controller.process(:string_with_path) - assert_equal "With String With Path", @controller.response_body - end - end - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/translation_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/translation_test.rb deleted file mode 100644 index a8dd5c987..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/translation_test.rb +++ /dev/null @@ -1,26 +0,0 @@ -require 'abstract_unit' - -# class TranslatingController < ActionController::Base -# end - -class TranslationControllerTest < Test::Unit::TestCase - def setup - @controller = ActionController::Base.new - end - - def test_action_controller_base_responds_to_translate - assert_respond_to @controller, :translate - end - - def test_action_controller_base_responds_to_t - assert_respond_to @controller, :t - end - - def test_action_controller_base_responds_to_localize - assert_respond_to @controller, :localize - end - - def test_action_controller_base_responds_to_l - assert_respond_to @controller, :l - end -end \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/views/abstract_controller/testing/me3/formatted.html.erb b/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/views/abstract_controller/testing/me3/formatted.html.erb deleted file mode 100644 index 785bf6919..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/views/abstract_controller/testing/me3/formatted.html.erb +++ /dev/null @@ -1 +0,0 @@ -Hello from me3/formatted.html.erb \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/views/abstract_controller/testing/me3/index.erb b/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/views/abstract_controller/testing/me3/index.erb deleted file mode 100644 index f079ad820..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/views/abstract_controller/testing/me3/index.erb +++ /dev/null @@ -1 +0,0 @@ -Hello from me3/index.erb \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/views/abstract_controller/testing/me4/index.erb b/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/views/abstract_controller/testing/me4/index.erb deleted file mode 100644 index 89dce12bd..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/views/abstract_controller/testing/me4/index.erb +++ /dev/null @@ -1 +0,0 @@ -Hello from me4/index.erb \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/views/abstract_controller/testing/me5/index.erb b/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/views/abstract_controller/testing/me5/index.erb deleted file mode 100644 index 84d0b7417..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/views/abstract_controller/testing/me5/index.erb +++ /dev/null @@ -1 +0,0 @@ -Hello from me5/index.erb \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/views/action_with_ivars.erb b/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/views/action_with_ivars.erb deleted file mode 100644 index 8d8ae22fd..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/views/action_with_ivars.erb +++ /dev/null @@ -1 +0,0 @@ -<%= @my_ivar %> from index_with_ivars.erb \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/views/helper_test.erb b/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/views/helper_test.erb deleted file mode 100644 index 8ae45cc19..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/views/helper_test.erb +++ /dev/null @@ -1 +0,0 @@ -Hello <%= helpery_test %> : <%= included_method %> \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/views/index.erb b/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/views/index.erb deleted file mode 100644 index cc1a8b8c8..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/views/index.erb +++ /dev/null @@ -1 +0,0 @@ -Hello from index.erb \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/views/layouts/abstract_controller/testing/me4.erb b/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/views/layouts/abstract_controller/testing/me4.erb deleted file mode 100644 index 172dd5656..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/views/layouts/abstract_controller/testing/me4.erb +++ /dev/null @@ -1 +0,0 @@ -Me4 Enter : <%= yield %> : Exit \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/views/layouts/application.erb b/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/views/layouts/application.erb deleted file mode 100644 index 27317140a..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/views/layouts/application.erb +++ /dev/null @@ -1 +0,0 @@ -Application Enter : <%= yield %> : Exit \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/views/naked_render.erb b/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/views/naked_render.erb deleted file mode 100644 index 1b3d03878..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract/views/naked_render.erb +++ /dev/null @@ -1 +0,0 @@ -Hello from naked_render.erb \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract_unit.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract_unit.rb deleted file mode 100644 index 7757eedc3..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/abstract_unit.rb +++ /dev/null @@ -1,329 +0,0 @@ -require File.expand_path('../../../load_paths', __FILE__) - -lib = File.expand_path("#{File.dirname(__FILE__)}/../lib") -$:.unshift(lib) unless $:.include?('lib') || $:.include?(lib) - -activemodel_path = File.expand_path('../../../activemodel/lib', __FILE__) -$:.unshift(activemodel_path) if File.directory?(activemodel_path) && !$:.include?(activemodel_path) - -$:.unshift(File.dirname(__FILE__) + '/lib') -$:.unshift(File.dirname(__FILE__) + '/fixtures/helpers') -$:.unshift(File.dirname(__FILE__) + '/fixtures/alternate_helpers') - -ENV['TMPDIR'] = File.join(File.dirname(__FILE__), 'tmp') - -require 'active_support/core_ext/kernel/reporting' - -require 'active_support/core_ext/string/encoding' -if "ruby".encoding_aware? - # These are the normal settings that will be set up by Railties - # TODO: Have these tests support other combinations of these values - silence_warnings do - Encoding.default_internal = "UTF-8" - Encoding.default_external = "UTF-8" - end -end - -require 'test/unit' -require 'abstract_controller' -require 'action_controller' -require 'action_view' -require 'action_view/testing/resolvers' -require 'action_dispatch' -require 'active_support/dependencies' -require 'active_model' -require 'active_record' -require 'action_controller/caching' -require 'action_controller/caching/sweeping' - -begin - require 'ruby-debug' - Debugger.settings[:autoeval] = true - Debugger.start -rescue LoadError - # Debugging disabled. `gem install ruby-debug` to enable. -end - -require 'pp' # require 'pp' early to prevent hidden_methods from not picking up the pretty-print methods until too late - -module Rails -end - -# Monkey patch the old routes initialization to be silenced. -class ActionDispatch::Routing::DeprecatedMapper - def initialize_with_silencer(*args) - ActiveSupport::Deprecation.silence { initialize_without_silencer(*args) } - end - alias_method_chain :initialize, :silencer -end - -ActiveSupport::Dependencies.hook! - -# Show backtraces for deprecated behavior for quicker cleanup. -ActiveSupport::Deprecation.debug = true - -# Register danish language for testing -I18n.backend.store_translations 'da', {} -I18n.backend.store_translations 'pt-BR', {} -ORIGINAL_LOCALES = I18n.available_locales.map {|locale| locale.to_s }.sort - -FIXTURE_LOAD_PATH = File.join(File.dirname(__FILE__), 'fixtures') -FIXTURES = Pathname.new(FIXTURE_LOAD_PATH) - -module RackTestUtils - def body_to_string(body) - if body.respond_to?(:each) - str = "" - body.each {|s| str << s } - str - else - body - end - end - extend self -end - -module RenderERBUtils - def render_erb(string) - template = ActionView::Template.new( - string.strip, - "test template", - ActionView::Template::Handlers::ERB, - {}) - - template.render(self, {}).strip - end -end - -module SetupOnce - extend ActiveSupport::Concern - - included do - cattr_accessor :setup_once_block - self.setup_once_block = nil - - setup :run_setup_once - end - - module ClassMethods - def setup_once(&block) - self.setup_once_block = block - end - end - - private - def run_setup_once - if self.setup_once_block - self.setup_once_block.call - self.setup_once_block = nil - end - end -end - -SharedTestRoutes = ActionDispatch::Routing::RouteSet.new - -module ActiveSupport - class TestCase - include SetupOnce - # Hold off drawing routes until all the possible controller classes - # have been loaded. - setup_once do - SharedTestRoutes.draw do |map| - # FIXME: match ':controller(/:action(/:id))' - map.connect ':controller/:action/:id' - end - - ActionController::IntegrationTest.app.routes.draw do |map| - # FIXME: match ':controller(/:action(/:id))' - map.connect ':controller/:action/:id' - end - end - end -end - -class RoutedRackApp - attr_reader :routes - - def initialize(routes, &blk) - @routes = routes - @stack = ActionDispatch::MiddlewareStack.new(&blk).build(@routes) - end - - def call(env) - @stack.call(env) - end -end - -class BasicController - attr_accessor :request - - def config - @config ||= ActiveSupport::InheritableOptions.new(ActionController::Base.config).tap do |config| - # VIEW TODO: View tests should not require a controller - public_dir = File.expand_path("../fixtures/public", __FILE__) - config.assets_dir = public_dir - config.javascripts_dir = "#{public_dir}/javascripts" - config.stylesheets_dir = "#{public_dir}/stylesheets" - config - end - end -end - -class ActionDispatch::IntegrationTest < ActiveSupport::TestCase - setup do - @routes = SharedTestRoutes - end -end - -class ActionController::IntegrationTest < ActiveSupport::TestCase - def self.build_app(routes = nil) - RoutedRackApp.new(routes || ActionDispatch::Routing::RouteSet.new) do |middleware| - middleware.use "ActionDispatch::ShowExceptions" - middleware.use "ActionDispatch::Callbacks" - middleware.use "ActionDispatch::ParamsParser" - middleware.use "ActionDispatch::Cookies" - middleware.use "ActionDispatch::Flash" - middleware.use "ActionDispatch::Head" - yield(middleware) if block_given? - end - end - - self.app = build_app - - # Stub Rails dispatcher so it does not get controller references and - # simply return the controller#action as Rack::Body. - class StubDispatcher < ::ActionDispatch::Routing::RouteSet::Dispatcher - protected - def controller_reference(controller_param) - controller_param - end - - def dispatch(controller, action, env) - [200, {'Content-Type' => 'text/html'}, ["#{controller}##{action}"]] - end - end - - def self.stub_controllers - old_dispatcher = ActionDispatch::Routing::RouteSet::Dispatcher - ActionDispatch::Routing::RouteSet.module_eval { remove_const :Dispatcher } - ActionDispatch::Routing::RouteSet.module_eval { const_set :Dispatcher, StubDispatcher } - yield ActionDispatch::Routing::RouteSet.new - ensure - ActionDispatch::Routing::RouteSet.module_eval { remove_const :Dispatcher } - ActionDispatch::Routing::RouteSet.module_eval { const_set :Dispatcher, old_dispatcher } - end - - def with_routing(&block) - temporary_routes = ActionDispatch::Routing::RouteSet.new - old_app, self.class.app = self.class.app, self.class.build_app(temporary_routes) - old_routes = SharedTestRoutes - silence_warnings { Object.const_set(:SharedTestRoutes, temporary_routes) } - - yield temporary_routes - ensure - self.class.app = old_app - silence_warnings { Object.const_set(:SharedTestRoutes, old_routes) } - end - - def with_autoload_path(path) - path = File.join(File.dirname(__FILE__), "fixtures", path) - if ActiveSupport::Dependencies.autoload_paths.include?(path) - yield - else - begin - ActiveSupport::Dependencies.autoload_paths << path - yield - ensure - ActiveSupport::Dependencies.autoload_paths.reject! {|p| p == path} - ActiveSupport::Dependencies.clear - end - end - end -end - -# Temporary base class -class Rack::TestCase < ActionController::IntegrationTest - def self.testing(klass = nil) - if klass - @testing = "/#{klass.name.underscore}".sub!(/_controller$/, '') - else - @testing - end - end - - def get(thing, *args) - if thing.is_a?(Symbol) - super("#{self.class.testing}/#{thing}", *args) - else - super - end - end - - def assert_body(body) - assert_equal body, Array.wrap(response.body).join - end - - def assert_status(code) - assert_equal code, response.status - end - - def assert_response(body, status = 200, headers = {}) - assert_body body - assert_status status - headers.each do |header, value| - assert_header header, value - end - end - - def assert_content_type(type) - assert_equal type, response.headers["Content-Type"] - end - - def assert_header(name, value) - assert_equal value, response.headers[name] - end -end - -class ActionController::Base - def self.test_routes(&block) - routes = ActionDispatch::Routing::RouteSet.new - routes.draw(&block) - include routes.url_helpers - end -end - -class ::ApplicationController < ActionController::Base -end - -module ActionView - class TestCase - # Must repeat the setup because AV::TestCase is a duplication - # of AC::TestCase - setup do - @routes = SharedTestRoutes - end - end -end - -module ActionController - class Base - include ActionController::Testing - end - - Base.view_paths = FIXTURE_LOAD_PATH - - class TestCase - include ActionDispatch::TestProcess - - setup do - @routes = SharedTestRoutes - end - end -end - -# This stub emulates the Railtie including the URL helpers from a Rails application -module ActionController - class Base - include SharedTestRoutes.url_helpers - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/active_record_unit.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/active_record_unit.rb deleted file mode 100644 index 19efc5a09..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/active_record_unit.rb +++ /dev/null @@ -1,99 +0,0 @@ -require 'abstract_unit' - -# Define the essentials -class ActiveRecordTestConnector - cattr_accessor :able_to_connect - cattr_accessor :connected - - # Set our defaults - self.connected = false - self.able_to_connect = true -end - -# Try to grab AR -unless defined?(ActiveRecord) && defined?(Fixtures) - begin - PATH_TO_AR = "#{File.dirname(__FILE__)}/../../activerecord/lib" - raise LoadError, "#{PATH_TO_AR} doesn't exist" unless File.directory?(PATH_TO_AR) - $LOAD_PATH.unshift PATH_TO_AR - require 'active_record' - rescue LoadError => e - $stderr.print "Failed to load Active Record. Skipping Active Record assertion tests: #{e}" - ActiveRecordTestConnector.able_to_connect = false - end -end -$stderr.flush - - -# Define the rest of the connector -class ActiveRecordTestConnector - class << self - def setup - unless self.connected || !self.able_to_connect - setup_connection - load_schema - require_fixture_models - self.connected = true - end - rescue Exception => e # errors from ActiveRecord setup - $stderr.puts "\nSkipping ActiveRecord assertion tests: #{e}" - #$stderr.puts " #{e.backtrace.join("\n ")}\n" - self.able_to_connect = false - end - - private - def setup_connection - if Object.const_defined?(:ActiveRecord) - defaults = { :database => ':memory:' } - begin - adapter = defined?(JRUBY_VERSION) ? 'jdbcsqlite3' : 'sqlite3' - options = defaults.merge :adapter => adapter, :timeout => 500 - ActiveRecord::Base.establish_connection(options) - ActiveRecord::Base.configurations = { 'sqlite3_ar_integration' => options } - ActiveRecord::Base.connection - rescue Exception # errors from establishing a connection - $stderr.puts 'SQLite 3 unavailable; trying SQLite 2.' - options = defaults.merge :adapter => 'sqlite' - ActiveRecord::Base.establish_connection(options) - ActiveRecord::Base.configurations = { 'sqlite2_ar_integration' => options } - ActiveRecord::Base.connection - end - - Object.send(:const_set, :QUOTED_TYPE, ActiveRecord::Base.connection.quote_column_name('type')) unless Object.const_defined?(:QUOTED_TYPE) - else - raise "Can't setup connection since ActiveRecord isn't loaded." - end - end - - # Load actionpack sqlite tables - def load_schema - File.read(File.dirname(__FILE__) + "/fixtures/db_definitions/sqlite.sql").split(';').each do |sql| - ActiveRecord::Base.connection.execute(sql) unless sql.blank? - end - end - - def require_fixture_models - Dir.glob(File.dirname(__FILE__) + "/fixtures/*.rb").each {|f| require f} - end - end -end - -class ActiveRecordTestCase < ActionController::TestCase - include ActiveRecord::TestFixtures - - # Set our fixture path - if ActiveRecordTestConnector.able_to_connect - self.fixture_path = [FIXTURE_LOAD_PATH] - self.use_transactional_fixtures = false - end - - def self.fixtures(*args) - super if ActiveRecordTestConnector.connected - end - - def run(*args) - super if ActiveRecordTestConnector.connected - end -end - -ActiveRecordTestConnector.setup diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/activerecord/active_record_store_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/activerecord/active_record_store_test.rb deleted file mode 100644 index 99459752b..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/activerecord/active_record_store_test.rb +++ /dev/null @@ -1,220 +0,0 @@ -require 'active_record_unit' - -class ActiveRecordStoreTest < ActionController::IntegrationTest - class TestController < ActionController::Base - def no_session_access - head :ok - end - - def set_session_value - raise "missing session!" unless session - session[:foo] = params[:foo] || "bar" - head :ok - end - - def get_session_value - render :text => "foo: #{session[:foo].inspect}" - end - - def get_session_id - render :text => "#{request.session_options[:id]}" - end - - def call_reset_session - session[:foo] - reset_session - session[:foo] = "baz" - head :ok - end - - def rescue_action(e) raise end - end - - def setup - ActiveRecord::SessionStore.session_class.create_table! - end - - def teardown - ActiveRecord::SessionStore.session_class.drop_table! - end - - %w{ session sql_bypass }.each do |class_name| - define_method("test_setting_and_getting_session_value_with_#{class_name}_store") do - with_store class_name do - with_test_route_set do - get '/set_session_value' - assert_response :success - assert cookies['_session_id'] - - get '/get_session_value' - assert_response :success - assert_equal 'foo: "bar"', response.body - - get '/set_session_value', :foo => "baz" - assert_response :success - assert cookies['_session_id'] - - get '/get_session_value' - assert_response :success - assert_equal 'foo: "baz"', response.body - - get '/call_reset_session' - assert_response :success - assert_not_equal [], headers['Set-Cookie'] - end - end - end - end - - def test_getting_nil_session_value - with_test_route_set do - get '/get_session_value' - assert_response :success - assert_equal 'foo: nil', response.body - end - end - - def test_setting_session_value_after_session_reset - with_test_route_set do - get '/set_session_value' - assert_response :success - assert cookies['_session_id'] - session_id = cookies['_session_id'] - - get '/call_reset_session' - assert_response :success - assert_not_equal [], headers['Set-Cookie'] - - get '/get_session_value' - assert_response :success - assert_equal 'foo: "baz"', response.body - - get '/get_session_id' - assert_response :success - assert_not_equal session_id, response.body - end - end - - def test_getting_session_value_after_session_reset - with_test_route_set do - get '/set_session_value' - assert_response :success - assert cookies['_session_id'] - session_cookie = cookies.send(:hash_for)['_session_id'] - - get '/call_reset_session' - assert_response :success - assert_not_equal [], headers['Set-Cookie'] - - cookies << session_cookie # replace our new session_id with our old, pre-reset session_id - - get '/get_session_value' - assert_response :success - assert_equal 'foo: nil', response.body, "data for this session should have been obliterated from the database" - end - end - - def test_getting_from_nonexistent_session - with_test_route_set do - get '/get_session_value' - assert_response :success - assert_equal 'foo: nil', response.body - assert_nil cookies['_session_id'], "should only create session on write, not read" - end - end - - def test_getting_session_id - with_test_route_set do - get '/set_session_value' - assert_response :success - assert cookies['_session_id'] - session_id = cookies['_session_id'] - - get '/get_session_id' - assert_response :success - assert_equal session_id, response.body, "should be able to read session id without accessing the session hash" - end - end - - def test_doesnt_write_session_cookie_if_session_id_is_already_exists - with_test_route_set do - get '/set_session_value' - assert_response :success - assert cookies['_session_id'] - - get '/get_session_value' - assert_response :success - assert_equal nil, headers['Set-Cookie'], "should not resend the cookie again if session_id cookie is already exists" - end - end - - def test_prevents_session_fixation - with_test_route_set do - get '/set_session_value' - assert_response :success - assert cookies['_session_id'] - - get '/get_session_value' - assert_response :success - assert_equal 'foo: "bar"', response.body - session_id = cookies['_session_id'] - assert session_id - - reset! - - get '/get_session_value', :_session_id => session_id - assert_response :success - assert_equal 'foo: nil', response.body - assert_not_equal session_id, cookies['_session_id'] - end - end - - def test_allows_session_fixation - with_test_route_set(:cookie_only => false) do - get '/set_session_value' - assert_response :success - assert cookies['_session_id'] - - get '/get_session_value' - assert_response :success - assert_equal 'foo: "bar"', response.body - session_id = cookies['_session_id'] - assert session_id - - reset! - - get '/set_session_value', :_session_id => session_id, :foo => "baz" - assert_response :success - assert_equal session_id, cookies['_session_id'] - - get '/get_session_value', :_session_id => session_id - assert_response :success - assert_equal 'foo: "baz"', response.body - assert_equal session_id, cookies['_session_id'] - end - end - - private - - def with_test_route_set(options = {}) - with_routing do |set| - set.draw do |map| - match ':action', :to => 'active_record_store_test/test' - end - - @app = self.class.build_app(set) do |middleware| - middleware.use ActiveRecord::SessionStore, options.reverse_merge(:key => '_session_id') - middleware.delete "ActionDispatch::ShowExceptions" - end - - yield - end - end - - def with_store(class_name) - session_class, ActiveRecord::SessionStore.session_class = - ActiveRecord::SessionStore.session_class, "ActiveRecord::SessionStore::#{class_name.camelize}".constantize - yield - ActiveRecord::SessionStore.session_class = session_class - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/activerecord/controller_runtime_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/activerecord/controller_runtime_test.rb deleted file mode 100644 index b217635b8..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/activerecord/controller_runtime_test.rb +++ /dev/null @@ -1,42 +0,0 @@ -require 'active_record_unit' -require 'active_record/railties/controller_runtime' -require 'fixtures/project' -require 'active_support/log_subscriber/test_helper' -require 'action_controller/log_subscriber' - -ActionController::Base.send :include, ActiveRecord::Railties::ControllerRuntime - -class ControllerRuntimeLogSubscriberTest < ActionController::TestCase - class LogSubscriberController < ActionController::Base - def show - render :inline => "<%= Project.all %>" - end - end - - include ActiveSupport::LogSubscriber::TestHelper - tests LogSubscriberController - - def setup - super - @old_logger = ActionController::Base.logger - ActionController::LogSubscriber.attach_to :action_controller - end - - def teardown - super - ActiveSupport::LogSubscriber.log_subscribers.clear - ActionController::Base.logger = @old_logger - end - - def set_logger(logger) - ActionController::Base.logger = logger - end - - def test_log_with_active_record - get :show - wait - - assert_equal 2, @logger.logged(:info).size - assert_match /\(Views: [\d\.]+ms | ActiveRecord: [\d\.]+ms\)/, @logger.logged(:info)[1] - end -end \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/activerecord/polymorphic_routes_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/activerecord/polymorphic_routes_test.rb deleted file mode 100644 index 7fc843c9c..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/activerecord/polymorphic_routes_test.rb +++ /dev/null @@ -1,450 +0,0 @@ -require 'active_record_unit' -require 'fixtures/project' - -class Task < ActiveRecord::Base - set_table_name 'projects' -end - -class Step < ActiveRecord::Base - set_table_name 'projects' -end - -class Bid < ActiveRecord::Base - set_table_name 'projects' -end - -class Tax < ActiveRecord::Base - set_table_name 'projects' -end - -class Fax < ActiveRecord::Base - set_table_name 'projects' -end - -class Series < ActiveRecord::Base - set_table_name 'projects' -end - -class PolymorphicRoutesTest < ActionController::TestCase - include SharedTestRoutes.url_helpers - self.default_url_options[:host] = 'example.com' - - def setup - @project = Project.new - @task = Task.new - @step = Step.new - @bid = Bid.new - @tax = Tax.new - @fax = Fax.new - @series = Series.new - end - - def test_with_record - with_test_routes do - @project.save - assert_equal "http://example.com/projects/#{@project.id}", polymorphic_url(@project) - end - end - - def test_with_class - with_test_routes do - assert_equal "http://example.com/projects", polymorphic_url(@project.class) - end - end - - def test_with_new_record - with_test_routes do - assert_equal "http://example.com/projects", polymorphic_url(@project) - end - end - - def test_with_destroyed_record - with_test_routes do - @project.destroy - assert_equal "http://example.com/projects", polymorphic_url(@project) - end - end - - def test_with_record_and_action - with_test_routes do - assert_equal "http://example.com/projects/new", polymorphic_url(@project, :action => 'new') - end - end - - def test_url_helper_prefixed_with_new - with_test_routes do - assert_equal "http://example.com/projects/new", new_polymorphic_url(@project) - end - end - - def test_url_helper_prefixed_with_edit - with_test_routes do - @project.save - assert_equal "http://example.com/projects/#{@project.id}/edit", edit_polymorphic_url(@project) - end - end - - def test_url_helper_prefixed_with_edit_with_url_options - with_test_routes do - @project.save - assert_equal "http://example.com/projects/#{@project.id}/edit?param1=10", edit_polymorphic_url(@project, :param1 => '10') - end - end - - def test_url_helper_with_url_options - with_test_routes do - @project.save - assert_equal "http://example.com/projects/#{@project.id}?param1=10", polymorphic_url(@project, :param1 => '10') - end - end - - def test_format_option - with_test_routes do - @project.save - assert_equal "http://example.com/projects/#{@project.id}.pdf", polymorphic_url(@project, :format => :pdf) - end - end - - def test_format_option_with_url_options - with_test_routes do - @project.save - assert_equal "http://example.com/projects/#{@project.id}.pdf?param1=10", polymorphic_url(@project, :format => :pdf, :param1 => '10') - end - end - - def test_id_and_format_option - with_test_routes do - @project.save - assert_equal "http://example.com/projects/#{@project.id}.pdf", polymorphic_url(:id => @project, :format => :pdf) - end - end - - def test_with_nested - with_test_routes do - @project.save - @task.save - assert_equal "http://example.com/projects/#{@project.id}/tasks/#{@task.id}", polymorphic_url([@project, @task]) - end - end - - def test_with_nested_unsaved - with_test_routes do - @project.save - assert_equal "http://example.com/projects/#{@project.id}/tasks", polymorphic_url([@project, @task]) - end - end - - def test_with_nested_destroyed - with_test_routes do - @project.save - @task.destroy - assert_equal "http://example.com/projects/#{@project.id}/tasks", polymorphic_url([@project, @task]) - end - end - - def test_with_nested_class - with_test_routes do - @project.save - assert_equal "http://example.com/projects/#{@project.id}/tasks", polymorphic_url([@project, @task.class]) - end - end - - def test_class_with_array_and_namespace - with_admin_test_routes do - assert_equal "http://example.com/admin/projects", polymorphic_url([:admin, @project.class]) - end - end - - def test_new_with_array_and_namespace - with_admin_test_routes do - assert_equal "http://example.com/admin/projects/new", polymorphic_url([:admin, @project], :action => 'new') - end - end - - def test_unsaved_with_array_and_namespace - with_admin_test_routes do - assert_equal "http://example.com/admin/projects", polymorphic_url([:admin, @project]) - end - end - - def test_nested_unsaved_with_array_and_namespace - with_admin_test_routes do - @project.save - assert_equal "http://example.com/admin/projects/#{@project.id}/tasks", polymorphic_url([:admin, @project, @task]) - end - end - - def test_nested_with_array_and_namespace - with_admin_test_routes do - @project.save - @task.save - assert_equal "http://example.com/admin/projects/#{@project.id}/tasks/#{@task.id}", polymorphic_url([:admin, @project, @task]) - end - end - - def test_ordering_of_nesting_and_namespace - with_admin_and_site_test_routes do - @project.save - @task.save - @step.save - assert_equal "http://example.com/admin/projects/#{@project.id}/site/tasks/#{@task.id}/steps/#{@step.id}", polymorphic_url([:admin, @project, :site, @task, @step]) - end - end - - def test_nesting_with_array_ending_in_singleton_resource - with_test_routes do - @project.save - assert_equal "http://example.com/projects/#{@project.id}/bid", polymorphic_url([@project, :bid]) - end - end - - def test_nesting_with_array_containing_singleton_resource - with_test_routes do - @project.save - @task.save - assert_equal "http://example.com/projects/#{@project.id}/bid/tasks/#{@task.id}", polymorphic_url([@project, :bid, @task]) - end - end - - def test_nesting_with_array_containing_singleton_resource_and_format - with_test_routes do - @project.save - @task.save - assert_equal "http://example.com/projects/#{@project.id}/bid/tasks/#{@task.id}.pdf", polymorphic_url([@project, :bid, @task], :format => :pdf) - end - end - - def test_nesting_with_array_containing_namespace_and_singleton_resource - with_admin_test_routes do - @project.save - @task.save - assert_equal "http://example.com/admin/projects/#{@project.id}/bid/tasks/#{@task.id}", polymorphic_url([:admin, @project, :bid, @task]) - end - end - - def test_nesting_with_array_containing_nil - with_test_routes do - @project.save - assert_equal "http://example.com/projects/#{@project.id}/bid", polymorphic_url([@project, nil, :bid]) - end - end - - def test_with_array_containing_single_object - with_test_routes do - @project.save - assert_equal "http://example.com/projects/#{@project.id}", polymorphic_url([nil, @project]) - end - end - - def test_with_array_containing_single_name - with_test_routes do - @project.save - assert_equal "http://example.com/projects", polymorphic_url([:projects]) - end - end - - def test_with_array_containing_symbols - with_test_routes do - assert_equal "http://example.com/series/new", polymorphic_url([:new, :series]) - end - end - - def test_with_hash - with_test_routes do - @project.save - assert_equal "http://example.com/projects/#{@project.id}", polymorphic_url(:id => @project) - end - end - - def test_polymorphic_path_accepts_options - with_test_routes do - assert_equal "/projects/new", polymorphic_path(@project, :action => 'new') - end - end - - def test_polymorphic_path_does_not_modify_arguments - with_admin_test_routes do - @project.save - @task.save - - options = {} - object_array = [:admin, @project, @task] - original_args = [object_array.dup, options.dup] - - assert_no_difference('object_array.size') { polymorphic_path(object_array, options) } - assert_equal original_args, [object_array, options] - end - end - - # Tests for names where .plural.singular doesn't round-trip - def test_with_irregular_plural_record - with_test_routes do - @tax.save - assert_equal "http://example.com/taxes/#{@tax.id}", polymorphic_url(@tax) - end - end - - def test_with_irregular_plural_class - with_test_routes do - assert_equal "http://example.com/taxes", polymorphic_url(@tax.class) - end - end - - def test_with_irregular_plural_new_record - with_test_routes do - assert_equal "http://example.com/taxes", polymorphic_url(@tax) - end - end - - def test_with_irregular_plural_destroyed_record - with_test_routes do - @tax.destroy - assert_equal "http://example.com/taxes", polymorphic_url(@tax) - end - end - - def test_with_irregular_plural_record_and_action - with_test_routes do - assert_equal "http://example.com/taxes/new", polymorphic_url(@tax, :action => 'new') - end - end - - def test_irregular_plural_url_helper_prefixed_with_new - with_test_routes do - assert_equal "http://example.com/taxes/new", new_polymorphic_url(@tax) - end - end - - def test_irregular_plural_url_helper_prefixed_with_edit - with_test_routes do - @tax.save - assert_equal "http://example.com/taxes/#{@tax.id}/edit", edit_polymorphic_url(@tax) - end - end - - def test_with_nested_irregular_plurals - with_test_routes do - @tax.save - @fax.save - assert_equal "http://example.com/taxes/#{@tax.id}/faxes/#{@fax.id}", polymorphic_url([@tax, @fax]) - end - end - - def test_with_nested_unsaved_irregular_plurals - with_test_routes do - @tax.save - assert_equal "http://example.com/taxes/#{@tax.id}/faxes", polymorphic_url([@tax, @fax]) - end - end - - def test_new_with_irregular_plural_array_and_namespace - with_admin_test_routes do - assert_equal "http://example.com/admin/taxes/new", polymorphic_url([:admin, @tax], :action => 'new') - end - end - - def test_class_with_irregular_plural_array_and_namespace - with_admin_test_routes do - assert_equal "http://example.com/admin/taxes", polymorphic_url([:admin, @tax.class]) - end - end - - def test_unsaved_with_irregular_plural_array_and_namespace - with_admin_test_routes do - assert_equal "http://example.com/admin/taxes", polymorphic_url([:admin, @tax]) - end - end - - def test_nesting_with_irregular_plurals_and_array_ending_in_singleton_resource - with_test_routes do - @tax.save - assert_equal "http://example.com/taxes/#{@tax.id}/bid", polymorphic_url([@tax, :bid]) - end - end - - def test_with_array_containing_single_irregular_plural_object - with_test_routes do - @tax.save - assert_equal "http://example.com/taxes/#{@tax.id}", polymorphic_url([nil, @tax]) - end - end - - def test_with_array_containing_single_name_irregular_plural - with_test_routes do - @tax.save - assert_equal "http://example.com/taxes", polymorphic_url([:taxes]) - end - end - - # Tests for uncountable names - def test_uncountable_resource - with_test_routes do - @series.save - assert_equal "http://example.com/series/#{@series.id}", polymorphic_url(@series) - assert_equal "http://example.com/series", polymorphic_url(Series.new) - end - end - - def with_test_routes(options = {}) - with_routing do |set| - set.draw do |map| - map.resources :projects do |projects| - projects.resources :tasks - projects.resource :bid do |bid| - bid.resources :tasks - end - end - map.resources :taxes do |taxes| - taxes.resources :faxes - taxes.resource :bid - end - map.resources :series - end - - self.class.send(:include, @routes.url_helpers) - yield - end - end - - def with_admin_test_routes(options = {}) - with_routing do |set| - set.draw do - namespace :admin do - resources :projects do - resources :tasks - resource :bid do - resources :tasks - end - end - resources :taxes do - resources :faxes - end - resources :series - end - end - - self.class.send(:include, @routes.url_helpers) - yield - end - end - - def with_admin_and_site_test_routes(options = {}) - with_routing do |set| - set.draw do - namespace :admin do - resources :projects do - namespace :site do - resources :tasks do - resources :steps - end - end - end - end - end - - self.class.send(:include, @routes.url_helpers) - yield - end - end - -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/activerecord/render_partial_with_record_identification_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/activerecord/render_partial_with_record_identification_test.rb deleted file mode 100644 index adcb47fa3..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/activerecord/render_partial_with_record_identification_test.rb +++ /dev/null @@ -1,190 +0,0 @@ -require 'active_record_unit' - -class RenderPartialWithRecordIdentificationController < ActionController::Base - def render_with_has_many_and_belongs_to_association - @developer = Developer.find(1) - render :partial => @developer.projects - end - - def render_with_has_many_association - @topic = Topic.find(1) - render :partial => @topic.replies - end - - def render_with_named_scope - render :partial => Reply.base - end - - def render_with_has_many_through_association - @developer = Developer.find(:first) - render :partial => @developer.topics - end - - def render_with_has_one_association - @company = Company.find(1) - render :partial => @company.mascot - end - - def render_with_belongs_to_association - @reply = Reply.find(1) - render :partial => @reply.topic - end - - def render_with_record - @developer = Developer.find(:first) - render :partial => @developer - end - - def render_with_record_collection - @developers = Developer.find(:all) - render :partial => @developers - end - - def render_with_record_collection_and_spacer_template - @developer = Developer.find(1) - render :partial => @developer.projects, :spacer_template => 'test/partial_only' - end -end - -class RenderPartialWithRecordIdentificationTest < ActiveRecordTestCase - tests RenderPartialWithRecordIdentificationController - fixtures :developers, :projects, :developers_projects, :topics, :replies, :companies, :mascots - - def test_rendering_partial_with_has_many_and_belongs_to_association - get :render_with_has_many_and_belongs_to_association - assert_template 'projects/_project' - assert_equal assigns(:developer).projects.map(&:name).join, @response.body - end - - def test_rendering_partial_with_has_many_association - get :render_with_has_many_association - assert_template 'replies/_reply' - assert_equal 'Birdman is better!', @response.body - end - - def test_rendering_partial_with_named_scope - get :render_with_named_scope - assert_template 'replies/_reply' - assert_equal 'Birdman is better!Nuh uh!', @response.body - end - - def test_render_with_record - get :render_with_record - assert_template 'developers/_developer' - assert_equal 'David', @response.body - end - - def test_render_with_record_collection - get :render_with_record_collection - assert_template 'developers/_developer' - assert_equal 'DavidJamisfixture_3fixture_4fixture_5fixture_6fixture_7fixture_8fixture_9fixture_10Jamis', @response.body - end - - def test_render_with_record_collection_and_spacer_template - get :render_with_record_collection_and_spacer_template - assert_equal assigns(:developer).projects.map(&:name).join('only partial'), @response.body - end - - def test_rendering_partial_with_has_one_association - mascot = Company.find(1).mascot - get :render_with_has_one_association - assert_template 'mascots/_mascot' - assert_equal mascot.name, @response.body - end -end - -class RenderPartialWithRecordIdentificationController < ActionController::Base - def render_with_has_many_and_belongs_to_association - @developer = Developer.find(1) - render :partial => @developer.projects - end - - def render_with_has_many_association - @topic = Topic.find(1) - render :partial => @topic.replies - end - - def render_with_has_many_through_association - @developer = Developer.find(:first) - render :partial => @developer.topics - end - - def render_with_belongs_to_association - @reply = Reply.find(1) - render :partial => @reply.topic - end - - def render_with_record - @developer = Developer.find(:first) - render :partial => @developer - end - - def render_with_record_collection - @developers = Developer.find(:all) - render :partial => @developers - end -end - -class Game < Struct.new(:name, :id) - extend ActiveModel::Naming - include ActiveModel::Conversion - def to_param - id.to_s - end -end - -module Fun - class NestedController < ActionController::Base - def render_with_record_in_nested_controller - render :partial => Game.new("Pong") - end - - def render_with_record_collection_in_nested_controller - render :partial => [ Game.new("Pong"), Game.new("Tank") ] - end - end - - module Serious - class NestedDeeperController < ActionController::Base - def render_with_record_in_deeper_nested_controller - render :partial => Game.new("Chess") - end - - def render_with_record_collection_in_deeper_nested_controller - render :partial => [ Game.new("Chess"), Game.new("Sudoku"), Game.new("Solitaire") ] - end - end - end -end - -class RenderPartialWithRecordIdentificationAndNestedControllersTest < ActiveRecordTestCase - tests Fun::NestedController - - def test_render_with_record_in_nested_controller - get :render_with_record_in_nested_controller - assert_template 'fun/games/_game' - assert_equal 'Pong', @response.body - end - - def test_render_with_record_collection_in_nested_controller - get :render_with_record_collection_in_nested_controller - assert_template 'fun/games/_game' - assert_equal 'PongTank', @response.body - end -end - -class RenderPartialWithRecordIdentificationAndNestedDeeperControllersTest < ActiveRecordTestCase - tests Fun::Serious::NestedDeeperController - - def test_render_with_record_in_deeper_nested_controller - get :render_with_record_in_deeper_nested_controller - assert_template 'fun/serious/games/_game' - assert_equal 'Chess', @response.body - end - - def test_render_with_record_collection_in_deeper_nested_controller - get :render_with_record_collection_in_deeper_nested_controller - assert_template 'fun/serious/games/_game' - assert_equal 'ChessSudokuSolitaire', @response.body - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/action_pack_assertions_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/action_pack_assertions_test.rb deleted file mode 100644 index c5e518ce1..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/action_pack_assertions_test.rb +++ /dev/null @@ -1,574 +0,0 @@ -require 'abstract_unit' -require 'action_controller/vendor/html-scanner' -require 'controller/fake_controllers' - -# a controller class to facilitate the tests -class ActionPackAssertionsController < ActionController::Base - - # this does absolutely nothing - def nothing() head :ok end - - # a standard template - def hello_world() render :template => "test/hello_world"; end - - # a standard template - def hello_xml_world() render :template => "test/hello_xml_world"; end - - # a standard template rendering PDF - def hello_xml_world_pdf - self.content_type = "application/pdf" - render :template => "test/hello_xml_world" - end - - # a standard template rendering PDF - def hello_xml_world_pdf_header - response.headers["Content-Type"] = "application/pdf; charset=utf-8" - render :template => "test/hello_xml_world" - end - - # a standard partial - def partial() render :partial => 'test/partial'; end - - # a redirect to an internal location - def redirect_internal() redirect_to "/nothing"; end - - def redirect_to_action() redirect_to :action => "flash_me", :id => 1, :params => { "panda" => "fun" }; end - - def redirect_to_controller() redirect_to :controller => "elsewhere", :action => "flash_me"; end - - def redirect_to_controller_with_symbol() redirect_to :controller => :elsewhere, :action => :flash_me; end - - def redirect_to_path() redirect_to '/some/path' end - - def redirect_to_named_route() redirect_to route_one_url end - - # a redirect to an external location - def redirect_external() redirect_to "http://www.rubyonrails.org"; end - - # a 404 - def response404() head '404 AWOL' end - - # a 500 - def response500() head '500 Sorry' end - - # a fictional 599 - def response599() head '599 Whoah!' end - - # putting stuff in the flash - def flash_me - flash['hello'] = 'my name is inigo montoya...' - render :text => "Inconceivable!" - end - - # we have a flash, but nothing is in it - def flash_me_naked - flash.clear - render :text => "wow!" - end - - # assign some template instance variables - def assign_this - @howdy = "ho" - render :inline => "Mr. Henke" - end - - def render_based_on_parameters - render :text => "Mr. #{params[:name]}" - end - - def render_url - render :text => "
#{url_for(:action => 'flash_me', :only_path => true)}
" - end - - def render_text_with_custom_content_type - render :text => "Hello!", :content_type => Mime::RSS - end - - # puts something in the session - def session_stuffing - session['xmas'] = 'turkey' - render :text => "ho ho ho" - end - - # raises exception on get requests - def raise_on_get - raise "get" if request.get? - render :text => "request method: #{request.env['REQUEST_METHOD']}" - end - - # raises exception on post requests - def raise_on_post - raise "post" if request.post? - render :text => "request method: #{request.env['REQUEST_METHOD']}" - end - - def get_valid_record - @record = Class.new do - def valid? - true - end - - def errors - Class.new do - def full_messages; []; end - end.new - end - - end.new - - render :nothing => true - end - - - def get_invalid_record - @record = Class.new do - - def valid? - false - end - - def errors - Class.new do - def full_messages; ['...stuff...']; end - end.new - end - end.new - - render :nothing => true - end - - # 911 - def rescue_action(e) raise; end -end - -# Used to test that assert_response includes the exception message -# in the failure message when an action raises and assert_response -# is expecting something other than an error. -class AssertResponseWithUnexpectedErrorController < ActionController::Base - def index - raise 'FAIL' - end - - def show - render :text => "Boom", :status => 500 - end -end - -class UserController < ActionController::Base -end - -module Admin - class InnerModuleController < ActionController::Base - def index - render :nothing => true - end - - def redirect_to_index - redirect_to admin_inner_module_path - end - - def redirect_to_absolute_controller - redirect_to :controller => '/content' - end - - def redirect_to_fellow_controller - redirect_to :controller => 'user' - end - - def redirect_to_top_level_named_route - redirect_to top_level_url(:id => "foo") - end - end -end - -# require "action_dispatch/test_process" - -# a test case to exercise the new capabilities TestRequest & TestResponse -class ActionPackAssertionsControllerTest < ActionController::TestCase - # -- assertion-based testing ------------------------------------------------ - - def test_assert_tag_and_url_for - get :render_url - assert_tag :content => "/action_pack_assertions/flash_me" - end - - # test the get method, make sure the request really was a get - def test_get - assert_raise(RuntimeError) { get :raise_on_get } - get :raise_on_post - assert_equal @response.body, 'request method: GET' - end - - # test the get method, make sure the request really was a get - def test_post - assert_raise(RuntimeError) { post :raise_on_post } - post :raise_on_get - assert_equal @response.body, 'request method: POST' - end - -# the following test fails because the request_method is now cached on the request instance -# test the get/post switch within one test action -# def test_get_post_switch -# post :raise_on_get -# assert_equal @response.body, 'request method: POST' -# get :raise_on_post -# assert_equal @response.body, 'request method: GET' -# post :raise_on_get -# assert_equal @response.body, 'request method: POST' -# get :raise_on_post -# assert_equal @response.body, 'request method: GET' -# end - - # test the redirection to a named route - def test_assert_redirect_to_named_route - with_routing do |set| - set.draw do |map| - match 'route_one', :to => 'action_pack_assertions#nothing', :as => :route_one - match ':controller/:action' - end - set.install_helpers - - process :redirect_to_named_route - assert_redirected_to 'http://test.host/route_one' - assert_redirected_to route_one_url - end - end - - def test_assert_redirect_to_named_route_failure - with_routing do |set| - set.draw do |map| - match 'route_one', :to => 'action_pack_assertions#nothing', :as => :route_one - match 'route_two', :to => 'action_pack_assertions#nothing', :id => 'two', :as => :route_two - match ':controller/:action' - end - process :redirect_to_named_route - assert_raise(ActiveSupport::TestCase::Assertion) do - assert_redirected_to 'http://test.host/route_two' - end - assert_raise(ActiveSupport::TestCase::Assertion) do - assert_redirected_to :controller => 'action_pack_assertions', :action => 'nothing', :id => 'two' - end - assert_raise(ActiveSupport::TestCase::Assertion) do - assert_redirected_to route_two_url - end - end - end - - def test_assert_redirect_to_nested_named_route - @controller = Admin::InnerModuleController.new - - with_routing do |set| - set.draw do |map| - match 'admin/inner_module', :to => 'admin/inner_module#index', :as => :admin_inner_module - # match ':controller/:action' - map.connect ':controller/:action/:id' - end - process :redirect_to_index - # redirection is <{"action"=>"index", "controller"=>"admin/admin/inner_module"}> - assert_redirected_to admin_inner_module_path - end - end - - def test_assert_redirected_to_top_level_named_route_from_nested_controller - @controller = Admin::InnerModuleController.new - - with_routing do |set| - set.draw do |map| - match '/action_pack_assertions/:id', :to => 'action_pack_assertions#index', :as => :top_level - # match ':controller/:action' - map.connect ':controller/:action/:id' - end - process :redirect_to_top_level_named_route - # assert_redirected_to "http://test.host/action_pack_assertions/foo" would pass because of exact match early return - assert_redirected_to "/action_pack_assertions/foo" - end - end - - def test_assert_redirected_to_top_level_named_route_with_same_controller_name_in_both_namespaces - @controller = Admin::InnerModuleController.new - - with_routing do |set| - set.draw do |map| - # this controller exists in the admin namespace as well which is the only difference from previous test - match '/user/:id', :to => 'user#index', :as => :top_level - # match ':controller/:action' - map.connect ':controller/:action/:id' - end - process :redirect_to_top_level_named_route - # assert_redirected_to top_level_url('foo') would pass because of exact match early return - assert_redirected_to top_level_path('foo') - end - end - - # -- standard request/response object testing -------------------------------- - - # make sure that the template objects exist - def test_template_objects_alive - process :assign_this - assert !@controller.instance_variable_get(:"@hi") - assert @controller.instance_variable_get(:"@howdy") - end - - # make sure we don't have template objects when we shouldn't - def test_template_object_missing - process :nothing - assert_nil @controller.instance_variable_get(:@howdy) - end - - # check the empty flashing - def test_flash_me_naked - process :flash_me_naked - assert_deprecated do - assert !@response.has_flash? - assert !@response.has_flash_with_contents? - end - end - - # check if we have flash objects - def test_flash_haves - process :flash_me - assert_deprecated do - assert @response.has_flash? - assert @response.has_flash_with_contents? - assert @response.has_flash_object?('hello') - end - end - - # ensure we don't have flash objects - def test_flash_have_nots - process :nothing - assert_deprecated do - assert !@response.has_flash? - assert !@response.has_flash_with_contents? - assert_nil @response.flash['hello'] - end - end - - - # check if we were rendered by a file-based template? - def test_rendered_action - process :nothing - assert_template nil - - process :hello_world - assert_template 'hello_world' - end - - # check the redirection location - def test_redirection_location - process :redirect_internal - assert_equal 'http://test.host/nothing', @response.redirect_url - - process :redirect_external - assert_equal 'http://www.rubyonrails.org', @response.redirect_url - end - - def test_no_redirect_url - process :nothing - assert_nil @response.redirect_url - end - - # check server errors - def test_server_error_response_code - process :response500 - assert @response.server_error? - - process :response599 - assert @response.server_error? - - process :response404 - assert !@response.server_error? - end - - # check a 404 response code - def test_missing_response_code - process :response404 - assert @response.missing? - end - - # check client errors - def test_client_error_response_code - process :response404 - assert @response.client_error? - end - - # check to see if our redirection matches a pattern - def test_redirect_url_match - process :redirect_external - assert @response.redirect? - assert_deprecated do - assert @response.redirect_url_match?("rubyonrails") - assert @response.redirect_url_match?(/rubyonrails/) - assert !@response.redirect_url_match?("phpoffrails") - assert !@response.redirect_url_match?(/perloffrails/) - end - end - - # check for a redirection - def test_redirection - process :redirect_internal - assert @response.redirect? - - process :redirect_external - assert @response.redirect? - - process :nothing - assert !@response.redirect? - end - - # check a successful response code - def test_successful_response_code - process :nothing - assert @response.success? - end - - # a basic check to make sure we have a TestResponse object - def test_has_response - process :nothing - assert_kind_of ActionController::TestResponse, @response - end - - def test_render_based_on_parameters - process :render_based_on_parameters, "name" => "David" - assert_equal "Mr. David", @response.body - end - - def test_assert_redirection_fails_with_incorrect_controller - process :redirect_to_controller - assert_raise(ActiveSupport::TestCase::Assertion) do - assert_redirected_to :controller => "action_pack_assertions", :action => "flash_me" - end - end - - def test_assert_redirection_with_extra_controller_option - get :redirect_to_action - assert_redirected_to :controller => 'action_pack_assertions', :action => "flash_me", :id => 1, :params => { :panda => 'fun' } - end - - def test_redirected_to_url_leading_slash - process :redirect_to_path - assert_redirected_to '/some/path' - end - - def test_redirected_to_url_no_leading_slash_fails - process :redirect_to_path - assert_raise ActiveSupport::TestCase::Assertion do - assert_redirected_to 'some/path' - end - end - - def test_redirected_to_url_full_url - process :redirect_to_path - assert_redirected_to 'http://test.host/some/path' - end - - def test_assert_redirection_with_symbol - process :redirect_to_controller_with_symbol - assert_nothing_raised { - assert_redirected_to :controller => "elsewhere", :action => "flash_me" - } - process :redirect_to_controller_with_symbol - assert_nothing_raised { - assert_redirected_to :controller => :elsewhere, :action => :flash_me - } - end - - def test_redirected_to_with_nested_controller - @controller = Admin::InnerModuleController.new - get :redirect_to_absolute_controller - assert_redirected_to :controller => '/content' - - get :redirect_to_fellow_controller - assert_redirected_to :controller => 'admin/user' - end - - def test_assert_response_uses_exception_message - @controller = AssertResponseWithUnexpectedErrorController.new - get :index - assert_response :success - flunk 'Expected non-success response' - rescue RuntimeError => e - assert e.message.include?('FAIL') - end - - def test_assert_response_failure_response_with_no_exception - @controller = AssertResponseWithUnexpectedErrorController.new - get :show - assert_response :success - flunk 'Expected non-success response' - rescue ActiveSupport::TestCase::Assertion - # success - rescue - flunk "assert_response failed to handle failure response with missing, but optional, exception." - end -end - -class AssertTemplateTest < ActionController::TestCase - tests ActionPackAssertionsController - - def test_with_partial - get :partial - assert_template :partial => '_partial' - end - - def test_with_nil_passes_when_no_template_rendered - get :nothing - assert_template nil - end - - def test_with_nil_fails_when_template_rendered - get :hello_world - assert_raise(ActiveSupport::TestCase::Assertion) do - assert_template nil - end - end - - def test_passes_with_correct_string - get :hello_world - assert_template 'hello_world' - assert_template 'test/hello_world' - end - - def test_passes_with_correct_symbol - get :hello_world - assert_template :hello_world - end - - def test_fails_with_incorrect_string - get :hello_world - assert_raise(ActiveSupport::TestCase::Assertion) do - assert_template 'hello_planet' - end - end - - def test_fails_with_incorrect_symbol - get :hello_world - assert_raise(ActiveSupport::TestCase::Assertion) do - assert_template :hello_planet - end - end -end - -class ActionPackHeaderTest < ActionController::TestCase - tests ActionPackAssertionsController - - def test_rendering_xml_sets_content_type - process :hello_xml_world - assert_equal('application/xml; charset=utf-8', @response.headers['Content-Type']) - end - - def test_rendering_xml_respects_content_type - process :hello_xml_world_pdf - assert_equal('application/pdf; charset=utf-8', @response.headers['Content-Type']) - end - - def test_rendering_xml_respects_content_type_when_set_in_the_header - process :hello_xml_world_pdf_header - assert_equal('application/pdf; charset=utf-8', @response.headers['Content-Type']) - end - - def test_render_text_with_custom_content_type - get :render_text_with_custom_content_type - assert_equal 'application/rss+xml; charset=utf-8', @response.headers['Content-Type'] - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/addresses_render_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/addresses_render_test.rb deleted file mode 100644 index 477b6aeb5..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/addresses_render_test.rb +++ /dev/null @@ -1,35 +0,0 @@ -require 'abstract_unit' -require 'logger' -require 'controller/fake_controllers' - -class Address - def Address.count(conditions = nil, join = nil) - nil - end - - def Address.find_all(arg1, arg2, arg3, arg4) - [] - end - - def self.find(*args) - [] - end -end - -class AddressesTest < ActionController::TestCase - tests AddressesController - - def setup - super - # enable a logger so that (e.g.) the benchmarking stuff runs, so we can get - # a more accurate simulation of what happens in "real life". - @controller.logger = Logger.new(nil) - - @request.host = "www.nextangle.com" - end - - def test_list - get :list - assert_equal "We only need to get this far!", @response.body.chomp - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/assert_select_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/assert_select_test.rb deleted file mode 100644 index 3ce4b3a41..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/assert_select_test.rb +++ /dev/null @@ -1,742 +0,0 @@ -# encoding: utf-8 -#-- -# Copyright (c) 2006 Assaf Arkin (http://labnotes.org) -# Under MIT and/or CC By license. -#++ - -require 'abstract_unit' -require 'controller/fake_controllers' - -require 'action_mailer' -ActionMailer::Base.view_paths = FIXTURE_LOAD_PATH - -class AssertSelectTest < ActionController::TestCase - Assertion = ActiveSupport::TestCase::Assertion - - class AssertSelectMailer < ActionMailer::Base - def test(html) - recipients "test " - from "test@test.host" - subject "Test e-mail" - part :content_type=>"text/html", :body=>html - end - end - - class AssertSelectController < ActionController::Base - def response_with=(content) - @content = content - end - - def response_with(&block) - @update = block - end - - def html() - render :text=>@content, :layout=>false, :content_type=>Mime::HTML - @content = nil - end - - def rjs() - render :update do |page| - @update.call page - end - @update = nil - end - - def xml() - render :text=>@content, :layout=>false, :content_type=>Mime::XML - @content = nil - end - - def rescue_action(e) - raise e - end - end - - tests AssertSelectController - - def setup - super - ActionMailer::Base.delivery_method = :test - ActionMailer::Base.perform_deliveries = true - ActionMailer::Base.deliveries = [] - end - - def teardown - super - ActionMailer::Base.deliveries.clear - end - - def assert_failure(message, &block) - e = assert_raise(Assertion, &block) - assert_match(message, e.message) if Regexp === message - assert_equal(message, e.message) if String === message - end - - # - # Test assert select. - # - - def test_assert_select - render_html %Q{
} - assert_select "div", 2 - assert_failure(/Expected at least 1 element matching \"p\", found 0/) { assert_select "p" } - end - - def test_equality_integer - render_html %Q{
} - assert_failure(/Expected exactly 3 elements matching \"div\", found 2/) { assert_select "div", 3 } - assert_failure(/Expected exactly 0 elements matching \"div\", found 2/) { assert_select "div", 0 } - end - - def test_equality_true_false - render_html %Q{
} - assert_nothing_raised { assert_select "div" } - assert_raise(Assertion) { assert_select "p" } - assert_nothing_raised { assert_select "div", true } - assert_raise(Assertion) { assert_select "p", true } - assert_raise(Assertion) { assert_select "div", false } - assert_nothing_raised { assert_select "p", false } - end - - def test_equality_false_message - render_html %Q{
} - assert_failure(/Expected exactly 0 elements matching \"div\", found 2/) { assert_select "div", false } - end - - def test_equality_string_and_regexp - render_html %Q{
foo
foo
} - assert_nothing_raised { assert_select "div", "foo" } - assert_raise(Assertion) { assert_select "div", "bar" } - assert_nothing_raised { assert_select "div", :text=>"foo" } - assert_raise(Assertion) { assert_select "div", :text=>"bar" } - assert_nothing_raised { assert_select "div", /(foo|bar)/ } - assert_raise(Assertion) { assert_select "div", /foobar/ } - assert_nothing_raised { assert_select "div", :text=>/(foo|bar)/ } - assert_raise(Assertion) { assert_select "div", :text=>/foobar/ } - assert_raise(Assertion) { assert_select "p", :text=>/foobar/ } - end - - def test_equality_of_html - render_html %Q{

\n"This is not a big problem," he said.\n

} - text = "\"This is not a big problem,\" he said." - html = "\"This is not a big problem,\" he said." - assert_nothing_raised { assert_select "p", text } - assert_raise(Assertion) { assert_select "p", html } - assert_nothing_raised { assert_select "p", :html=>html } - assert_raise(Assertion) { assert_select "p", :html=>text } - # No stripping for pre. - render_html %Q{
\n"This is not a big problem," he said.\n
} - text = "\n\"This is not a big problem,\" he said.\n" - html = "\n\"This is not a big problem,\" he said.\n" - assert_nothing_raised { assert_select "pre", text } - assert_raise(Assertion) { assert_select "pre", html } - assert_nothing_raised { assert_select "pre", :html=>html } - assert_raise(Assertion) { assert_select "pre", :html=>text } - end - - def test_counts - render_html %Q{
foo
foo
} - assert_nothing_raised { assert_select "div", 2 } - assert_failure(/Expected exactly 3 elements matching \"div\", found 2/) do - assert_select "div", 3 - end - assert_nothing_raised { assert_select "div", 1..2 } - assert_failure(/Expected between 3 and 4 elements matching \"div\", found 2/) do - assert_select "div", 3..4 - end - assert_nothing_raised { assert_select "div", :count=>2 } - assert_failure(/Expected exactly 3 elements matching \"div\", found 2/) do - assert_select "div", :count=>3 - end - assert_nothing_raised { assert_select "div", :minimum=>1 } - assert_nothing_raised { assert_select "div", :minimum=>2 } - assert_failure(/Expected at least 3 elements matching \"div\", found 2/) do - assert_select "div", :minimum=>3 - end - assert_nothing_raised { assert_select "div", :maximum=>2 } - assert_nothing_raised { assert_select "div", :maximum=>3 } - assert_failure(/Expected at most 1 element matching \"div\", found 2/) do - assert_select "div", :maximum=>1 - end - assert_nothing_raised { assert_select "div", :minimum=>1, :maximum=>2 } - assert_failure(/Expected between 3 and 4 elements matching \"div\", found 2/) do - assert_select "div", :minimum=>3, :maximum=>4 - end - end - - def test_substitution_values - render_html %Q{
foo
foo
} - assert_select "div#?", /\d+/ do |elements| - assert_equal 2, elements.size - end - assert_select "div" do - assert_select "div#?", /\d+/ do |elements| - assert_equal 2, elements.size - assert_select "#1" - assert_select "#2" - end - end - end - - def test_nested_assert_select - render_html %Q{
foo
foo
} - assert_select "div" do |elements| - assert_equal 2, elements.size - assert_select elements[0], "#1" - assert_select elements[1], "#2" - end - assert_select "div" do - assert_select "div" do |elements| - assert_equal 2, elements.size - # Testing in a group is one thing - assert_select "#1,#2" - # Testing individually is another. - assert_select "#1" - assert_select "#2" - assert_select "#3", false - end - end - - assert_failure(/Expected at least 1 element matching \"#4\", found 0\./) do - assert_select "div" do - assert_select "#4" - end - end - end - - def test_assert_select_text_match - render_html %Q{
foo
bar
} - assert_select "div" do - assert_nothing_raised { assert_select "div", "foo" } - assert_nothing_raised { assert_select "div", "bar" } - assert_nothing_raised { assert_select "div", /\w*/ } - assert_nothing_raised { assert_select "div", :text => /\w*/, :count=>2 } - assert_raise(Assertion) { assert_select "div", :text=>"foo", :count=>2 } - assert_nothing_raised { assert_select "div", :html=>"bar" } - assert_nothing_raised { assert_select "div", :html=>"bar" } - assert_nothing_raised { assert_select "div", :html=>/\w*/ } - assert_nothing_raised { assert_select "div", :html=>/\w*/, :count=>2 } - assert_raise(Assertion) { assert_select "div", :html=>"foo", :count=>2 } - end - end - - # With single result. - def test_assert_select_from_rjs_with_single_result - render_rjs do |page| - page.replace_html "test", "
foo
\n
foo
" - end - assert_select "div" do |elements| - assert elements.size == 2 - assert_select "#1" - assert_select "#2" - end - assert_select "div#?", /\d+/ do |elements| - assert_select "#1" - assert_select "#2" - end - end - - # With multiple results. - def test_assert_select_from_rjs_with_multiple_results - render_rjs do |page| - page.replace_html "test", "
foo
" - page.replace_html "test2", "
foo
" - end - assert_select "div" do |elements| - assert elements.size == 2 - assert_select "#1" - assert_select "#2" - end - end - - def test_assert_select_rjs_for_positioned_insert_should_fail_when_mixing_arguments - render_rjs do |page| - page.insert_html :top, "test1", "
foo
" - page.insert_html :bottom, "test2", "
foo
" - end - assert_raise(Assertion) {assert_select_rjs :insert, :top, "test2"} - end - - def test_assert_select_rjs_for_redirect_to - render_rjs do |page| - page.redirect_to '/' - end - assert_select_rjs :redirect, '/' - end - - def test_elect_with_xml_namespace_attributes - render_html %Q{} - assert_nothing_raised { assert_select "link[xlink:href=http://nowhere.com]" } - end - - # - # Test css_select. - # - - def test_css_select - render_html %Q{
} - assert_equal 2, css_select("div").size - assert_equal 0, css_select("p").size - end - - def test_nested_css_select - render_html %Q{
foo
foo
} - assert_select "div#?", /\d+/ do |elements| - assert_equal 1, css_select(elements[0], "div").size - assert_equal 1, css_select(elements[1], "div").size - end - assert_select "div" do - assert_equal 2, css_select("div").size - css_select("div").each do |element| - # Testing as a group is one thing - assert !css_select("#1,#2").empty? - # Testing individually is another - assert !css_select("#1").empty? - assert !css_select("#2").empty? - end - end - end - - # With one result. - def test_css_select_from_rjs_with_single_result - render_rjs do |page| - page.replace_html "test", "
foo
\n
foo
" - end - assert_equal 2, css_select("div").size - assert_equal 1, css_select("#1").size - assert_equal 1, css_select("#2").size - end - - # With multiple results. - def test_css_select_from_rjs_with_multiple_results - render_rjs do |page| - page.replace_html "test", "
foo
" - page.replace_html "test2", "
foo
" - end - - assert_equal 2, css_select("div").size - assert_equal 1, css_select("#1").size - assert_equal 1, css_select("#2").size - end - - # - # Test assert_select_rjs. - # - - # Test that we can pick up all statements in the result. - def test_assert_select_rjs_picks_up_all_statements - render_rjs do |page| - page.replace "test", "
foo
" - page.replace_html "test2", "
foo
" - page.insert_html :top, "test3", "
foo
" - end - - found = false - assert_select_rjs do - assert_select "#1" - assert_select "#2" - assert_select "#3" - found = true - end - assert found - end - - # Test that we fail if there is nothing to pick. - def test_assert_select_rjs_fails_if_nothing_to_pick - render_rjs { } - assert_raise(Assertion) { assert_select_rjs } - end - - def test_assert_select_rjs_with_unicode - # Test that non-ascii characters (which are converted into \uXXXX in RJS) are decoded correctly. - render_rjs do |page| - page.replace "test", "
\343\203\201\343\202\261\343\203\203\343\203\210
" - end - assert_select_rjs do - str = "#1" - assert_select str, :text => "\343\203\201\343\202\261\343\203\203\343\203\210" - assert_select str, "\343\203\201\343\202\261\343\203\203\343\203\210" - if str.respond_to?(:force_encoding) - assert_select str, /\343\203\201..\343\203\210/u - assert_raise(Assertion) { assert_select str, /\343\203\201.\343\203\210/u } - else - assert_select str, Regexp.new("\343\203\201..\343\203\210",0,'U') - assert_raise(Assertion) { assert_select str, Regexp.new("\343\203\201.\343\203\210",0,'U') } - end - end - end - - def test_assert_select_rjs_with_id - # Test that we can pick up all statements in the result. - render_rjs do |page| - page.replace "test1", "
foo
" - page.replace_html "test2", "
foo
" - page.insert_html :top, "test3", "
foo
" - end - assert_select_rjs "test1" do - assert_select "div", 1 - assert_select "#1" - end - assert_select_rjs "test2" do - assert_select "div", 1 - assert_select "#2" - end - assert_select_rjs "test3" do - assert_select "div", 1 - assert_select "#3" - end - assert_raise(Assertion) { assert_select_rjs "test4" } - end - - def test_assert_select_rjs_for_replace - render_rjs do |page| - page.replace "test1", "
foo
" - page.replace_html "test2", "
foo
" - page.insert_html :top, "test3", "
foo
" - end - # Replace. - assert_select_rjs :replace do - assert_select "div", 1 - assert_select "#1" - end - assert_select_rjs :replace, "test1" do - assert_select "div", 1 - assert_select "#1" - end - assert_raise(Assertion) { assert_select_rjs :replace, "test2" } - # Replace HTML. - assert_select_rjs :replace_html do - assert_select "div", 1 - assert_select "#2" - end - assert_select_rjs :replace_html, "test2" do - assert_select "div", 1 - assert_select "#2" - end - assert_raise(Assertion) { assert_select_rjs :replace_html, "test1" } - end - - def test_assert_select_rjs_for_chained_replace - render_rjs do |page| - page['test1'].replace "
foo
" - page['test2'].replace_html "
foo
" - page.insert_html :top, "test3", "
foo
" - end - # Replace. - assert_select_rjs :chained_replace do - assert_select "div", 1 - assert_select "#1" - end - assert_select_rjs :chained_replace, "test1" do - assert_select "div", 1 - assert_select "#1" - end - assert_raise(Assertion) { assert_select_rjs :chained_replace, "test2" } - # Replace HTML. - assert_select_rjs :chained_replace_html do - assert_select "div", 1 - assert_select "#2" - end - assert_select_rjs :chained_replace_html, "test2" do - assert_select "div", 1 - assert_select "#2" - end - assert_raise(Assertion) { assert_select_rjs :replace_html, "test1" } - end - - # Simple remove - def test_assert_select_rjs_for_remove - render_rjs do |page| - page.remove "test1" - end - - assert_select_rjs :remove, "test1" - end - - def test_assert_select_rjs_for_remove_offers_useful_error_when_assertion_fails - render_rjs do |page| - page.remove "test_with_typo" - end - - assert_select_rjs :remove, "test1" - - rescue Assertion - assert_equal "No RJS statement that removes 'test1' was rendered.", $!.message - end - - def test_assert_select_rjs_for_remove_ignores_block - render_rjs do |page| - page.remove "test1" - end - - assert_nothing_raised do - assert_select_rjs :remove, "test1" do - assert_select "p" - end - end - end - - # Simple show - def test_assert_select_rjs_for_show - render_rjs do |page| - page.show "test1" - end - - assert_select_rjs :show, "test1" - end - - def test_assert_select_rjs_for_show_offers_useful_error_when_assertion_fails - render_rjs do |page| - page.show "test_with_typo" - end - - assert_select_rjs :show, "test1" - - rescue Assertion - assert_equal "No RJS statement that shows 'test1' was rendered.", $!.message - end - - def test_assert_select_rjs_for_show_ignores_block - render_rjs do |page| - page.show "test1" - end - - assert_nothing_raised do - assert_select_rjs :show, "test1" do - assert_select "p" - end - end - end - - # Simple hide - def test_assert_select_rjs_for_hide - render_rjs do |page| - page.hide "test1" - end - - assert_select_rjs :hide, "test1" - end - - def test_assert_select_rjs_for_hide_offers_useful_error_when_assertion_fails - render_rjs do |page| - page.hide "test_with_typo" - end - - assert_select_rjs :hide, "test1" - - rescue Assertion - assert_equal "No RJS statement that hides 'test1' was rendered.", $!.message - end - - def test_assert_select_rjs_for_hide_ignores_block - render_rjs do |page| - page.hide "test1" - end - - assert_nothing_raised do - assert_select_rjs :hide, "test1" do - assert_select "p" - end - end - end - - # Simple toggle - def test_assert_select_rjs_for_toggle - render_rjs do |page| - page.toggle "test1" - end - - assert_select_rjs :toggle, "test1" - end - - def test_assert_select_rjs_for_toggle_offers_useful_error_when_assertion_fails - render_rjs do |page| - page.toggle "test_with_typo" - end - - assert_select_rjs :toggle, "test1" - - rescue Assertion - assert_equal "No RJS statement that toggles 'test1' was rendered.", $!.message - end - - def test_assert_select_rjs_for_toggle_ignores_block - render_rjs do |page| - page.toggle "test1" - end - - assert_nothing_raised do - assert_select_rjs :toggle, "test1" do - assert_select "p" - end - end - end - - # Non-positioned insert. - def test_assert_select_rjs_for_nonpositioned_insert - render_rjs do |page| - page.replace "test1", "
foo
" - page.replace_html "test2", "
foo
" - page.insert_html :top, "test3", "
foo
" - end - assert_select_rjs :insert_html do - assert_select "div", 1 - assert_select "#3" - end - assert_select_rjs :insert_html, "test3" do - assert_select "div", 1 - assert_select "#3" - end - assert_raise(Assertion) { assert_select_rjs :insert_html, "test1" } - end - - # Positioned insert. - def test_assert_select_rjs_for_positioned_insert - render_rjs do |page| - page.insert_html :top, "test1", "
foo
" - page.insert_html :bottom, "test2", "
foo
" - page.insert_html :before, "test3", "
foo
" - page.insert_html :after, "test4", "
foo
" - end - assert_select_rjs :insert, :top do - assert_select "div", 1 - assert_select "#1" - end - assert_select_rjs :insert, :bottom do - assert_select "div", 1 - assert_select "#2" - end - assert_select_rjs :insert, :before do - assert_select "div", 1 - assert_select "#3" - end - assert_select_rjs :insert, :after do - assert_select "div", 1 - assert_select "#4" - end - assert_select_rjs :insert_html do - assert_select "div", 4 - end - end - - def test_assert_select_rjs_raise_errors - assert_raise(ArgumentError) { assert_select_rjs(:destroy) } - assert_raise(ArgumentError) { assert_select_rjs(:insert, :left) } - end - - # Simple selection from a single result. - def test_nested_assert_select_rjs_with_single_result - render_rjs do |page| - page.replace_html "test", "
foo
\n
foo
" - end - - assert_select_rjs "test" do |elements| - assert_equal 2, elements.size - assert_select "#1" - assert_select "#2" - end - end - - # Deal with two results. - def test_nested_assert_select_rjs_with_two_results - render_rjs do |page| - page.replace_html "test", "
foo
" - page.replace_html "test2", "
foo
" - end - - assert_select_rjs "test" do |elements| - assert_equal 1, elements.size - assert_select "#1" - end - - assert_select_rjs "test2" do |elements| - assert_equal 1, elements.size - assert_select "#2" - end - end - - def test_feed_item_encoded - render_xml <<-EOF - - - - - Test 1

- ]]> -
-
- - - Test 2

- ]]> -
-
-
-
-EOF - assert_select "channel item description" do - # Test element regardless of wrapper. - assert_select_encoded do - assert_select "p", :count=>2, :text=>/Test/ - end - # Test through encoded wrapper. - assert_select_encoded do - assert_select "encoded p", :count=>2, :text=>/Test/ - end - # Use :root instead (recommended) - assert_select_encoded do - assert_select ":root p", :count=>2, :text=>/Test/ - end - # Test individually. - assert_select "description" do |elements| - assert_select_encoded elements[0] do - assert_select "p", "Test 1" - end - assert_select_encoded elements[1] do - assert_select "p", "Test 2" - end - end - end - - # Test that we only un-encode element itself. - assert_select "channel item" do - assert_select_encoded do - assert_select "p", 0 - end - end - end - - # - # Test assert_select_email - # - - def test_assert_select_email - assert_raise(Assertion) { assert_select_email {} } - AssertSelectMailer.test("

foo

bar

").deliver - assert_select_email do - assert_select "div:root" do - assert_select "p:first-child", "foo" - assert_select "p:last-child", "bar" - end - end - end - - protected - def render_html(html) - @controller.response_with = html - get :html - end - - def render_rjs(&block) - @controller.response_with &block - get :rjs - end - - def render_xml(xml) - @controller.response_with = xml - get :xml - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/base_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/base_test.rb deleted file mode 100644 index 4ee3a483e..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/base_test.rb +++ /dev/null @@ -1,318 +0,0 @@ -require 'abstract_unit' -require 'logger' -require 'pp' # require 'pp' early to prevent hidden_methods from not picking up the pretty-print methods until too late - -# Provide some controller to run the tests on. -module Submodule - class ContainedEmptyController < ActionController::Base - end - - class ContainedNonEmptyController < ActionController::Base - def public_action - render :nothing => true - end - - hide_action :hidden_action - def hidden_action - raise "Noooo!" - end - - def another_hidden_action - end - hide_action :another_hidden_action - end - - class SubclassedController < ContainedNonEmptyController - hide_action :public_action # Hiding it here should not affect the superclass. - end -end - -class EmptyController < ActionController::Base -end - -class NonEmptyController < ActionController::Base - def public_action - render :nothing => true - end - - hide_action :hidden_action - def hidden_action - end -end - -class MethodMissingController < ActionController::Base - hide_action :shouldnt_be_called - def shouldnt_be_called - raise "NO WAY!" - end - -protected - - def method_missing(selector) - render :text => selector.to_s - end -end - -class AnotherMethodMissingController < ActionController::Base - cattr_accessor :_exception - rescue_from Exception, :with => :_exception= - - protected - def method_missing(*attrs, &block) - super - end -end - -class DefaultUrlOptionsController < ActionController::Base - def from_view - render :inline => "<%= #{params[:route]} %>" - end - - def default_url_options(options = nil) - { :host => 'www.override.com', :action => 'new', :locale => 'en' } - end -end - -class UrlOptionsController < ActionController::Base - def from_view - render :inline => "<%= #{params[:route]} %>" - end - - def url_options - super.merge(:host => 'www.override.com', :action => 'new', :locale => 'en') - end -end - -class RecordIdentifierController < ActionController::Base -end - -class ControllerClassTests < ActiveSupport::TestCase - - def test_controller_path - assert_equal 'empty', EmptyController.controller_path - assert_equal EmptyController.controller_path, EmptyController.new.controller_path - assert_equal 'submodule/contained_empty', Submodule::ContainedEmptyController.controller_path - assert_equal Submodule::ContainedEmptyController.controller_path, Submodule::ContainedEmptyController.new.controller_path - end - - def test_controller_name - assert_equal 'empty', EmptyController.controller_name - assert_equal 'contained_empty', Submodule::ContainedEmptyController.controller_name - end - - def test_filter_parameter_logging - parameters = [] - config = mock(:config => mock(:filter_parameters => parameters)) - Rails.expects(:application).returns(config) - - assert_deprecated do - Class.new(ActionController::Base) do - filter_parameter_logging :password - end - end - - assert_equal [:password], parameters - end - - def test_record_identifier - assert_respond_to RecordIdentifierController.new, :dom_id - assert_respond_to RecordIdentifierController.new, :dom_class - end -end - -class ControllerInstanceTests < Test::Unit::TestCase - def setup - @empty = EmptyController.new - @contained = Submodule::ContainedEmptyController.new - @empty_controllers = [@empty, @contained, Submodule::SubclassedController.new] - - @non_empty_controllers = [NonEmptyController.new, - Submodule::ContainedNonEmptyController.new] - end - - def test_action_methods - @empty_controllers.each do |c| - assert_equal Set.new, c.class.action_methods, "#{c.controller_path} should be empty!" - end - - @non_empty_controllers.each do |c| - assert_equal Set.new(%w(public_action)), c.class.action_methods, "#{c.controller_path} should not be empty!" - end - end - - def test_temporary_anonymous_controllers - name = 'ExamplesController' - klass = Class.new(ActionController::Base) - Object.const_set(name, klass) - - controller = klass.new - assert_equal "examples", controller.controller_path - end -end - -class PerformActionTest < ActionController::TestCase - def use_controller(controller_class) - @controller = controller_class.new - - # enable a logger so that (e.g.) the benchmarking stuff runs, so we can get - # a more accurate simulation of what happens in "real life". - @controller.logger = Logger.new(nil) - - @request = ActionController::TestRequest.new - @response = ActionController::TestResponse.new - @request.host = "www.nextangle.com" - - rescue_action_in_public! - end - - def test_process_should_be_precise - use_controller EmptyController - exception = assert_raise AbstractController::ActionNotFound do - get :non_existent - end - assert_equal exception.message, "The action 'non_existent' could not be found for EmptyController" - end - - def test_get_on_priv_should_show_selector - use_controller MethodMissingController - get :shouldnt_be_called - assert_response :success - assert_equal 'shouldnt_be_called', @response.body - end - - def test_method_missing_is_not_an_action_name - use_controller MethodMissingController - assert !@controller.__send__(:action_method?, 'method_missing') - - get :method_missing - assert_response :success - assert_equal 'method_missing', @response.body - end - - def test_method_missing_should_recieve_symbol - use_controller AnotherMethodMissingController - get :some_action - assert_kind_of NameError, @controller._exception - end - - def test_get_on_hidden_should_fail - use_controller NonEmptyController - assert_raise(ActionController::UnknownAction) { get :hidden_action } - assert_raise(ActionController::UnknownAction) { get :another_hidden_action } - end -end - -class UrlOptionsTest < ActionController::TestCase - tests UrlOptionsController - - def setup - super - @request.host = 'www.example.com' - rescue_action_in_public! - end - - def test_url_options_override - with_routing do |set| - set.draw do - match 'from_view', :to => 'url_options#from_view', :as => :from_view - match ':controller/:action' - end - - get :from_view, :route => "from_view_url" - - assert_equal 'http://www.override.com/from_view?locale=en', @response.body - assert_equal 'http://www.override.com/from_view?locale=en', @controller.send(:from_view_url) - assert_equal 'http://www.override.com/default_url_options/new?locale=en', @controller.url_for(:controller => 'default_url_options') - end - end - - def test_url_helpers_does_not_become_actions - with_routing do |set| - set.draw do - match "account/overview" - end - - @controller.class.send(:include, set.url_helpers) - assert !@controller.class.action_methods.include?("account_overview_path") - end - end -end - -class DefaultUrlOptionsTest < ActionController::TestCase - tests DefaultUrlOptionsController - - def setup - super - @request.host = 'www.example.com' - rescue_action_in_public! - end - - def test_default_url_options_override - with_routing do |set| - set.draw do - match 'from_view', :to => 'default_url_options#from_view', :as => :from_view - match ':controller/:action' - end - - get :from_view, :route => "from_view_url" - - assert_equal 'http://www.override.com/from_view?locale=en', @response.body - assert_equal 'http://www.override.com/from_view?locale=en', @controller.send(:from_view_url) - assert_equal 'http://www.override.com/default_url_options/new?locale=en', @controller.url_for(:controller => 'default_url_options') - end - end - - def test_default_url_options_are_used_in_non_positional_parameters - with_routing do |set| - set.draw do - scope("/:locale") do - resources :descriptions - end - match ':controller/:action' - end - - get :from_view, :route => "description_path(1)" - - assert_equal '/en/descriptions/1', @response.body - assert_equal '/en/descriptions', @controller.send(:descriptions_path) - assert_equal '/pl/descriptions', @controller.send(:descriptions_path, "pl") - assert_equal '/pl/descriptions', @controller.send(:descriptions_path, :locale => "pl") - assert_equal '/pl/descriptions.xml', @controller.send(:descriptions_path, "pl", "xml") - assert_equal '/en/descriptions.xml', @controller.send(:descriptions_path, :format => "xml") - assert_equal '/en/descriptions/1', @controller.send(:description_path, 1) - assert_equal '/pl/descriptions/1', @controller.send(:description_path, "pl", 1) - assert_equal '/pl/descriptions/1', @controller.send(:description_path, 1, :locale => "pl") - assert_equal '/pl/descriptions/1.xml', @controller.send(:description_path, "pl", 1, "xml") - assert_equal '/en/descriptions/1.xml', @controller.send(:description_path, 1, :format => "xml") - end - end - -end - -class EmptyUrlOptionsTest < ActionController::TestCase - tests NonEmptyController - - def setup - super - @request.host = 'www.example.com' - rescue_action_in_public! - end - - def test_ensure_url_for_works_as_expected_when_called_with_no_options_if_default_url_options_is_not_set - get :public_action - assert_equal "http://www.example.com/non_empty/public_action", @controller.url_for - end - - def test_named_routes_with_path_without_doing_a_request_first - @controller = EmptyController.new - @controller.request = @request - - with_routing do |set| - set.draw do |map| - resources :things - end - - assert_equal '/things', @controller.send(:things_path) - end - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/caching_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/caching_test.rb deleted file mode 100644 index 1ef425e02..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/caching_test.rb +++ /dev/null @@ -1,768 +0,0 @@ -require 'fileutils' -require 'abstract_unit' -require 'active_record_unit' - -CACHE_DIR = 'test_cache' -# Don't change '/../temp/' cavalierly or you might hose something you don't want hosed -FILE_STORE_PATH = File.join(File.dirname(__FILE__), '/../temp/', CACHE_DIR) -ActionController::Base.page_cache_directory = FILE_STORE_PATH - -class CachingController < ActionController::Base - abstract! - - self.cache_store = :file_store, FILE_STORE_PATH -end - -class PageCachingTestController < CachingController - caches_page :ok, :no_content, :if => Proc.new { |c| !c.request.format.json? } - caches_page :found, :not_found - - - def ok - head :ok - end - - def no_content - head :no_content - end - - def found - redirect_to :action => 'ok' - end - - def not_found - head :not_found - end - - def custom_path - render :text => "Super soaker" - cache_page("Super soaker", "/index.html") - end - - def expire_custom_path - expire_page("/index.html") - head :ok - end - - def trailing_slash - render :text => "Sneak attack" - end -end - -class PageCachingTest < ActionController::TestCase - def setup - super - - @request = ActionController::TestRequest.new - @request.host = 'hostname.com' - @request.env.delete('PATH_INFO') - - @controller = PageCachingTestController.new - @controller.perform_caching = true - @controller.cache_store = :file_store, FILE_STORE_PATH - - @response = ActionController::TestResponse.new - - @params = {:controller => 'posts', :action => 'index', :only_path => true} - - FileUtils.rm_rf(File.dirname(FILE_STORE_PATH)) - FileUtils.mkdir_p(FILE_STORE_PATH) - end - - def teardown - FileUtils.rm_rf(File.dirname(FILE_STORE_PATH)) - @controller.perform_caching = false - end - - def test_page_caching_resources_saves_to_correct_path_with_extension_even_if_default_route - with_routing do |set| - set.draw do |map| - match 'posts.:format', :to => 'posts#index', :as => :formatted_posts - match '/', :to => 'posts#index', :as => :main - end - @params[:format] = 'rss' - assert_equal '/posts.rss', @routes.url_for(@params) - @params[:format] = nil - assert_equal '/', @routes.url_for(@params) - end - end - - def test_should_cache_get_with_ok_status - get :ok - assert_response :ok - assert_page_cached :ok, "get with ok status should have been cached" - end - - def test_should_cache_with_custom_path - get :custom_path - assert File.exist?("#{FILE_STORE_PATH}/index.html") - end - - def test_should_expire_cache_with_custom_path - get :custom_path - assert File.exist?("#{FILE_STORE_PATH}/index.html") - - get :expire_custom_path - assert !File.exist?("#{FILE_STORE_PATH}/index.html") - end - - def test_should_cache_without_trailing_slash_on_url - @controller.class.cache_page 'cached content', '/page_caching_test/trailing_slash' - assert File.exist?("#{FILE_STORE_PATH}/page_caching_test/trailing_slash.html") - end - - def test_should_cache_with_trailing_slash_on_url - @controller.class.cache_page 'cached content', '/page_caching_test/trailing_slash/' - assert File.exist?("#{FILE_STORE_PATH}/page_caching_test/trailing_slash.html") - end - - def test_should_cache_ok_at_custom_path - @request.env['PATH_INFO'] = '/index.html' - get :ok - assert_response :ok - assert File.exist?("#{FILE_STORE_PATH}/index.html") - end - - [:ok, :no_content, :found, :not_found].each do |status| - [:get, :post, :put, :delete].each do |method| - unless method == :get and status == :ok - define_method "test_shouldnt_cache_#{method}_with_#{status}_status" do - send(method, status) - assert_response status - assert_page_not_cached status, "#{method} with #{status} status shouldn't have been cached" - end - end - end - end - - def test_page_caching_conditional_options - get :ok, :format=>'json' - assert_page_not_cached :ok - end - - private - def assert_page_cached(action, message = "#{action} should have been cached") - assert page_cached?(action), message - end - - def assert_page_not_cached(action, message = "#{action} shouldn't have been cached") - assert !page_cached?(action), message - end - - def page_cached?(action) - File.exist? "#{FILE_STORE_PATH}/page_caching_test/#{action}.html" - end -end - -class ActionCachingTestController < CachingController - rescue_from(Exception) { head 500 } - if defined? ActiveRecord - rescue_from(ActiveRecord::RecordNotFound) { head :not_found } - end - - caches_action :index, :redirected, :forbidden, :if => Proc.new { |c| !c.request.format.json? }, :expires_in => 1.hour - caches_action :show, :cache_path => 'http://test.host/custom/show' - caches_action :edit, :cache_path => Proc.new { |c| c.params[:id] ? "http://test.host/#{c.params[:id]};edit" : "http://test.host/edit" } - caches_action :with_layout - caches_action :layout_false, :layout => false - caches_action :record_not_found, :four_oh_four, :simple_runtime_error - - layout 'talk_from_action.erb' - - def index - @cache_this = MockTime.now.to_f.to_s - render :text => @cache_this - end - - def redirected - redirect_to :action => 'index' - end - - def forbidden - render :text => "Forbidden" - response.status = "403 Forbidden" - end - - def with_layout - @cache_this = MockTime.now.to_f.to_s - render :text => @cache_this, :layout => true - end - - def record_not_found - raise ActiveRecord::RecordNotFound, "oops!" - end - - def four_oh_four - render :text => "404'd!", :status => 404 - end - - def simple_runtime_error - raise "oops!" - end - - alias_method :show, :index - alias_method :edit, :index - alias_method :destroy, :index - alias_method :layout_false, :with_layout - - def expire - expire_action :controller => 'action_caching_test', :action => 'index' - render :nothing => true - end - - def expire_xml - expire_action :controller => 'action_caching_test', :action => 'index', :format => 'xml' - render :nothing => true - end -end - -class MockTime < Time - # Let Time spicy to assure that Time.now != Time.now - def to_f - super+rand - end -end - -class ActionCachingMockController - attr_accessor :mock_url_for - attr_accessor :mock_path - - def initialize - yield self if block_given? - end - - def url_for(*args) - @mock_url_for - end - - def params - request.parameters - end - - def request - mocked_path = @mock_path - Object.new.instance_eval(<<-EVAL) - def path; '#{@mock_path}' end - def format; 'all' end - def parameters; {:format => nil}; end - self - EVAL - end -end - -class ActionCacheTest < ActionController::TestCase - def setup - super - reset! - FileUtils.mkdir_p(FILE_STORE_PATH) - @path_class = ActionController::Caching::Actions::ActionCachePath - @mock_controller = ActionCachingMockController.new - end - - def teardown - FileUtils.rm_rf(File.dirname(FILE_STORE_PATH)) - end - - def test_simple_action_cache - get :index - assert_response :success - cached_time = content_to_cache - assert_equal cached_time, @response.body - assert fragment_exist?('hostname.com/action_caching_test') - reset! - - get :index - assert_response :success - assert_equal cached_time, @response.body - end - - def test_simple_action_not_cached - get :destroy - assert_response :success - cached_time = content_to_cache - assert_equal cached_time, @response.body - assert !fragment_exist?('hostname.com/action_caching_test/destroy') - reset! - - get :destroy - assert_response :success - assert_not_equal cached_time, @response.body - end - - include RackTestUtils - - def test_action_cache_with_layout - get :with_layout - assert_response :success - cached_time = content_to_cache - assert_not_equal cached_time, @response.body - assert fragment_exist?('hostname.com/action_caching_test/with_layout') - reset! - - get :with_layout - assert_response :success - assert_not_equal cached_time, @response.body - body = body_to_string(read_fragment('hostname.com/action_caching_test/with_layout')) - assert_equal @response.body, body - end - - def test_action_cache_with_layout_and_layout_cache_false - get :layout_false - assert_response :success - cached_time = content_to_cache - assert_not_equal cached_time, @response.body - assert fragment_exist?('hostname.com/action_caching_test/layout_false') - reset! - - get :layout_false - assert_response :success - assert_not_equal cached_time, @response.body - - body = body_to_string(read_fragment('hostname.com/action_caching_test/layout_false')) - assert_equal cached_time, body - end - - def test_action_cache_conditional_options - @request.env['HTTP_ACCEPT'] = 'application/json' - get :index - assert_response :success - assert !fragment_exist?('hostname.com/action_caching_test') - end - - def test_action_cache_with_store_options - MockTime.expects(:now).returns(12345).once - @controller.expects(:read_fragment).with('hostname.com/action_caching_test', :expires_in => 1.hour).once - @controller.expects(:write_fragment).with('hostname.com/action_caching_test', '12345.0', :expires_in => 1.hour).once - get :index - assert_response :success - end - - def test_action_cache_with_custom_cache_path - get :show - assert_response :success - cached_time = content_to_cache - assert_equal cached_time, @response.body - assert fragment_exist?('test.host/custom/show') - reset! - - get :show - assert_response :success - assert_equal cached_time, @response.body - end - - def test_action_cache_with_custom_cache_path_in_block - get :edit - assert_response :success - assert fragment_exist?('test.host/edit') - reset! - - get :edit, :id => 1 - assert_response :success - assert fragment_exist?('test.host/1;edit') - end - - def test_cache_expiration - get :index - assert_response :success - cached_time = content_to_cache - reset! - - get :index - assert_response :success - assert_equal cached_time, @response.body - reset! - - get :expire - assert_response :success - reset! - - get :index - assert_response :success - new_cached_time = content_to_cache - assert_not_equal cached_time, @response.body - reset! - - get :index - assert_response :success - assert_equal new_cached_time, @response.body - end - - def test_cache_expiration_isnt_affected_by_request_format - get :index - cached_time = content_to_cache - reset! - - @request.request_uri = "/action_caching_test/expire.xml" - get :expire, :format => :xml - assert_response :success - reset! - - get :index - assert_response :success - new_cached_time = content_to_cache - assert_not_equal cached_time, @response.body - end - - def test_cache_is_scoped_by_subdomain - @request.host = 'jamis.hostname.com' - get :index - assert_response :success - jamis_cache = content_to_cache - - reset! - - @request.host = 'david.hostname.com' - get :index - assert_response :success - david_cache = content_to_cache - assert_not_equal jamis_cache, @response.body - - reset! - - @request.host = 'jamis.hostname.com' - get :index - assert_response :success - assert_equal jamis_cache, @response.body - - reset! - - @request.host = 'david.hostname.com' - get :index - assert_response :success - assert_equal david_cache, @response.body - end - - def test_redirect_is_not_cached - get :redirected - assert_response :redirect - reset! - - get :redirected - assert_response :redirect - end - - def test_forbidden_is_not_cached - get :forbidden - assert_response :forbidden - reset! - - get :forbidden - assert_response :forbidden - end - - def test_xml_version_of_resource_is_treated_as_different_cache - with_routing do |set| - set.draw do |map| - match ':controller(/:action(.:format))' - end - - get :index, :format => 'xml' - assert_response :success - cached_time = content_to_cache - assert_equal cached_time, @response.body - assert fragment_exist?('hostname.com/action_caching_test/index.xml') - reset! - - get :index, :format => 'xml' - assert_response :success - assert_equal cached_time, @response.body - assert_equal 'application/xml', @response.content_type - reset! - - get :expire_xml - assert_response :success - reset! - - get :index, :format => 'xml' - assert_response :success - assert_not_equal cached_time, @response.body - end - end - - def test_correct_content_type_is_returned_for_cache_hit - # run it twice to cache it the first time - get :index, :id => 'content-type', :format => 'xml' - get :index, :id => 'content-type', :format => 'xml' - assert_response :success - assert_equal 'application/xml', @response.content_type - end - - def test_correct_content_type_is_returned_for_cache_hit_on_action_with_string_key - # run it twice to cache it the first time - get :show, :format => 'xml' - get :show, :format => 'xml' - assert_response :success - assert_equal 'application/xml', @response.content_type - end - - def test_correct_content_type_is_returned_for_cache_hit_on_action_with_string_key_from_proc - # run it twice to cache it the first time - get :edit, :id => 1, :format => 'xml' - get :edit, :id => 1, :format => 'xml' - assert_response :success - assert_equal 'application/xml', @response.content_type - end - - def test_empty_path_is_normalized - @mock_controller.mock_url_for = 'http://example.org/' - @mock_controller.mock_path = '/' - - assert_equal 'example.org/index', @path_class.new(@mock_controller, {}).path - end - - def test_file_extensions - get :index, :id => 'kitten.jpg' - get :index, :id => 'kitten.jpg' - - assert_response :success - end - - if defined? ActiveRecord - def test_record_not_found_returns_404_for_multiple_requests - get :record_not_found - assert_response 404 - get :record_not_found - assert_response 404 - end - end - - def test_four_oh_four_returns_404_for_multiple_requests - get :four_oh_four - assert_response 404 - get :four_oh_four - assert_response 404 - end - - def test_simple_runtime_error_returns_500_for_multiple_requests - get :simple_runtime_error - assert_response 500 - get :simple_runtime_error - assert_response 500 - end - - private - def content_to_cache - assigns(:cache_this) - end - - def reset! - @request = ActionController::TestRequest.new - @response = ActionController::TestResponse.new - @controller = ActionCachingTestController.new - @controller.singleton_class.send(:include, @routes.url_helpers) - @request.host = 'hostname.com' - end - - def fragment_exist?(path) - @controller.fragment_exist?(path) - end - - def read_fragment(path) - @controller.read_fragment(path) - end -end - -class FragmentCachingTestController < CachingController - def some_action; end; -end - -class FragmentCachingTest < ActionController::TestCase - def setup - super - @store = ActiveSupport::Cache::MemoryStore.new - @controller = FragmentCachingTestController.new - @controller.perform_caching = true - @controller.cache_store = @store - @params = {:controller => 'posts', :action => 'index'} - @request = ActionController::TestRequest.new - @response = ActionController::TestResponse.new - @controller.params = @params - @controller.request = @request - @controller.response = @response - @controller.send(:initialize_template_class, @response) - @controller.send(:assign_shortcuts, @request, @response) - end - - def test_fragment_cache_key - assert_equal 'views/what a key', @controller.fragment_cache_key('what a key') - assert_equal "views/test.host/fragment_caching_test/some_action", - @controller.fragment_cache_key(:controller => 'fragment_caching_test',:action => 'some_action') - end - - def test_read_fragment_with_caching_enabled - @store.write('views/name', 'value') - assert_equal 'value', @controller.read_fragment('name') - end - - def test_read_fragment_with_caching_disabled - @controller.perform_caching = false - @store.write('views/name', 'value') - assert_nil @controller.read_fragment('name') - end - - def test_fragment_exist_with_caching_enabled - @store.write('views/name', 'value') - assert @controller.fragment_exist?('name') - assert !@controller.fragment_exist?('other_name') - end - - def test_fragment_exist_with_caching_disabled - @controller.perform_caching = false - @store.write('views/name', 'value') - assert !@controller.fragment_exist?('name') - assert !@controller.fragment_exist?('other_name') - end - - def test_write_fragment_with_caching_enabled - assert_nil @store.read('views/name') - assert_equal 'value', @controller.write_fragment('name', 'value') - assert_equal 'value', @store.read('views/name') - end - - def test_write_fragment_with_caching_disabled - assert_nil @store.read('views/name') - @controller.perform_caching = false - assert_equal 'value', @controller.write_fragment('name', 'value') - assert_nil @store.read('views/name') - end - - def test_expire_fragment_with_simple_key - @store.write('views/name', 'value') - @controller.expire_fragment 'name' - assert_nil @store.read('views/name') - end - - def test_expire_fragment_with_regexp - @store.write('views/name', 'value') - @store.write('views/another_name', 'another_value') - @store.write('views/primalgrasp', 'will not expire ;-)') - - @controller.expire_fragment /name/ - - assert_nil @store.read('views/name') - assert_nil @store.read('views/another_name') - assert_equal 'will not expire ;-)', @store.read('views/primalgrasp') - end - - def test_fragment_for - @store.write('views/expensive', 'fragment content') - fragment_computed = false - - view_context = @controller.view_context - - buffer = 'generated till now -> '.html_safe - buffer << view_context.send(:fragment_for, 'expensive') { fragment_computed = true } - - assert !fragment_computed - assert_equal 'generated till now -> fragment content', buffer - end - - def test_html_safety - assert_nil @store.read('views/name') - content = 'value'.html_safe - assert_equal content, @controller.write_fragment('name', content) - - cached = @store.read('views/name') - assert_equal content, cached - assert_equal String, cached.class - - html_safe = @controller.read_fragment('name') - assert_equal content, html_safe - assert html_safe.html_safe? - end -end - -class FunctionalCachingController < CachingController - def fragment_cached - end - - def html_fragment_cached_with_partial - respond_to do |format| - format.html - end - end - - def js_fragment_cached_with_partial - respond_to do |format| - format.js - end - end - - def formatted_fragment_cached - respond_to do |format| - format.html - format.xml - format.js - end - end - - def rescue_action(e) - raise e - end -end - -class FunctionalFragmentCachingTest < ActionController::TestCase - def setup - super - @store = ActiveSupport::Cache::MemoryStore.new - @controller = FunctionalCachingController.new - @controller.perform_caching = true - @controller.cache_store = @store - @request = ActionController::TestRequest.new - @response = ActionController::TestResponse.new - end - - def test_fragment_caching - get :fragment_cached - assert_response :success - expected_body = <<-CACHED -Hello -This bit's fragment cached -CACHED - assert_equal expected_body, @response.body - - assert_equal "This bit's fragment cached", @store.read('views/test.host/functional_caching/fragment_cached') - end - - def test_fragment_caching_in_partials - get :html_fragment_cached_with_partial - assert_response :success - assert_match /Old fragment caching in a partial/, @response.body - assert_match "Old fragment caching in a partial", @store.read('views/test.host/functional_caching/html_fragment_cached_with_partial') - end - - def test_render_inline_before_fragment_caching - get :inline_fragment_cached - assert_response :success - assert_match /Some inline content/, @response.body - assert_match /Some cached content/, @response.body - assert_match "Some cached content", @store.read('views/test.host/functional_caching/inline_fragment_cached') - end - - def test_fragment_caching_in_rjs_partials - xhr :get, :js_fragment_cached_with_partial - assert_response :success - assert_match /Old fragment caching in a partial/, @response.body - assert_match "Old fragment caching in a partial", @store.read('views/test.host/functional_caching/js_fragment_cached_with_partial') - end - - def test_html_formatted_fragment_caching - get :formatted_fragment_cached, :format => "html" - assert_response :success - expected_body = "\n

ERB

\n\n" - - assert_equal expected_body, @response.body - - assert_equal "

ERB

", @store.read('views/test.host/functional_caching/formatted_fragment_cached') - end - - def test_xml_formatted_fragment_caching - get :formatted_fragment_cached, :format => "xml" - assert_response :success - expected_body = "\n

Builder

\n\n" - - assert_equal expected_body, @response.body - - assert_equal "

Builder

\n", @store.read('views/test.host/functional_caching/formatted_fragment_cached') - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/capture_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/capture_test.rb deleted file mode 100644 index 94e3d1666..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/capture_test.rb +++ /dev/null @@ -1,73 +0,0 @@ -require 'abstract_unit' -require 'logger' - -class CaptureController < ActionController::Base - def self.controller_name; "test"; end - def self.controller_path; "test"; end - - def content_for - render :layout => "talk_from_action" - end - - def content_for_with_parameter - render :layout => "talk_from_action" - end - - def content_for_concatenated - render :layout => "talk_from_action" - end - - def non_erb_block_content_for - render :layout => "talk_from_action" - end - - def rescue_action(e) raise end -end - -class CaptureTest < ActionController::TestCase - tests CaptureController - - def setup - super - # enable a logger so that (e.g.) the benchmarking stuff runs, so we can get - # a more accurate simulation of what happens in "real life". - @controller.logger = Logger.new(nil) - - @request.host = "www.nextangle.com" - end - - def test_simple_capture - get :capturing - assert_equal "Dreamy days", @response.body.strip - end - - def test_content_for - get :content_for - assert_equal expected_content_for_output, @response.body - end - - def test_should_concatentate_content_for - get :content_for_concatenated - assert_equal expected_content_for_output, @response.body - end - - def test_should_set_content_for_with_parameter - get :content_for_with_parameter - assert_equal expected_content_for_output, @response.body - end - - def test_non_erb_block_content_for - get :non_erb_block_content_for - assert_equal expected_content_for_output, @response.body - end - - def test_proper_block_detection - @todo = "some todo" - get :proper_block_detection - end - - private - def expected_content_for_output - "Putting stuff in the title!\nGreat stuff!" - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/content_type_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/content_type_test.rb deleted file mode 100644 index 15459f255..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/content_type_test.rb +++ /dev/null @@ -1,169 +0,0 @@ -require 'abstract_unit' - -class OldContentTypeController < ActionController::Base - # :ported: - def render_content_type_from_body - response.content_type = Mime::RSS - render :text => "hello world!" - end - - # :ported: - def render_defaults - render :text => "hello world!" - end - - # :ported: - def render_content_type_from_render - render :text => "hello world!", :content_type => Mime::RSS - end - - # :ported: - def render_charset_from_body - response.charset = "utf-16" - render :text => "hello world!" - end - - # :ported: - def render_nil_charset_from_body - response.charset = nil - render :text => "hello world!" - end - - def render_default_for_rhtml - end - - def render_default_for_rxml - end - - def render_default_for_rjs - end - - def render_change_for_rxml - response.content_type = Mime::HTML - render :action => "render_default_for_rxml" - end - - def render_default_content_types_for_respond_to - respond_to do |format| - format.html { render :text => "hello world!" } - format.xml { render :action => "render_default_content_types_for_respond_to" } - format.js { render :text => "hello world!" } - format.rss { render :text => "hello world!", :content_type => Mime::XML } - end - end - - def rescue_action(e) raise end -end - -class ContentTypeTest < ActionController::TestCase - tests OldContentTypeController - - def setup - super - # enable a logger so that (e.g.) the benchmarking stuff runs, so we can get - # a more accurate simulation of what happens in "real life". - @controller.logger = Logger.new(nil) - end - - # :ported: - def test_render_defaults - get :render_defaults - assert_equal "utf-8", @response.charset - assert_equal Mime::HTML, @response.content_type - end - - def test_render_changed_charset_default - OldContentTypeController.default_charset = "utf-16" - get :render_defaults - assert_equal "utf-16", @response.charset - assert_equal Mime::HTML, @response.content_type - OldContentTypeController.default_charset = "utf-8" - end - - # :ported: - def test_content_type_from_body - get :render_content_type_from_body - assert_equal Mime::RSS, @response.content_type - assert_equal "utf-8", @response.charset - end - - # :ported: - def test_content_type_from_render - get :render_content_type_from_render - assert_equal Mime::RSS, @response.content_type - assert_equal "utf-8", @response.charset - end - - # :ported: - def test_charset_from_body - get :render_charset_from_body - assert_equal Mime::HTML, @response.content_type - assert_equal "utf-16", @response.charset - end - - # :ported: - def test_nil_charset_from_body - get :render_nil_charset_from_body - assert_equal Mime::HTML, @response.content_type - assert_equal "utf-8", @response.charset, @response.headers.inspect - end - - def test_nil_default_for_rhtml - OldContentTypeController.default_charset = nil - get :render_default_for_rhtml - assert_equal Mime::HTML, @response.content_type - assert_nil @response.charset, @response.headers.inspect - ensure - OldContentTypeController.default_charset = "utf-8" - end - - def test_default_for_rhtml - get :render_default_for_rhtml - assert_equal Mime::HTML, @response.content_type - assert_equal "utf-8", @response.charset - end - - def test_default_for_rxml - get :render_default_for_rxml - assert_equal Mime::XML, @response.content_type - assert_equal "utf-8", @response.charset - end - - def test_default_for_rjs - xhr :post, :render_default_for_rjs - assert_equal Mime::JS, @response.content_type - assert_equal "utf-8", @response.charset - end - - def test_change_for_rxml - get :render_change_for_rxml - assert_equal Mime::HTML, @response.content_type - assert_equal "utf-8", @response.charset - end -end - -class AcceptBasedContentTypeTest < ActionController::TestCase - tests OldContentTypeController - - def test_render_default_content_types_for_respond_to - @request.accept = Mime::HTML.to_s - get :render_default_content_types_for_respond_to - assert_equal Mime::HTML, @response.content_type - - @request.accept = Mime::JS.to_s - get :render_default_content_types_for_respond_to - assert_equal Mime::JS, @response.content_type - end - - def test_render_default_content_types_for_respond_to_with_template - @request.accept = Mime::XML.to_s - get :render_default_content_types_for_respond_to - assert_equal Mime::XML, @response.content_type - end - - def test_render_default_content_types_for_respond_to_with_overwrite - @request.accept = Mime::RSS.to_s - get :render_default_content_types_for_respond_to - assert_equal Mime::XML, @response.content_type - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/controller_fixtures/app/controllers/admin/user_controller.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/controller_fixtures/app/controllers/admin/user_controller.rb deleted file mode 100644 index e69de29bb..000000000 diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/controller_fixtures/app/controllers/user_controller.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/controller_fixtures/app/controllers/user_controller.rb deleted file mode 100644 index e69de29bb..000000000 diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib/plugin_controller.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib/plugin_controller.rb deleted file mode 100644 index e69de29bb..000000000 diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/deprecation/deprecated_base_methods_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/deprecation/deprecated_base_methods_test.rb deleted file mode 100644 index 59604480a..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/deprecation/deprecated_base_methods_test.rb +++ /dev/null @@ -1,26 +0,0 @@ -require 'abstract_unit' - -class DeprecatedBaseMethodsTest < ActionController::TestCase - class Target < ActionController::Base - def home_url(greeting) - "http://example.com/#{greeting}" - end - - def raises_name_error - this_method_doesnt_exist - end - - def rescue_action(e) raise e end - end - - tests Target - - if defined? Test::Unit::Error - def test_assertion_failed_error_silences_deprecation_warnings - get :raises_name_error - rescue => e - error = Test::Unit::Error.new('testing ur doodz', e) - assert_not_deprecated { error.message } - end - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/dispatcher_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/dispatcher_test.rb deleted file mode 100644 index 0497109fc..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/dispatcher_test.rb +++ /dev/null @@ -1,59 +0,0 @@ -require 'abstract_unit' - -# Ensure deprecated dispatcher works -class DeprecatedDispatcherTest < ActiveSupport::TestCase - class DummyApp - def call(env) - [200, {}, 'response'] - end - end - - def setup - ActionDispatch::Callbacks.reset_callbacks(:prepare) - ActionDispatch::Callbacks.reset_callbacks(:call) - end - - def test_assert_deprecated_to_prepare - a = nil - - assert_deprecated do - ActionController::Dispatcher.to_prepare { a = 1 } - end - - assert_nil a - dispatch - assert_equal 1, a - end - - def test_assert_deprecated_before_dispatch - a = nil - - assert_deprecated do - ActionController::Dispatcher.before_dispatch { a = 1 } - end - - assert_nil a - dispatch - assert_equal 1, a - end - - def test_assert_deprecated_after_dispatch - a = nil - - assert_deprecated do - ActionController::Dispatcher.after_dispatch { a = 1 } - end - - assert_nil a - dispatch - assert_equal 1, a - end - - private - - def dispatch(cache_classes = true) - @dispatcher ||= ActionDispatch::Callbacks.new(DummyApp.new, !cache_classes) - @dispatcher.call({'rack.input' => StringIO.new('')}) - end - -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/filters_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/filters_test.rb deleted file mode 100644 index a5f9a0283..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/filters_test.rb +++ /dev/null @@ -1,938 +0,0 @@ -require 'abstract_unit' - -class ActionController::Base - class << self - %w(append_around_filter prepend_after_filter prepend_around_filter prepend_before_filter skip_after_filter skip_before_filter skip_filter).each do |pending| - define_method(pending) do |*args| - $stderr.puts "#{pending} unimplemented: #{args.inspect}" - end unless method_defined?(pending) - end - - def before_filters - filters = _process_action_callbacks.select { |c| c.kind == :before } - filters.map! { |c| c.instance_variable_get(:@raw_filter) } - end - end - - def assigns(key = nil) - assigns = {} - instance_variable_names.each do |ivar| - next if ActionController::Base.protected_instance_variables.include?(ivar) - assigns[ivar[1..-1]] = instance_variable_get(ivar) - end - - key.nil? ? assigns : assigns[key.to_s] - end -end - -class FilterTest < ActionController::TestCase - - class TestController < ActionController::Base - before_filter :ensure_login - after_filter :clean_up - - def show - render :inline => "ran action" - end - - private - def ensure_login - @ran_filter ||= [] - @ran_filter << "ensure_login" - end - - def clean_up - @ran_after_filter ||= [] - @ran_after_filter << "clean_up" - end - end - - class ChangingTheRequirementsController < TestController - before_filter :ensure_login, :except => [:go_wild] - - def go_wild - render :text => "gobble" - end - end - - class TestMultipleFiltersController < ActionController::Base - before_filter :try_1 - before_filter :try_2 - before_filter :try_3 - - (1..3).each do |i| - define_method "fail_#{i}" do - render :text => i.to_s - end - end - - protected - (1..3).each do |i| - define_method "try_#{i}" do - instance_variable_set :@try, i - if action_name == "fail_#{i}" - head(404) - end - end - end - end - - class RenderingController < ActionController::Base - before_filter :render_something_else - - def show - @ran_action = true - render :inline => "ran action" - end - - private - def render_something_else - render :inline => "something else" - end - end - - class ConditionalFilterController < ActionController::Base - def show - render :inline => "ran action" - end - - def another_action - render :inline => "ran action" - end - - def show_without_filter - render :inline => "ran action without filter" - end - - private - def ensure_login - @ran_filter ||= [] - @ran_filter << "ensure_login" - end - - def clean_up_tmp - @ran_filter ||= [] - @ran_filter << "clean_up_tmp" - end - - def rescue_action(e) raise(e) end - end - - class ConditionalCollectionFilterController < ConditionalFilterController - before_filter :ensure_login, :except => [ :show_without_filter, :another_action ] - end - - class OnlyConditionSymController < ConditionalFilterController - before_filter :ensure_login, :only => :show - end - - class ExceptConditionSymController < ConditionalFilterController - before_filter :ensure_login, :except => :show_without_filter - end - - class BeforeAndAfterConditionController < ConditionalFilterController - before_filter :ensure_login, :only => :show - after_filter :clean_up_tmp, :only => :show - end - - class OnlyConditionProcController < ConditionalFilterController - before_filter(:only => :show) {|c| c.instance_variable_set(:"@ran_proc_filter", true) } - end - - class ExceptConditionProcController < ConditionalFilterController - before_filter(:except => :show_without_filter) {|c| c.instance_variable_set(:"@ran_proc_filter", true) } - end - - class ConditionalClassFilter - def self.filter(controller) controller.instance_variable_set(:"@ran_class_filter", true) end - end - - class OnlyConditionClassController < ConditionalFilterController - before_filter ConditionalClassFilter, :only => :show - end - - class ExceptConditionClassController < ConditionalFilterController - before_filter ConditionalClassFilter, :except => :show_without_filter - end - - class AnomolousYetValidConditionController < ConditionalFilterController - before_filter(ConditionalClassFilter, :ensure_login, Proc.new {|c| c.instance_variable_set(:"@ran_proc_filter1", true)}, :except => :show_without_filter) { |c| c.instance_variable_set(:"@ran_proc_filter2", true)} - end - - class ConditionalOptionsFilter < ConditionalFilterController - before_filter :ensure_login, :if => Proc.new { |c| true } - before_filter :clean_up_tmp, :if => Proc.new { |c| false } - end - - class PrependingController < TestController - prepend_before_filter :wonderful_life - # skip_before_filter :fire_flash - - private - def wonderful_life - @ran_filter ||= [] - @ran_filter << "wonderful_life" - end - end - - class SkippingAndLimitedController < TestController - skip_before_filter :ensure_login - before_filter :ensure_login, :only => :index - - def index - render :text => 'ok' - end - - def public - render :text => 'ok' - end - end - - class SkippingAndReorderingController < TestController - skip_before_filter :ensure_login - before_filter :find_record - before_filter :ensure_login - - def index - render :text => 'ok' - end - - private - def find_record - @ran_filter ||= [] - @ran_filter << "find_record" - end - end - - class ConditionalSkippingController < TestController - skip_before_filter :ensure_login, :only => [ :login ] - skip_after_filter :clean_up, :only => [ :login ] - - before_filter :find_user, :only => [ :change_password ] - - def login - render :inline => "ran action" - end - - def change_password - render :inline => "ran action" - end - - protected - def find_user - @ran_filter ||= [] - @ran_filter << "find_user" - end - end - - class ConditionalParentOfConditionalSkippingController < ConditionalFilterController - before_filter :conditional_in_parent_before, :only => [:show, :another_action] - after_filter :conditional_in_parent_after, :only => [:show, :another_action] - - private - - def conditional_in_parent_before - @ran_filter ||= [] - @ran_filter << 'conditional_in_parent_before' - end - - def conditional_in_parent_after - @ran_filter ||= [] - @ran_filter << 'conditional_in_parent_after' - end - end - - class ChildOfConditionalParentController < ConditionalParentOfConditionalSkippingController - skip_before_filter :conditional_in_parent_before, :only => :another_action - skip_after_filter :conditional_in_parent_after, :only => :another_action - end - - class AnotherChildOfConditionalParentController < ConditionalParentOfConditionalSkippingController - skip_before_filter :conditional_in_parent_before, :only => :show - end - - class ProcController < PrependingController - before_filter(proc { |c| c.instance_variable_set(:"@ran_proc_filter", true) }) - end - - class ImplicitProcController < PrependingController - before_filter { |c| c.instance_variable_set(:"@ran_proc_filter", true) } - end - - class AuditFilter - def self.filter(controller) - controller.instance_variable_set(:"@was_audited", true) - end - end - - class AroundFilter - def before(controller) - @execution_log = "before" - controller.class.execution_log << " before aroundfilter " if controller.respond_to? :execution_log - controller.instance_variable_set(:"@before_ran", true) - end - - def after(controller) - controller.instance_variable_set(:"@execution_log", @execution_log + " and after") - controller.instance_variable_set(:"@after_ran", true) - controller.class.execution_log << " after aroundfilter " if controller.respond_to? :execution_log - end - end - - class AppendedAroundFilter - def before(controller) - controller.class.execution_log << " before appended aroundfilter " - end - - def after(controller) - controller.class.execution_log << " after appended aroundfilter " - end - end - - class AuditController < ActionController::Base - before_filter(AuditFilter) - - def show - render :text => "hello" - end - end - - class AroundFilterController < PrependingController - around_filter AroundFilter.new - end - - class BeforeAfterClassFilterController < PrependingController - begin - filter = AroundFilter.new - before_filter filter - after_filter filter - end - end - - class MixedFilterController < PrependingController - cattr_accessor :execution_log - - def initialize - @@execution_log = "" - end - - before_filter { |c| c.class.execution_log << " before procfilter " } - prepend_around_filter AroundFilter.new - - after_filter { |c| c.class.execution_log << " after procfilter " } - append_around_filter AppendedAroundFilter.new - end - - class MixedSpecializationController < ActionController::Base - class OutOfOrder < StandardError; end - - before_filter :first - before_filter :second, :only => :foo - - def foo - render :text => 'foo' - end - - def bar - render :text => 'bar' - end - - protected - def first - @first = true - end - - def second - raise OutOfOrder unless @first - end - end - - class DynamicDispatchController < ActionController::Base - before_filter :choose - - %w(foo bar baz).each do |action| - define_method(action) { render :text => action } - end - - private - def choose - self.action_name = params[:choose] - end - end - - class PrependingBeforeAndAfterController < ActionController::Base - prepend_before_filter :before_all - prepend_after_filter :after_all - before_filter :between_before_all_and_after_all - - def before_all - @ran_filter ||= [] - @ran_filter << 'before_all' - end - - def after_all - @ran_filter ||= [] - @ran_filter << 'after_all' - end - - def between_before_all_and_after_all - @ran_filter ||= [] - @ran_filter << 'between_before_all_and_after_all' - end - def show - render :text => 'hello' - end - end - - class ErrorToRescue < Exception; end - - class RescuingAroundFilterWithBlock - def filter(controller) - begin - yield - rescue ErrorToRescue => ex - controller.__send__ :render, :text => "I rescued this: #{ex.inspect}" - end - end - end - - class RescuedController < ActionController::Base - around_filter RescuingAroundFilterWithBlock.new - - def show - raise ErrorToRescue.new("Something made the bad noise.") - end - - private - def rescue_action(exception) - raise exception - end - end - - class NonYieldingAroundFilterController < ActionController::Base - - before_filter :filter_one - around_filter :non_yielding_filter - before_filter :filter_two - after_filter :filter_three - - def index - render :inline => "index" - end - - #make sure the controller complains - def rescue_action(e); raise e; end - - private - - def filter_one - @filters ||= [] - @filters << "filter_one" - end - - def filter_two - @filters << "filter_two" - end - - def non_yielding_filter - @filters << "it didn't yield" - @filter_return_value - end - - def filter_three - @filters << "filter_three" - end - - end - - class ::AppSweeper < ActionController::Caching::Sweeper; end - class SweeperTestController < ActionController::Base - cache_sweeper :app_sweeper - def show - render :text => 'hello world' - end - end - def test_sweeper_should_not_block_rendering - response = test_process(SweeperTestController) - assert_equal 'hello world', response.body - end - - def test_before_method_of_sweeper_should_always_return_true - sweeper = ActionController::Caching::Sweeper.send(:new) - assert sweeper.before(TestController.new) - end - - def test_non_yielding_around_filters_not_returning_false_do_not_raise - controller = NonYieldingAroundFilterController.new - controller.instance_variable_set "@filter_return_value", true - assert_nothing_raised do - test_process(controller, "index") - end - end - - def test_non_yielding_around_filters_returning_false_do_not_raise - controller = NonYieldingAroundFilterController.new - controller.instance_variable_set "@filter_return_value", false - assert_nothing_raised do - test_process(controller, "index") - end - end - - def test_after_filters_are_not_run_if_around_filter_returns_false - controller = NonYieldingAroundFilterController.new - controller.instance_variable_set "@filter_return_value", false - test_process(controller, "index") - assert_equal ["filter_one", "it didn't yield"], controller.assigns['filters'] - end - - def test_after_filters_are_not_run_if_around_filter_does_not_yield - controller = NonYieldingAroundFilterController.new - controller.instance_variable_set "@filter_return_value", true - test_process(controller, "index") - assert_equal ["filter_one", "it didn't yield"], controller.assigns['filters'] - end - - def test_added_filter_to_inheritance_graph - assert_equal [ :ensure_login ], TestController.before_filters - end - - def test_base_class_in_isolation - assert_equal [ ], ActionController::Base.before_filters - end - - def test_prepending_filter - assert_equal [ :wonderful_life, :ensure_login ], PrependingController.before_filters - end - - def test_running_filters - test_process(PrependingController) - assert_equal %w( wonderful_life ensure_login ), assigns["ran_filter"] - end - - def test_running_filters_with_proc - test_process(ProcController) - assert assigns["ran_proc_filter"] - end - - def test_running_filters_with_implicit_proc - test_process(ImplicitProcController) - assert assigns["ran_proc_filter"] - end - - def test_running_filters_with_class - test_process(AuditController) - assert assigns["was_audited"] - end - - def test_running_anomolous_yet_valid_condition_filters - test_process(AnomolousYetValidConditionController) - assert_equal %w( ensure_login ), assigns["ran_filter"] - assert assigns["ran_class_filter"] - assert assigns["ran_proc_filter1"] - assert assigns["ran_proc_filter2"] - - test_process(AnomolousYetValidConditionController, "show_without_filter") - assert_nil assigns["ran_filter"] - assert !assigns["ran_class_filter"] - assert !assigns["ran_proc_filter1"] - assert !assigns["ran_proc_filter2"] - end - - def test_running_conditional_options - test_process(ConditionalOptionsFilter) - assert_equal %w( ensure_login ), assigns["ran_filter"] - end - - def test_running_collection_condition_filters - test_process(ConditionalCollectionFilterController) - assert_equal %w( ensure_login ), assigns["ran_filter"] - test_process(ConditionalCollectionFilterController, "show_without_filter") - assert_nil assigns["ran_filter"] - test_process(ConditionalCollectionFilterController, "another_action") - assert_nil assigns["ran_filter"] - end - - def test_running_only_condition_filters - test_process(OnlyConditionSymController) - assert_equal %w( ensure_login ), assigns["ran_filter"] - test_process(OnlyConditionSymController, "show_without_filter") - assert_nil assigns["ran_filter"] - - test_process(OnlyConditionProcController) - assert assigns["ran_proc_filter"] - test_process(OnlyConditionProcController, "show_without_filter") - assert !assigns["ran_proc_filter"] - - test_process(OnlyConditionClassController) - assert assigns["ran_class_filter"] - test_process(OnlyConditionClassController, "show_without_filter") - assert !assigns["ran_class_filter"] - end - - def test_running_except_condition_filters - test_process(ExceptConditionSymController) - assert_equal %w( ensure_login ), assigns["ran_filter"] - test_process(ExceptConditionSymController, "show_without_filter") - assert_nil assigns["ran_filter"] - - test_process(ExceptConditionProcController) - assert assigns["ran_proc_filter"] - test_process(ExceptConditionProcController, "show_without_filter") - assert !assigns["ran_proc_filter"] - - test_process(ExceptConditionClassController) - assert assigns["ran_class_filter"] - test_process(ExceptConditionClassController, "show_without_filter") - assert !assigns["ran_class_filter"] - end - - def test_running_before_and_after_condition_filters - test_process(BeforeAndAfterConditionController) - assert_equal %w( ensure_login clean_up_tmp), assigns["ran_filter"] - test_process(BeforeAndAfterConditionController, "show_without_filter") - assert_nil assigns["ran_filter"] - end - - def test_around_filter - test_process(AroundFilterController) - assert assigns["before_ran"] - assert assigns["after_ran"] - end - - def test_before_after_class_filter - test_process(BeforeAfterClassFilterController) - assert assigns["before_ran"] - assert assigns["after_ran"] - end - - def test_having_properties_in_around_filter - test_process(AroundFilterController) - assert_equal "before and after", assigns["execution_log"] - end - - def test_prepending_and_appending_around_filter - controller = test_process(MixedFilterController) - assert_equal " before aroundfilter before procfilter before appended aroundfilter " + - " after appended aroundfilter after procfilter after aroundfilter ", - MixedFilterController.execution_log - end - - def test_rendering_breaks_filtering_chain - response = test_process(RenderingController) - assert_equal "something else", response.body - assert !assigns["ran_action"] - end - - def test_filters_with_mixed_specialization_run_in_order - assert_nothing_raised do - response = test_process(MixedSpecializationController, 'bar') - assert_equal 'bar', response.body - end - - assert_nothing_raised do - response = test_process(MixedSpecializationController, 'foo') - assert_equal 'foo', response.body - end - end - - def test_dynamic_dispatch - %w(foo bar baz).each do |action| - request = ActionController::TestRequest.new - request.query_parameters[:choose] = action - response = DynamicDispatchController.action(action).call(request.env).last - assert_equal action, response.body - end - end - - def test_running_prepended_before_and_after_filter - test_process(PrependingBeforeAndAfterController) - assert_equal %w( before_all between_before_all_and_after_all after_all ), assigns["ran_filter"] - end - - def test_skipping_and_limiting_controller - test_process(SkippingAndLimitedController, "index") - assert_equal %w( ensure_login ), assigns["ran_filter"] - test_process(SkippingAndLimitedController, "public") - assert_nil assigns["ran_filter"] - end - - def test_skipping_and_reordering_controller - test_process(SkippingAndReorderingController, "index") - assert_equal %w( find_record ensure_login ), assigns["ran_filter"] - end - - def test_conditional_skipping_of_filters - test_process(ConditionalSkippingController, "login") - assert_nil assigns["ran_filter"] - test_process(ConditionalSkippingController, "change_password") - assert_equal %w( ensure_login find_user ), assigns["ran_filter"] - - test_process(ConditionalSkippingController, "login") - assert_nil @controller.instance_variable_get("@ran_after_filter") - test_process(ConditionalSkippingController, "change_password") - assert_equal %w( clean_up ), @controller.instance_variable_get("@ran_after_filter") - end - - def test_conditional_skipping_of_filters_when_parent_filter_is_also_conditional - test_process(ChildOfConditionalParentController) - assert_equal %w( conditional_in_parent_before conditional_in_parent_after ), assigns['ran_filter'] - test_process(ChildOfConditionalParentController, 'another_action') - assert_nil assigns['ran_filter'] - end - - def test_condition_skipping_of_filters_when_siblings_also_have_conditions - test_process(ChildOfConditionalParentController) - assert_equal %w( conditional_in_parent_before conditional_in_parent_after ), assigns['ran_filter'] - test_process(AnotherChildOfConditionalParentController) - assert_equal %w( conditional_in_parent_after ), assigns['ran_filter'] - test_process(ChildOfConditionalParentController) - assert_equal %w( conditional_in_parent_before conditional_in_parent_after ), assigns['ran_filter'] - end - - def test_changing_the_requirements - test_process(ChangingTheRequirementsController, "go_wild") - assert_nil assigns['ran_filter'] - end - - def test_a_rescuing_around_filter - response = nil - assert_nothing_raised do - response = test_process(RescuedController) - end - - assert response.success? - assert_equal("I rescued this: #", response.body) - end - - private - def test_process(controller, action = "show") - @controller = controller.is_a?(Class) ? controller.new : controller - @request = ActionController::TestRequest.new - @response = ActionController::TestResponse.new - - process(action) - end -end - - - -class PostsController < ActionController::Base - def rescue_action(e); raise e; end - - module AroundExceptions - class Error < StandardError ; end - class Before < Error ; end - class After < Error ; end - end - include AroundExceptions - - class DefaultFilter - include AroundExceptions - end - - module_eval %w(raises_before raises_after raises_both no_raise no_filter).map { |action| "def #{action}; default_action end" }.join("\n") - - private - def default_action - render :inline => "#{action_name} called" - end -end - -class ControllerWithSymbolAsFilter < PostsController - around_filter :raise_before, :only => :raises_before - around_filter :raise_after, :only => :raises_after - around_filter :without_exception, :only => :no_raise - - private - def raise_before - raise Before - yield - end - - def raise_after - yield - raise After - end - - def without_exception - # Do stuff... - 1 + 1 - - yield - - # Do stuff... - 1 + 1 - end -end - -class ControllerWithFilterClass < PostsController - class YieldingFilter < DefaultFilter - def self.filter(controller) - yield - raise After - end - end - - around_filter YieldingFilter, :only => :raises_after -end - -class ControllerWithFilterInstance < PostsController - class YieldingFilter < DefaultFilter - def filter(controller) - yield - raise After - end - end - - around_filter YieldingFilter.new, :only => :raises_after -end - -class ControllerWithFilterMethod < PostsController - class YieldingFilter < DefaultFilter - def filter(controller) - yield - raise After - end - end - - around_filter YieldingFilter.new.method(:filter), :only => :raises_after -end - -class ControllerWithProcFilter < PostsController - around_filter(:only => :no_raise) do |c,b| - c.instance_variable_set(:"@before", true) - b.call - c.instance_variable_set(:"@after", true) - end -end - -class ControllerWithNestedFilters < ControllerWithSymbolAsFilter - around_filter :raise_before, :raise_after, :without_exception, :only => :raises_both -end - -class ControllerWithAllTypesOfFilters < PostsController - before_filter :before - around_filter :around - after_filter :after - around_filter :around_again - - private - def before - @ran_filter ||= [] - @ran_filter << 'before' - end - - def around - @ran_filter << 'around (before yield)' - yield - @ran_filter << 'around (after yield)' - end - - def after - @ran_filter << 'after' - end - - def around_again - @ran_filter << 'around_again (before yield)' - yield - @ran_filter << 'around_again (after yield)' - end -end - -class ControllerWithTwoLessFilters < ControllerWithAllTypesOfFilters - $vbf = true - skip_filter :around_again - $vbf = false - skip_filter :after -end - -class YieldingAroundFiltersTest < ActionController::TestCase - include PostsController::AroundExceptions - - def test_base - controller = PostsController - assert_nothing_raised { test_process(controller,'no_raise') } - assert_nothing_raised { test_process(controller,'raises_before') } - assert_nothing_raised { test_process(controller,'raises_after') } - assert_nothing_raised { test_process(controller,'no_filter') } - end - - def test_with_symbol - controller = ControllerWithSymbolAsFilter - assert_nothing_raised { test_process(controller,'no_raise') } - assert_raise(Before) { test_process(controller,'raises_before') } - assert_raise(After) { test_process(controller,'raises_after') } - assert_nothing_raised { test_process(controller,'no_raise') } - end - - def test_with_class - controller = ControllerWithFilterClass - assert_nothing_raised { test_process(controller,'no_raise') } - assert_raise(After) { test_process(controller,'raises_after') } - end - - def test_with_instance - controller = ControllerWithFilterInstance - assert_nothing_raised { test_process(controller,'no_raise') } - assert_raise(After) { test_process(controller,'raises_after') } - end - - def test_with_proc - test_process(ControllerWithProcFilter,'no_raise') - assert assigns['before'] - assert assigns['after'] - end - - def test_nested_filters - controller = ControllerWithNestedFilters - assert_nothing_raised do - begin - test_process(controller,'raises_both') - rescue Before, After - end - end - assert_raise Before do - begin - test_process(controller,'raises_both') - rescue After - end - end - end - - def test_filter_order_with_all_filter_types - test_process(ControllerWithAllTypesOfFilters,'no_raise') - assert_equal 'before around (before yield) around_again (before yield) around_again (after yield) after around (after yield)', assigns['ran_filter'].join(' ') - end - - def test_filter_order_with_skip_filter_method - test_process(ControllerWithTwoLessFilters,'no_raise') - assert_equal 'before around (before yield) around (after yield)', assigns['ran_filter'].join(' ') - end - - def test_first_filter_in_multiple_before_filter_chain_halts - controller = ::FilterTest::TestMultipleFiltersController.new - response = test_process(controller, 'fail_1') - assert_equal ' ', response.body - assert_equal 1, controller.instance_variable_get(:@try) - end - - def test_second_filter_in_multiple_before_filter_chain_halts - controller = ::FilterTest::TestMultipleFiltersController.new - response = test_process(controller, 'fail_2') - assert_equal ' ', response.body - assert_equal 2, controller.instance_variable_get(:@try) - end - - def test_last_filter_in_multiple_before_filter_chain_halts - controller = ::FilterTest::TestMultipleFiltersController.new - response = test_process(controller, 'fail_3') - assert_equal ' ', response.body - assert_equal 3, controller.instance_variable_get(:@try) - end - - protected - def test_process(controller, action = "show") - @controller = controller.is_a?(Class) ? controller.new : controller - process(action) - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/flash_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/flash_test.rb deleted file mode 100644 index feeb6d9a1..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/flash_test.rb +++ /dev/null @@ -1,271 +0,0 @@ -require 'abstract_unit' - -class FlashTest < ActionController::TestCase - class TestController < ActionController::Base - def set_flash - flash["that"] = "hello" - render :inline => "hello" - end - - def set_flash_now - flash.now["that"] = "hello" - flash.now["foo"] ||= "bar" - flash.now["foo"] ||= "err" - @flashy = flash.now["that"] - @flash_copy = {}.update flash - render :inline => "hello" - end - - def attempt_to_use_flash_now - @flash_copy = {}.update flash - @flashy = flash["that"] - render :inline => "hello" - end - - def use_flash - @flash_copy = {}.update flash - @flashy = flash["that"] - render :inline => "hello" - end - - def use_flash_and_keep_it - @flash_copy = {}.update flash - @flashy = flash["that"] - flash.keep - render :inline => "hello" - end - - def use_flash_and_update_it - flash.update("this" => "hello again") - @flash_copy = {}.update flash - render :inline => "hello" - end - - def use_flash_after_reset_session - flash["that"] = "hello" - @flashy_that = flash["that"] - reset_session - @flashy_that_reset = flash["that"] - flash["this"] = "good-bye" - @flashy_this = flash["this"] - render :inline => "hello" - end - - def rescue_action(e) - raise unless ActionView::MissingTemplate === e - end - - # methods for test_sweep_after_halted_filter_chain - before_filter :halt_and_redir, :only => "filter_halting_action" - - def std_action - @flash_copy = {}.update(flash) - render :nothing => true - end - - def filter_halting_action - @flash_copy = {}.update(flash) - end - - def halt_and_redir - flash["foo"] = "bar" - redirect_to :action => "std_action" - @flash_copy = {}.update(flash) - end - - def redirect_with_alert - redirect_to '/nowhere', :alert => "Beware the nowheres!" - end - - def redirect_with_notice - redirect_to '/somewhere', :notice => "Good luck in the somewheres!" - end - - def render_with_flash_now_alert - flash.now.alert = "Beware the nowheres now!" - render :inline => "hello" - end - - def render_with_flash_now_notice - flash.now.notice = "Good luck in the somewheres now!" - render :inline => "hello" - end - - def redirect_with_other_flashes - redirect_to '/wonderland', :flash => { :joyride => "Horses!" } - end - end - - tests TestController - - def test_flash - get :set_flash - - get :use_flash - assert_equal "hello", assigns["flash_copy"]["that"] - assert_equal "hello", assigns["flashy"] - - get :use_flash - assert_nil assigns["flash_copy"]["that"], "On second flash" - end - - def test_keep_flash - get :set_flash - - get :use_flash_and_keep_it - assert_equal "hello", assigns["flash_copy"]["that"] - assert_equal "hello", assigns["flashy"] - - get :use_flash - assert_equal "hello", assigns["flash_copy"]["that"], "On second flash" - - get :use_flash - assert_nil assigns["flash_copy"]["that"], "On third flash" - end - - def test_flash_now - get :set_flash_now - assert_equal "hello", assigns["flash_copy"]["that"] - assert_equal "bar" , assigns["flash_copy"]["foo"] - assert_equal "hello", assigns["flashy"] - - get :attempt_to_use_flash_now - assert_nil assigns["flash_copy"]["that"] - assert_nil assigns["flash_copy"]["foo"] - assert_nil assigns["flashy"] - end - - def test_update_flash - get :set_flash - get :use_flash_and_update_it - assert_equal "hello", assigns["flash_copy"]["that"] - assert_equal "hello again", assigns["flash_copy"]["this"] - get :use_flash - assert_nil assigns["flash_copy"]["that"], "On second flash" - assert_equal "hello again", assigns["flash_copy"]["this"], "On second flash" - end - - def test_flash_after_reset_session - get :use_flash_after_reset_session - assert_equal "hello", assigns["flashy_that"] - assert_equal "good-bye", assigns["flashy_this"] - assert_nil assigns["flashy_that_reset"] - end - - def test_does_not_set_the_session_if_the_flash_is_empty - get :std_action - assert_nil session["flash"] - end - - def test_sweep_after_halted_filter_chain - get :std_action - assert_nil assigns["flash_copy"]["foo"] - get :filter_halting_action - assert_equal "bar", assigns["flash_copy"]["foo"] - get :std_action # follow redirection - assert_equal "bar", assigns["flash_copy"]["foo"] - get :std_action - assert_nil assigns["flash_copy"]["foo"] - end - - def test_keep_and_discard_return_values - flash = ActionDispatch::Flash::FlashHash.new - flash.update(:foo => :foo_indeed, :bar => :bar_indeed) - - assert_equal(:foo_indeed, flash.discard(:foo)) # valid key passed - assert_nil flash.discard(:unknown) # non existant key passed - assert_equal({:foo => :foo_indeed, :bar => :bar_indeed}, flash.discard()) # nothing passed - assert_equal({:foo => :foo_indeed, :bar => :bar_indeed}, flash.discard(nil)) # nothing passed - - assert_equal(:foo_indeed, flash.keep(:foo)) # valid key passed - assert_nil flash.keep(:unknown) # non existant key passed - assert_equal({:foo => :foo_indeed, :bar => :bar_indeed}, flash.keep()) # nothing passed - assert_equal({:foo => :foo_indeed, :bar => :bar_indeed}, flash.keep(nil)) # nothing passed - end - - def test_redirect_to_with_alert - get :redirect_with_alert - assert_equal "Beware the nowheres!", @controller.send(:flash)[:alert] - end - - def test_redirect_to_with_notice - get :redirect_with_notice - assert_equal "Good luck in the somewheres!", @controller.send(:flash)[:notice] - end - - def test_render_with_flash_now_alert - get :render_with_flash_now_alert - assert_equal "Beware the nowheres now!", @controller.send(:flash)[:alert] - end - - def test_render_with_flash_now_notice - get :render_with_flash_now_notice - assert_equal "Good luck in the somewheres now!", @controller.send(:flash)[:notice] - end - - def test_redirect_to_with_other_flashes - get :redirect_with_other_flashes - assert_equal "Horses!", @controller.send(:flash)[:joyride] - end -end - -class FlashIntegrationTest < ActionController::IntegrationTest - SessionKey = '_myapp_session' - SessionSecret = 'b3c631c314c0bbca50c1b2843150fe33' - - class TestController < ActionController::Base - def set_flash - flash["that"] = "hello" - head :ok - end - - def use_flash - render :inline => "flash: #{flash["that"]}" - end - end - - def test_flash - with_test_route_set do - get '/set_flash' - assert_response :success - assert_equal "hello", @request.flash["that"] - - get '/use_flash' - assert_response :success - assert_equal "flash: hello", @response.body - end - end - - def test_just_using_flash_does_not_stream_a_cookie_back - with_test_route_set do - get '/use_flash' - assert_response :success - assert_nil @response.headers["Set-Cookie"] - assert_equal "flash: ", @response.body - end - end - - private - - # Overwrite get to send SessionSecret in env hash - def get(path, parameters = nil, env = {}) - env["action_dispatch.secret_token"] ||= SessionSecret - super - end - - def with_test_route_set - with_routing do |set| - set.draw do |map| - match ':action', :to => FlashIntegrationTest::TestController - end - - @app = self.class.build_app(set) do |middleware| - middleware.use ActionDispatch::Session::CookieStore, :key => SessionKey - middleware.use ActionDispatch::Flash - middleware.delete "ActionDispatch::ShowExceptions" - end - - yield - end - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/helper_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/helper_test.rb deleted file mode 100644 index 4642ce220..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/helper_test.rb +++ /dev/null @@ -1,258 +0,0 @@ -require 'abstract_unit' -require 'active_support/core_ext/kernel/reporting' - -ActionController::Base.helpers_path = File.expand_path('../../fixtures/helpers', __FILE__) - -module Fun - class GamesController < ActionController::Base - def render_hello_world - render :inline => "hello: <%= stratego %>" - end - - def rescue_action(e) raise end - end - - class PdfController < ActionController::Base - def test - render :inline => "test: <%= foobar %>" - end - - def rescue_action(e) raise end - end -end - -class AllHelpersController < ActionController::Base - helper :all -end - -module ImpressiveLibrary - extend ActiveSupport::Concern - included do - helper_method :useful_function - end - - def useful_function() end -end - -ActionController::Base.send :include, ImpressiveLibrary - -class JustMeController < ActionController::Base - clear_helpers - - def flash - render :inline => "

<%= notice %>

" - end - - def lib - render :inline => '<%= useful_function %>' - end -end - -class MeTooController < JustMeController -end - -module LocalAbcHelper - def a() end - def b() end - def c() end -end - -class HelperTest < ActiveSupport::TestCase - class TestController < ActionController::Base - attr_accessor :delegate_attr - def delegate_method() end - def rescue_action(e) raise end - end - - def setup - # Increment symbol counter. - @symbol = (@@counter ||= 'A0').succ!.dup - - # Generate new controller class. - controller_class_name = "Helper#{@symbol}Controller" - eval("class #{controller_class_name} < TestController; end") - @controller_class = self.class.const_get(controller_class_name) - - # Set default test helper. - self.test_helper = LocalAbcHelper - end - - def test_deprecated_helper - assert_equal expected_helper_methods, missing_methods - assert_nothing_raised { @controller_class.helper TestHelper } - assert_equal [], missing_methods - end - - def test_helper_method - assert_nothing_raised { @controller_class.helper_method :delegate_method } - assert master_helper_methods.include?('delegate_method') - end - - def test_helper_attr - assert_nothing_raised { @controller_class.helper_attr :delegate_attr } - assert master_helper_methods.include?('delegate_attr') - assert master_helper_methods.include?('delegate_attr=') - end - - def call_controller(klass, action) - request = ActionController::TestRequest.new - klass.action(action).call(request.env) - end - - def test_helper_for_nested_controller - assert_equal 'hello: Iz guuut!', - call_controller(Fun::GamesController, "render_hello_world").last.body - # request = ActionController::TestRequest.new - # - # resp = Fun::GamesController.action(:render_hello_world).call(request.env) - # assert_equal 'hello: Iz guuut!', resp.last.body - end - - def test_helper_for_acronym_controller - assert_equal "test: baz", call_controller(Fun::PdfController, "test").last.body - # - # request = ActionController::TestRequest.new - # response = ActionController::TestResponse.new - # request.action = 'test' - # - # assert_equal 'test: baz', Fun::PdfController.process(request, response).body - end - - def test_default_helpers_only - assert_equal [JustMeHelper], JustMeController._helpers.ancestors.reject(&:anonymous?) - assert_equal [MeTooHelper, JustMeHelper], MeTooController._helpers.ancestors.reject(&:anonymous?) - end - - def test_base_helper_methods_after_clear_helpers - assert_nothing_raised do - call_controller(JustMeController, "flash") - end - end - - def test_lib_helper_methods_after_clear_helpers - assert_nothing_raised do - call_controller(JustMeController, "lib") - end - end - - def test_all_helpers - methods = AllHelpersController._helpers.instance_methods.map {|m| m.to_s} - - # abc_helper.rb - assert methods.include?('bare_a') - - # fun/games_helper.rb - assert methods.include?('stratego') - - # fun/pdf_helper.rb - assert methods.include?('foobar') - end - - def test_all_helpers_with_alternate_helper_dir - @controller_class.helpers_path = File.expand_path('../../fixtures/alternate_helpers', __FILE__) - - # Reload helpers - @controller_class._helpers = Module.new - @controller_class.helper :all - - # helpers/abc_helper.rb should not be included - assert !master_helper_methods.include?('bare_a') - - # alternate_helpers/foo_helper.rb - assert master_helper_methods.include?('baz') - end - - def test_helper_proxy - methods = AllHelpersController.helpers.methods.map(&:to_s) - - # Action View - assert methods.include?('pluralize') - - # abc_helper.rb - assert methods.include?('bare_a') - - # fun/games_helper.rb - assert methods.include?('stratego') - - # fun/pdf_helper.rb - assert methods.include?('foobar') - end - - def test_deprecation - assert_deprecated do - ActionController::Base.helpers_dir = "some/foo/bar" - end - assert_deprecated do - assert_equal ["some/foo/bar"], ActionController::Base.helpers_dir - end - ensure - ActionController::Base.helpers_path = File.expand_path('../../fixtures/helpers', __FILE__) - end - - private - def expected_helper_methods - TestHelper.instance_methods.map {|m| m.to_s } - end - - def master_helper_methods - @controller_class._helpers.instance_methods.map {|m| m.to_s } - end - - def missing_methods - expected_helper_methods - master_helper_methods - end - - def test_helper=(helper_module) - silence_warnings { self.class.const_set('TestHelper', helper_module) } - end -end - - -class IsolatedHelpersTest < ActiveSupport::TestCase - class A < ActionController::Base - def index - render :inline => '<%= shout %>' - end - - def rescue_action(e) raise end - end - - class B < A - helper { def shout; 'B' end } - - def index - render :inline => '<%= shout %>' - end - end - - class C < A - helper { def shout; 'C' end } - - def index - render :inline => '<%= shout %>' - end - end - - def call_controller(klass, action) - request = ActionController::TestRequest.new - klass.action(action).call(request.env) - end - - def setup - @request = ActionController::TestRequest.new - @response = ActionController::TestResponse.new - @request.action = 'index' - end - - def test_helper_in_a - assert_raise(ActionView::Template::Error) { call_controller(A, "index") } - end - - def test_helper_in_b - assert_equal 'B', call_controller(B, "index").last.body - end - - def test_helper_in_c - assert_equal 'C', call_controller(C, "index").last.body - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/http_basic_authentication_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/http_basic_authentication_test.rb deleted file mode 100644 index 4bf865363..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/http_basic_authentication_test.rb +++ /dev/null @@ -1,113 +0,0 @@ -require 'abstract_unit' - -class HttpBasicAuthenticationTest < ActionController::TestCase - class DummyController < ActionController::Base - before_filter :authenticate, :only => :index - before_filter :authenticate_with_request, :only => :display - before_filter :authenticate_long_credentials, :only => :show - - def index - render :text => "Hello Secret" - end - - def display - render :text => 'Definitely Maybe' - end - - def show - render :text => 'Only for loooooong credentials' - end - - private - - def authenticate - authenticate_or_request_with_http_basic do |username, password| - username == 'lifo' && password == 'world' - end - end - - def authenticate_with_request - if authenticate_with_http_basic { |username, password| username == 'pretty' && password == 'please' } - @logged_in = true - else - request_http_basic_authentication("SuperSecret") - end - end - - def authenticate_long_credentials - authenticate_or_request_with_http_basic do |username, password| - username == '1234567890123456789012345678901234567890' && password == '1234567890123456789012345678901234567890' - end - end - end - - AUTH_HEADERS = ['HTTP_AUTHORIZATION', 'X-HTTP_AUTHORIZATION', 'X_HTTP_AUTHORIZATION', 'REDIRECT_X_HTTP_AUTHORIZATION'] - - tests DummyController - - AUTH_HEADERS.each do |header| - test "successful authentication with #{header.downcase}" do - @request.env[header] = encode_credentials('lifo', 'world') - get :index - - assert_response :success - assert_equal 'Hello Secret', @response.body, "Authentication failed for request header #{header}" - end - test "successful authentication with #{header.downcase} and long credentials" do - @request.env[header] = encode_credentials('1234567890123456789012345678901234567890', '1234567890123456789012345678901234567890') - get :show - - assert_response :success - assert_equal 'Only for loooooong credentials', @response.body, "Authentication failed for request header #{header} and long credentials" - end - end - - AUTH_HEADERS.each do |header| - test "unsuccessful authentication with #{header.downcase}" do - @request.env[header] = encode_credentials('h4x0r', 'world') - get :index - - assert_response :unauthorized - assert_equal "HTTP Basic: Access denied.\n", @response.body, "Authentication didn't fail for request header #{header}" - end - test "unsuccessful authentication with #{header.downcase} and long credentials" do - @request.env[header] = encode_credentials('h4x0rh4x0rh4x0rh4x0rh4x0rh4x0rh4x0rh4x0r', 'worldworldworldworldworldworldworldworld') - get :show - - assert_response :unauthorized - assert_equal "HTTP Basic: Access denied.\n", @response.body, "Authentication didn't fail for request header #{header} and long credentials" - end - end - - test "authentication request without credential" do - get :display - - assert_response :unauthorized - assert_equal "HTTP Basic: Access denied.\n", @response.body - assert_equal 'Basic realm="SuperSecret"', @response.headers['WWW-Authenticate'] - end - - test "authentication request with invalid credential" do - @request.env['HTTP_AUTHORIZATION'] = encode_credentials('pretty', 'foo') - get :display - - assert_response :unauthorized - assert_equal "HTTP Basic: Access denied.\n", @response.body - assert_equal 'Basic realm="SuperSecret"', @response.headers['WWW-Authenticate'] - end - - test "authentication request with valid credential" do - @request.env['HTTP_AUTHORIZATION'] = encode_credentials('pretty', 'please') - get :display - - assert_response :success - assert assigns(:logged_in) - assert_equal 'Definitely Maybe', @response.body - end - - private - - def encode_credentials(username, password) - "Basic #{ActiveSupport::Base64.encode64("#{username}:#{password}")}" - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/http_digest_authentication_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/http_digest_authentication_test.rb deleted file mode 100644 index e8c07d60e..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/http_digest_authentication_test.rb +++ /dev/null @@ -1,238 +0,0 @@ -require 'abstract_unit' - -class HttpDigestAuthenticationTest < ActionController::TestCase - class DummyDigestController < ActionController::Base - before_filter :authenticate, :only => :index - before_filter :authenticate_with_request, :only => :display - - USERS = { 'lifo' => 'world', 'pretty' => 'please', - 'dhh' => ::Digest::MD5::hexdigest(["dhh","SuperSecret","secret"].join(":"))} - - def index - render :text => "Hello Secret" - end - - def display - render :text => 'Definitely Maybe' - end - - private - - def authenticate - authenticate_or_request_with_http_digest("SuperSecret") do |username| - # Return the password - USERS[username] - end - end - - def authenticate_with_request - if authenticate_with_http_digest("SuperSecret") { |username| USERS[username] } - @logged_in = true - else - request_http_digest_authentication("SuperSecret", "Authentication Failed") - end - end - end - - AUTH_HEADERS = ['HTTP_AUTHORIZATION', 'X-HTTP_AUTHORIZATION', 'X_HTTP_AUTHORIZATION', 'REDIRECT_X_HTTP_AUTHORIZATION'] - - tests DummyDigestController - - setup do - # Used as secret in generating nonce to prevent tampering of timestamp - @secret = "session_options_secret" - @request.env["action_dispatch.secret_token"] = @secret - end - - teardown do - # ActionController::Base.session_options[:secret] = @old_secret - end - - AUTH_HEADERS.each do |header| - test "successful authentication with #{header.downcase}" do - @request.env[header] = encode_credentials(:username => 'lifo', :password => 'world') - get :index - - assert_response :success - assert_equal 'Hello Secret', @response.body, "Authentication failed for request header #{header}" - end - end - - AUTH_HEADERS.each do |header| - test "unsuccessful authentication with #{header.downcase}" do - @request.env[header] = encode_credentials(:username => 'h4x0r', :password => 'world') - get :index - - assert_response :unauthorized - assert_equal "HTTP Digest: Access denied.\n", @response.body, "Authentication didn't fail for request header #{header}" - end - end - - test "authentication request without credential" do - get :display - - assert_response :unauthorized - assert_equal "Authentication Failed", @response.body - credentials = decode_credentials(@response.headers['WWW-Authenticate']) - assert_equal 'SuperSecret', credentials[:realm] - end - - test "authentication request with nil credentials" do - @request.env['HTTP_AUTHORIZATION'] = encode_credentials(:username => nil, :password => nil) - get :index - - assert_response :unauthorized - assert_equal "HTTP Digest: Access denied.\n", @response.body, "Authentication didn't fail for request" - assert_not_equal 'Hello Secret', @response.body, "Authentication didn't fail for request" - end - - test "authentication request with invalid password" do - @request.env['HTTP_AUTHORIZATION'] = encode_credentials(:username => 'pretty', :password => 'foo') - get :display - - assert_response :unauthorized - assert_equal "Authentication Failed", @response.body - end - - test "authentication request with invalid nonce" do - @request.env['HTTP_AUTHORIZATION'] = encode_credentials(:username => 'pretty', :password => 'please', :nonce => "xxyyzz") - get :display - - assert_response :unauthorized - assert_equal "Authentication Failed", @response.body - end - - test "authentication request with invalid opaque" do - @request.env['HTTP_AUTHORIZATION'] = encode_credentials(:username => 'pretty', :password => 'foo', :opaque => "xxyyzz") - get :display - - assert_response :unauthorized - assert_equal "Authentication Failed", @response.body - end - - test "authentication request with invalid realm" do - @request.env['HTTP_AUTHORIZATION'] = encode_credentials(:username => 'pretty', :password => 'foo', :realm => "NotSecret") - get :display - - assert_response :unauthorized - assert_equal "Authentication Failed", @response.body - end - - test "authentication request with valid credential" do - @request.env['HTTP_AUTHORIZATION'] = encode_credentials(:username => 'pretty', :password => 'please') - get :display - - assert_response :success - assert assigns(:logged_in) - assert_equal 'Definitely Maybe', @response.body - end - - test "authentication request with valid credential and nil session" do - @request.env['HTTP_AUTHORIZATION'] = encode_credentials(:username => 'pretty', :password => 'please') - - get :display - - assert_response :success - assert assigns(:logged_in) - assert_equal 'Definitely Maybe', @response.body - end - - test "authentication request with request-uri that doesn't match credentials digest-uri" do - @request.env['HTTP_AUTHORIZATION'] = encode_credentials(:username => 'pretty', :password => 'please') - @request.env['PATH_INFO'] = "/http_digest_authentication_test/dummy_digest/altered/uri" - get :display - - assert_response :unauthorized - assert_equal "Authentication Failed", @response.body - end - - test "authentication request with absolute request uri (as in webrick)" do - @request.env['HTTP_AUTHORIZATION'] = encode_credentials(:username => 'pretty', :password => 'please') - @request.env["SERVER_NAME"] = "test.host" - @request.env['PATH_INFO'] = "/http_digest_authentication_test/dummy_digest" - - get :display - - assert_response :success - assert assigns(:logged_in) - assert_equal 'Definitely Maybe', @response.body - end - - test "authentication request with absolute uri in credentials (as in IE)" do - @request.env['HTTP_AUTHORIZATION'] = encode_credentials(:url => "http://test.host/http_digest_authentication_test/dummy_digest", - :username => 'pretty', :password => 'please') - - get :display - - assert_response :success - assert assigns(:logged_in) - assert_equal 'Definitely Maybe', @response.body - end - - test "authentication request with absolute uri in both request and credentials (as in Webrick with IE)" do - @request.env['HTTP_AUTHORIZATION'] = encode_credentials(:url => "http://test.host/http_digest_authentication_test/dummy_digest", - :username => 'pretty', :password => 'please') - @request.env['SERVER_NAME'] = "test.host" - @request.env['PATH_INFO'] = "/http_digest_authentication_test/dummy_digest" - - get :display - - assert_response :success - assert assigns(:logged_in) - assert_equal 'Definitely Maybe', @response.body - end - - test "authentication request with password stored as ha1 digest hash" do - @request.env['HTTP_AUTHORIZATION'] = encode_credentials(:username => 'dhh', - :password => ::Digest::MD5::hexdigest(["dhh","SuperSecret","secret"].join(":")), - :password_is_ha1 => true) - get :display - - assert_response :success - assert assigns(:logged_in) - assert_equal 'Definitely Maybe', @response.body - end - - test "authentication request with _method" do - @request.env['HTTP_AUTHORIZATION'] = encode_credentials(:username => 'pretty', :password => 'please', :method => :post) - @request.env['rack.methodoverride.original_method'] = 'POST' - put :display - - assert_response :success - assert assigns(:logged_in) - assert_equal 'Definitely Maybe', @response.body - end - - test "validate_digest_response should fail with nil returning password_procedure" do - @request.env['HTTP_AUTHORIZATION'] = encode_credentials(:username => nil, :password => nil) - assert !ActionController::HttpAuthentication::Digest.validate_digest_response(@request, "SuperSecret"){nil} - end - - private - - def encode_credentials(options) - options.reverse_merge!(:nc => "00000001", :cnonce => "0a4f113b", :password_is_ha1 => false) - password = options.delete(:password) - - # Perform unauthenticated request to retrieve digest parameters to use on subsequent request - method = options.delete(:method) || 'GET' - - case method.to_s.upcase - when 'GET' - get :index - when 'POST' - post :index - end - - assert_response :unauthorized - - credentials = decode_credentials(@response.headers['WWW-Authenticate']) - credentials.merge!(options) - credentials.merge!(:uri => @request.env['PATH_INFO'].to_s) - ActionController::HttpAuthentication::Digest.encode_credentials(method, credentials, password, options[:password_is_ha1]) - end - - def decode_credentials(header) - ActionController::HttpAuthentication::Digest.decode_credentials(@response.headers['WWW-Authenticate']) - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/http_token_authentication_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/http_token_authentication_test.rb deleted file mode 100644 index af6ecea6a..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/http_token_authentication_test.rb +++ /dev/null @@ -1,113 +0,0 @@ -require 'abstract_unit' - -class HttpTokenAuthenticationTest < ActionController::TestCase - class DummyController < ActionController::Base - before_filter :authenticate, :only => :index - before_filter :authenticate_with_request, :only => :display - before_filter :authenticate_long_credentials, :only => :show - - def index - render :text => "Hello Secret" - end - - def display - render :text => 'Definitely Maybe' - end - - def show - render :text => 'Only for loooooong credentials' - end - - private - - def authenticate - authenticate_or_request_with_http_token do |token, options| - token == 'lifo' - end - end - - def authenticate_with_request - if authenticate_with_http_token { |token, options| token == '"quote" pretty' && options[:algorithm] == 'test' } - @logged_in = true - else - request_http_token_authentication("SuperSecret") - end - end - - def authenticate_long_credentials - authenticate_or_request_with_http_token do |token, options| - token == '1234567890123456789012345678901234567890' && options[:algorithm] == 'test' - end - end - end - - AUTH_HEADERS = ['HTTP_AUTHORIZATION', 'X-HTTP_AUTHORIZATION', 'X_HTTP_AUTHORIZATION', 'REDIRECT_X_HTTP_AUTHORIZATION'] - - tests DummyController - - AUTH_HEADERS.each do |header| - test "successful authentication with #{header.downcase}" do - @request.env[header] = encode_credentials('lifo') - get :index - - assert_response :success - assert_equal 'Hello Secret', @response.body, "Authentication failed for request header #{header}" - end - test "successful authentication with #{header.downcase} and long credentials" do - @request.env[header] = encode_credentials('1234567890123456789012345678901234567890', :algorithm => 'test') - get :show - - assert_response :success - assert_equal 'Only for loooooong credentials', @response.body, "Authentication failed for request header #{header} and long credentials" - end - end - - AUTH_HEADERS.each do |header| - test "unsuccessful authentication with #{header.downcase}" do - @request.env[header] = encode_credentials('h4x0r') - get :index - - assert_response :unauthorized - assert_equal "HTTP Token: Access denied.\n", @response.body, "Authentication didn't fail for request header #{header}" - end - test "unsuccessful authentication with #{header.downcase} and long credentials" do - @request.env[header] = encode_credentials('h4x0rh4x0rh4x0rh4x0rh4x0rh4x0rh4x0rh4x0r') - get :show - - assert_response :unauthorized - assert_equal "HTTP Token: Access denied.\n", @response.body, "Authentication didn't fail for request header #{header} and long credentials" - end - end - - test "authentication request without credential" do - get :display - - assert_response :unauthorized - assert_equal "HTTP Token: Access denied.\n", @response.body - assert_equal 'Token realm="SuperSecret"', @response.headers['WWW-Authenticate'] - end - - test "authentication request with invalid credential" do - @request.env['HTTP_AUTHORIZATION'] = encode_credentials('"quote" pretty') - get :display - - assert_response :unauthorized - assert_equal "HTTP Token: Access denied.\n", @response.body - assert_equal 'Token realm="SuperSecret"', @response.headers['WWW-Authenticate'] - end - - test "authentication request with valid credential" do - @request.env['HTTP_AUTHORIZATION'] = encode_credentials('"quote" pretty', :algorithm => 'test') - get :display - - assert_response :success - assert assigns(:logged_in) - assert_equal 'Definitely Maybe', @response.body - end - - private - - def encode_credentials(token, options = {}) - ActionController::HttpAuthentication::Token.encode_credentials(token, options) - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/integration_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/integration_test.rb deleted file mode 100644 index 46d53b772..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/integration_test.rb +++ /dev/null @@ -1,524 +0,0 @@ -require 'abstract_unit' -require 'controller/fake_controllers' -require 'action_controller/vendor/html-scanner' - -class SessionTest < Test::Unit::TestCase - StubApp = lambda { |env| - [200, {"Content-Type" => "text/html", "Content-Length" => "13"}, ["Hello, World!"]] - } - - def setup - @session = ActionController::Integration::Session.new(StubApp) - end - - def test_https_bang_works_and_sets_truth_by_default - assert !@session.https? - @session.https! - assert @session.https? - @session.https! false - assert !@session.https? - end - - def test_host! - assert_not_equal "glu.ttono.us", @session.host - @session.host! "rubyonrails.com" - assert_equal "rubyonrails.com", @session.host - end - - def test_follow_redirect_raises_when_no_redirect - @session.stubs(:redirect?).returns(false) - assert_raise(RuntimeError) { @session.follow_redirect! } - end - - def test_request_via_redirect_uses_given_method - path = "/somepath"; args = {:id => '1'}; headers = {"X-Test-Header" => "testvalue"} - @session.expects(:process).with(:put, path, args, headers) - @session.stubs(:redirect?).returns(false) - @session.request_via_redirect(:put, path, args, headers) - end - - def test_request_via_redirect_follows_redirects - path = "/somepath"; args = {:id => '1'}; headers = {"X-Test-Header" => "testvalue"} - @session.stubs(:redirect?).returns(true, true, false) - @session.expects(:follow_redirect!).times(2) - @session.request_via_redirect(:get, path, args, headers) - end - - def test_request_via_redirect_returns_status - path = "/somepath"; args = {:id => '1'}; headers = {"X-Test-Header" => "testvalue"} - @session.stubs(:redirect?).returns(false) - @session.stubs(:status).returns(200) - assert_equal 200, @session.request_via_redirect(:get, path, args, headers) - end - - def test_get_via_redirect - path = "/somepath"; args = {:id => '1'}; headers = {"X-Test-Header" => "testvalue" } - @session.expects(:request_via_redirect).with(:get, path, args, headers) - @session.get_via_redirect(path, args, headers) - end - - def test_post_via_redirect - path = "/somepath"; args = {:id => '1'}; headers = {"X-Test-Header" => "testvalue" } - @session.expects(:request_via_redirect).with(:post, path, args, headers) - @session.post_via_redirect(path, args, headers) - end - - def test_put_via_redirect - path = "/somepath"; args = {:id => '1'}; headers = {"X-Test-Header" => "testvalue" } - @session.expects(:request_via_redirect).with(:put, path, args, headers) - @session.put_via_redirect(path, args, headers) - end - - def test_delete_via_redirect - path = "/somepath"; args = {:id => '1'}; headers = {"X-Test-Header" => "testvalue" } - @session.expects(:request_via_redirect).with(:delete, path, args, headers) - @session.delete_via_redirect(path, args, headers) - end - - def test_get - path = "/index"; params = "blah"; headers = {:location => 'blah'} - @session.expects(:process).with(:get,path,params,headers) - @session.get(path,params,headers) - end - - def test_post - path = "/index"; params = "blah"; headers = {:location => 'blah'} - @session.expects(:process).with(:post,path,params,headers) - @session.post(path,params,headers) - end - - def test_put - path = "/index"; params = "blah"; headers = {:location => 'blah'} - @session.expects(:process).with(:put,path,params,headers) - @session.put(path,params,headers) - end - - def test_delete - path = "/index"; params = "blah"; headers = {:location => 'blah'} - @session.expects(:process).with(:delete,path,params,headers) - @session.delete(path,params,headers) - end - - def test_head - path = "/index"; params = "blah"; headers = {:location => 'blah'} - @session.expects(:process).with(:head,path,params,headers) - @session.head(path,params,headers) - end - - def test_xml_http_request_get - path = "/index"; params = "blah"; headers = {:location => 'blah'} - headers_after_xhr = headers.merge( - "HTTP_X_REQUESTED_WITH" => "XMLHttpRequest", - "HTTP_ACCEPT" => "text/javascript, text/html, application/xml, text/xml, */*" - ) - @session.expects(:process).with(:get,path,params,headers_after_xhr) - @session.xml_http_request(:get,path,params,headers) - end - - def test_xml_http_request_post - path = "/index"; params = "blah"; headers = {:location => 'blah'} - headers_after_xhr = headers.merge( - "HTTP_X_REQUESTED_WITH" => "XMLHttpRequest", - "HTTP_ACCEPT" => "text/javascript, text/html, application/xml, text/xml, */*" - ) - @session.expects(:process).with(:post,path,params,headers_after_xhr) - @session.xml_http_request(:post,path,params,headers) - end - - def test_xml_http_request_put - path = "/index"; params = "blah"; headers = {:location => 'blah'} - headers_after_xhr = headers.merge( - "HTTP_X_REQUESTED_WITH" => "XMLHttpRequest", - "HTTP_ACCEPT" => "text/javascript, text/html, application/xml, text/xml, */*" - ) - @session.expects(:process).with(:put,path,params,headers_after_xhr) - @session.xml_http_request(:put,path,params,headers) - end - - def test_xml_http_request_delete - path = "/index"; params = "blah"; headers = {:location => 'blah'} - headers_after_xhr = headers.merge( - "HTTP_X_REQUESTED_WITH" => "XMLHttpRequest", - "HTTP_ACCEPT" => "text/javascript, text/html, application/xml, text/xml, */*" - ) - @session.expects(:process).with(:delete,path,params,headers_after_xhr) - @session.xml_http_request(:delete,path,params,headers) - end - - def test_xml_http_request_head - path = "/index"; params = "blah"; headers = {:location => 'blah'} - headers_after_xhr = headers.merge( - "HTTP_X_REQUESTED_WITH" => "XMLHttpRequest", - "HTTP_ACCEPT" => "text/javascript, text/html, application/xml, text/xml, */*" - ) - @session.expects(:process).with(:head,path,params,headers_after_xhr) - @session.xml_http_request(:head,path,params,headers) - end - - def test_xml_http_request_override_accept - path = "/index"; params = "blah"; headers = {:location => 'blah', "HTTP_ACCEPT" => "application/xml"} - headers_after_xhr = headers.merge( - "HTTP_X_REQUESTED_WITH" => "XMLHttpRequest" - ) - @session.expects(:process).with(:post,path,params,headers_after_xhr) - @session.xml_http_request(:post,path,params,headers) - end -end - -class IntegrationTestTest < Test::Unit::TestCase - def setup - @test = ::ActionController::IntegrationTest.new(:default_test) - @test.class.stubs(:fixture_table_names).returns([]) - @session = @test.open_session - end - - def test_opens_new_session - session1 = @test.open_session { |sess| } - session2 = @test.open_session # implicit session - - assert_respond_to session1, :assert_template, "open_session makes assert_template available" - assert_respond_to session2, :assert_template, "open_session makes assert_template available" - assert !session1.equal?(session2) - end - - # RSpec mixes Matchers (which has a #method_missing) into - # IntegrationTest's superclass. Make sure IntegrationTest does not - # try to delegate these methods to the session object. - def test_does_not_prevent_method_missing_passing_up_to_ancestors - mixin = Module.new do - def method_missing(name, *args) - name.to_s == 'foo' ? 'pass' : super - end - end - @test.class.superclass.__send__(:include, mixin) - begin - assert_equal 'pass', @test.foo - ensure - # leave other tests as unaffected as possible - mixin.__send__(:remove_method, :method_missing) - end - end -end - -# Tests that integration tests don't call Controller test methods for processing. -# Integration tests have their own setup and teardown. -class IntegrationTestUsesCorrectClass < ActionController::IntegrationTest - def self.fixture_table_names - [] - end - - def test_integration_methods_called - reset! - @integration_session.stubs(:generic_url_rewriter) - @integration_session.stubs(:process) - - %w( get post head put delete ).each do |verb| - assert_nothing_raised("'#{verb}' should use integration test methods") { __send__(verb, '/') } - end - end -end - -class IntegrationProcessTest < ActionController::IntegrationTest - class IntegrationController < ActionController::Base - def get - respond_to do |format| - format.html { render :text => "OK", :status => 200 } - format.js { render :text => "JS OK", :status => 200 } - end - end - - def get_with_params - render :text => "foo: #{params[:foo]}", :status => 200 - end - - def post - render :text => "Created", :status => 201 - end - - def method - render :text => "method: #{request.method.downcase}" - end - - def cookie_monster - cookies["cookie_1"] = nil - cookies["cookie_3"] = "chocolate" - render :text => "Gone", :status => 410 - end - - def set_cookie - cookies["foo"] = 'bar' - head :ok - end - - def get_cookie - render :text => cookies["foo"] - end - - def redirect - redirect_to :action => "get" - end - end - - def test_get - with_test_route_set do - get '/get' - assert_equal 200, status - assert_equal "OK", status_message - assert_response 200 - assert_response :success - assert_response :ok - assert_equal({}, cookies.to_hash) - assert_equal "OK", body - assert_equal "OK", response.body - assert_kind_of HTML::Document, html_document - assert_equal 1, request_count - end - end - - def test_post - with_test_route_set do - post '/post' - assert_equal 201, status - assert_equal "Created", status_message - assert_response 201 - assert_response :success - assert_response :created - assert_equal({}, cookies.to_hash) - assert_equal "Created", body - assert_equal "Created", response.body - assert_kind_of HTML::Document, html_document - assert_equal 1, request_count - end - end - - test 'response cookies are added to the cookie jar for the next request' do - with_test_route_set do - self.cookies['cookie_1'] = "sugar" - self.cookies['cookie_2'] = "oatmeal" - get '/cookie_monster' - assert_equal "cookie_1=; path=/\ncookie_3=chocolate; path=/", headers["Set-Cookie"] - assert_equal({"cookie_1"=>"", "cookie_2"=>"oatmeal", "cookie_3"=>"chocolate"}, cookies.to_hash) - end - end - - test 'cookie persist to next request' do - with_test_route_set do - get '/set_cookie' - assert_response :success - - assert_equal "foo=bar; path=/", headers["Set-Cookie"] - assert_equal({"foo"=>"bar"}, cookies.to_hash) - - get '/get_cookie' - assert_response :success - assert_equal "bar", body - - assert_equal nil, headers["Set-Cookie"] - assert_equal({"foo"=>"bar"}, cookies.to_hash) - end - end - - test 'cookie persist to next request on another domain' do - with_test_route_set do - host! "37s.backpack.test" - - get '/set_cookie' - assert_response :success - - assert_equal "foo=bar; path=/", headers["Set-Cookie"] - assert_equal({"foo"=>"bar"}, cookies.to_hash) - - get '/get_cookie' - assert_response :success - assert_equal "bar", body - - assert_equal nil, headers["Set-Cookie"] - assert_equal({"foo"=>"bar"}, cookies.to_hash) - end - end - - def test_redirect - with_test_route_set do - get '/redirect' - assert_equal 302, status - assert_equal "Found", status_message - assert_response 302 - assert_response :redirect - assert_response :found - assert_equal "You are being redirected.", response.body - assert_kind_of HTML::Document, html_document - assert_equal 1, request_count - - follow_redirect! - assert_response :success - assert_equal "/get", path - end - end - - def test_xml_http_request_get - with_test_route_set do - xhr :get, '/get' - assert_equal 200, status - assert_equal "OK", status_message - assert_response 200 - assert_response :success - assert_response :ok - assert_equal "JS OK", response.body - end - end - - def test_get_with_query_string - with_test_route_set do - get '/get_with_params?foo=bar' - assert_equal '/get_with_params?foo=bar', request.env["REQUEST_URI"] - assert_equal '/get_with_params?foo=bar', request.fullpath - assert_equal "foo=bar", request.env["QUERY_STRING"] - assert_equal 'foo=bar', request.query_string - assert_equal 'bar', request.parameters['foo'] - - assert_equal 200, status - assert_equal "foo: bar", response.body - end - end - - def test_get_with_parameters - with_test_route_set do - get '/get_with_params', :foo => "bar" - assert_equal '/get_with_params', request.env["PATH_INFO"] - assert_equal '/get_with_params', request.path_info - assert_equal 'foo=bar', request.env["QUERY_STRING"] - assert_equal 'foo=bar', request.query_string - assert_equal 'bar', request.parameters['foo'] - - assert_equal 200, status - assert_equal "foo: bar", response.body - end - end - - def test_head - with_test_route_set do - head '/get' - assert_equal 200, status - assert_equal "", body - - head '/post' - assert_equal 201, status - assert_equal "", body - - get '/get/method' - assert_equal 200, status - assert_equal "method: get", body - - head '/get/method' - assert_equal 200, status - assert_equal "", body - end - end - - def test_generate_url_with_controller - assert_equal 'http://www.example.com/foo', url_for(:controller => "foo") - end - - private - def with_test_route_set - with_routing do |set| - controller = ::IntegrationProcessTest::IntegrationController.clone - controller.class_eval do - include set.url_helpers - end - - set.draw do |map| - match ':action', :to => controller - get 'get/:action', :to => controller - end - - self.singleton_class.send(:include, set.url_helpers) - - yield - end - end -end - -class MetalIntegrationTest < ActionController::IntegrationTest - include SharedTestRoutes.url_helpers - - class Poller - def self.call(env) - if env["PATH_INFO"] =~ /^\/success/ - [200, {"Content-Type" => "text/plain", "Content-Length" => "12"}, ["Hello World!"]] - else - [404, {"Content-Type" => "text/plain", "Content-Length" => "0"}, []] - end - end - end - - def setup - @app = Poller - end - - def test_successful_get - get "/success" - assert_response 200 - assert_response :success - assert_response :ok - assert_equal "Hello World!", response.body - end - - def test_failed_get - get "/failure" - assert_response 404 - assert_response :not_found - assert_equal '', response.body - end - - def test_generate_url_without_controller - assert_equal 'http://www.example.com/foo', url_for(:controller => "foo") - end -end - -class ApplicationIntegrationTest < ActionController::IntegrationTest - class TestController < ActionController::Base - def index - render :text => "index" - end - end - - def self.call(env) - routes.call(env) - end - - def self.routes - @routes ||= ActionDispatch::Routing::RouteSet.new - end - - routes.draw do - match 'foo', :to => 'application_integration_test/test#index', :as => :foo - match 'bar', :to => 'application_integration_test/test#index', :as => :bar - end - - def app - self.class - end - - test "includes route helpers" do - assert_equal '/foo', foo_path - assert_equal '/bar', bar_path - end - - test "route helpers after controller access" do - get '/foo' - assert_equal '/foo', foo_path - - get '/bar' - assert_equal '/bar', bar_path - end - - test "missing route helper before controller access" do - assert_raise(NameError) { missing_path } - end - - test "missing route helper after controller access" do - get '/foo' - assert_raise(NameError) { missing_path } - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/layout_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/layout_test.rb deleted file mode 100644 index 28bdda4e6..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/layout_test.rb +++ /dev/null @@ -1,224 +0,0 @@ -require 'abstract_unit' -require 'rbconfig' - -# The view_paths array must be set on Base and not LayoutTest so that LayoutTest's inherited -# method has access to the view_paths array when looking for a layout to automatically assign. -old_load_paths = ActionController::Base.view_paths - -ActionView::Template::register_template_handler :mab, - lambda { |template| template.source.inspect } - -ActionController::Base.view_paths = [ File.dirname(__FILE__) + '/../fixtures/layout_tests/' ] - -class LayoutTest < ActionController::Base - def self.controller_path; 'views' end - def self._implied_layout_name; to_s.underscore.gsub(/_controller$/, '') ; end - self.view_paths = ActionController::Base.view_paths.dup -end - -# Restore view_paths to previous value -ActionController::Base.view_paths = old_load_paths - -class ProductController < LayoutTest -end - -class ItemController < LayoutTest -end - -class ThirdPartyTemplateLibraryController < LayoutTest -end - -module ControllerNameSpace -end - -class ControllerNameSpace::NestedController < LayoutTest -end - -class MultipleExtensions < LayoutTest -end - -class LayoutAutoDiscoveryTest < ActionController::TestCase - def setup - super - @request.host = "www.nextangle.com" - end - - def test_application_layout_is_default_when_no_controller_match - @controller = ProductController.new - get :hello - assert_equal 'layout_test.rhtml hello.rhtml', @response.body - end - - def test_controller_name_layout_name_match - @controller = ItemController.new - get :hello - assert_equal 'item.rhtml hello.rhtml', @response.body - end - - def test_third_party_template_library_auto_discovers_layout - @controller = ThirdPartyTemplateLibraryController.new - get :hello - assert_response :success - assert_equal 'layouts/third_party_template_library.mab', @response.body - end - - def test_namespaced_controllers_auto_detect_layouts1 - @controller = ControllerNameSpace::NestedController.new - get :hello - assert_equal 'controller_name_space/nested.rhtml hello.rhtml', @response.body - end - - def test_namespaced_controllers_auto_detect_layouts2 - @controller = MultipleExtensions.new - get :hello - assert_equal 'multiple_extensions.html.erb hello.rhtml', @response.body.strip - end -end - -class DefaultLayoutController < LayoutTest -end - -class AbsolutePathLayoutController < LayoutTest - layout File.expand_path(File.expand_path(__FILE__) + '/../../fixtures/layout_tests/layouts/layout_test.rhtml') -end - -class HasOwnLayoutController < LayoutTest - layout 'item' -end - -class PrependsViewPathController < LayoutTest - def hello - prepend_view_path File.dirname(__FILE__) + '/../fixtures/layout_tests/alt/' - render :layout => 'alt' - end -end - -class OnlyLayoutController < LayoutTest - layout 'item', :only => "hello" -end - -class ExceptLayoutController < LayoutTest - layout 'item', :except => "goodbye" -end - -class SetsLayoutInRenderController < LayoutTest - def hello - render :layout => 'third_party_template_library' - end -end - -class RendersNoLayoutController < LayoutTest - def hello - render :layout => false - end -end - -class LayoutSetInResponseTest < ActionController::TestCase - include ActionView::Template::Handlers - - def test_layout_set_when_using_default_layout - @controller = DefaultLayoutController.new - get :hello - assert_template :layout => "layouts/layout_test" - end - - def test_layout_set_when_set_in_controller - @controller = HasOwnLayoutController.new - get :hello - assert_template :layout => "layouts/item" - end - - def test_layout_only_exception_when_included - @controller = OnlyLayoutController.new - get :hello - assert_template :layout => "layouts/item" - end - - def test_layout_only_exception_when_excepted - @controller = OnlyLayoutController.new - get :goodbye - assert !@response.body.include?("item.rhtml"), "#{@response.body.inspect} included 'item.rhtml'" - end - - def test_layout_except_exception_when_included - @controller = ExceptLayoutController.new - get :hello - assert_template :layout => "layouts/item" - end - - def test_layout_except_exception_when_excepted - @controller = ExceptLayoutController.new - get :goodbye - assert !@response.body.include?("item.rhtml"), "#{@response.body.inspect} included 'item.rhtml'" - end - - def test_layout_set_when_using_render - @controller = SetsLayoutInRenderController.new - get :hello - assert_template :layout => "layouts/third_party_template_library" - end - - def test_layout_is_not_set_when_none_rendered - @controller = RendersNoLayoutController.new - get :hello - assert_template :layout => nil - end - - def test_layout_is_picked_from_the_controller_instances_view_path - @controller = PrependsViewPathController.new - get :hello - assert_template :layout => /layouts\/alt\.\w+/ - end - - def test_absolute_pathed_layout - @controller = AbsolutePathLayoutController.new - get :hello - assert_equal "layout_test.rhtml hello.rhtml", @response.body.strip - end -end - -class RenderWithTemplateOptionController < LayoutTest - def hello - render :template => 'alt/hello' - end -end - -class SetsNonExistentLayoutFile < LayoutTest - layout "nofile.rhtml" -end - -class LayoutExceptionRaised < ActionController::TestCase - def test_exception_raised_when_layout_file_not_found - @controller = SetsNonExistentLayoutFile.new - assert_raise(ActionView::MissingTemplate) { get :hello } - end -end - -class LayoutStatusIsRendered < LayoutTest - def hello - render :status => 401 - end -end - -class LayoutStatusIsRenderedTest < ActionController::TestCase - def test_layout_status_is_rendered - @controller = LayoutStatusIsRendered.new - get :hello - assert_response 401 - end -end - -unless RbConfig::CONFIG['host_os'] =~ /mswin|mingw/ - class LayoutSymlinkedTest < LayoutTest - layout "symlinked/symlinked_layout" - end - - class LayoutSymlinkedIsRenderedTest < ActionController::TestCase - def test_symlinked_layout_is_rendered - @controller = LayoutSymlinkedTest.new - get :hello - assert_response 200 - assert_template :layout => "layouts/symlinked/symlinked_layout" - end - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/localized_templates_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/localized_templates_test.rb deleted file mode 100644 index 6808f4114..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/localized_templates_test.rb +++ /dev/null @@ -1,22 +0,0 @@ -require 'abstract_unit' - -class LocalizedController < ActionController::Base - def hello_world - end -end - -class LocalizedTemplatesTest < ActionController::TestCase - tests LocalizedController - - def test_localized_template_is_used - I18n.locale = :de - get :hello_world - assert_equal "Gutten Tag", @response.body - end - - def test_default_locale_template_is_used_when_locale_is_missing - I18n.locale = :dk - get :hello_world - assert_equal "Hello World", @response.body - end -end \ No newline at end of file diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/log_subscriber_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/log_subscriber_test.rb deleted file mode 100644 index 7bb96399a..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/log_subscriber_test.rb +++ /dev/null @@ -1,172 +0,0 @@ -require "abstract_unit" -require "active_support/log_subscriber/test_helper" -require "action_controller/log_subscriber" - -module Another - class LogSubscribersController < ActionController::Base - def show - render :nothing => true - end - - def redirector - redirect_to "http://foo.bar/" - end - - def data_sender - send_data "cool data", :filename => "file.txt" - end - - def xfile_sender - send_file File.expand_path("company.rb", FIXTURE_LOAD_PATH), :x_sendfile => true - end - - def file_sender - send_file File.expand_path("company.rb", FIXTURE_LOAD_PATH) - end - - def with_fragment_cache - render :inline => "<%= cache('foo'){ 'bar' } %>" - end - - def with_page_cache - cache_page("Super soaker", "/index.html") - render :nothing => true - end - end -end - -class ACLogSubscriberTest < ActionController::TestCase - tests Another::LogSubscribersController - include ActiveSupport::LogSubscriber::TestHelper - - def setup - super - - @old_logger = ActionController::Base.logger - - @cache_path = File.expand_path('../temp/test_cache', File.dirname(__FILE__)) - ActionController::Base.page_cache_directory = @cache_path - @controller.cache_store = :file_store, @cache_path - ActionController::LogSubscriber.attach_to :action_controller - end - - def teardown - super - ActiveSupport::LogSubscriber.log_subscribers.clear - FileUtils.rm_rf(@cache_path) - ActionController::Base.logger = @old_logger - end - - def set_logger(logger) - ActionController::Base.logger = logger - end - - def test_start_processing - get :show - wait - assert_equal 2, logs.size - assert_equal "Processing by Another::LogSubscribersController#show as HTML", logs.first - end - - def test_process_action - get :show - wait - assert_equal 2, logs.size - assert_match /Completed/, logs.last - assert_match /200 OK/, logs.last - end - - def test_process_action_without_parameters - get :show - wait - assert_nil logs.detect {|l| l =~ /Parameters/ } - end - - def test_process_action_with_parameters - get :show, :id => '10' - wait - - assert_equal 3, logs.size - assert_equal 'Parameters: {"id"=>"10"}', logs[1] - end - - def test_process_action_with_view_runtime - get :show - wait - assert_match /\(Views: [\d\.]+ms\)/, logs[1] - end - - def test_process_action_with_filter_parameters - @request.env["action_dispatch.parameter_filter"] = [:lifo, :amount] - - get :show, :lifo => 'Pratik', :amount => '420', :step => '1' - wait - - params = logs[1] - assert_match /"amount"=>"\[FILTERED\]"/, params - assert_match /"lifo"=>"\[FILTERED\]"/, params - assert_match /"step"=>"1"/, params - end - - def test_redirect_to - get :redirector - wait - - assert_equal 3, logs.size - assert_equal "Redirected to http://foo.bar/", logs[1] - end - - def test_send_data - get :data_sender - wait - - assert_equal 3, logs.size - assert_match /Sent data file\.txt/, logs[1] - end - - def test_send_file - get :file_sender - wait - - assert_equal 3, logs.size - assert_match /Sent file/, logs[1] - assert_match /test\/fixtures\/company\.rb/, logs[1] - end - - def test_send_xfile - assert_deprecated { get :xfile_sender } - wait - - assert_equal 3, logs.size - assert_match /Sent file/, logs[1] - assert_match /test\/fixtures\/company\.rb/, logs[1] - end - - def test_with_fragment_cache - @controller.config.perform_caching = true - get :with_fragment_cache - wait - - assert_equal 4, logs.size - assert_match /Exist fragment\? views\/foo/, logs[1] - assert_match /Write fragment views\/foo/, logs[2] - ensure - @controller.config.perform_caching = true - end - - def test_with_page_cache - @controller.config.perform_caching = true - get :with_page_cache - wait - - assert_equal 3, logs.size - assert_match /Write page/, logs[1] - assert_match /\/index\.html/, logs[1] - ensure - @controller.config.perform_caching = true - end - - def logs - @logs ||= @logger.logged(:info) - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/mime_responds_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/mime_responds_test.rb deleted file mode 100644 index c209acbfa..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/mime_responds_test.rb +++ /dev/null @@ -1,941 +0,0 @@ -require 'abstract_unit' -require 'controller/fake_models' -require 'active_support/core_ext/hash/conversions' - -class RespondToController < ActionController::Base - layout :set_layout - - def html_xml_or_rss - respond_to do |type| - type.html { render :text => "HTML" } - type.xml { render :text => "XML" } - type.rss { render :text => "RSS" } - type.all { render :text => "Nothing" } - end - end - - def js_or_html - respond_to do |type| - type.html { render :text => "HTML" } - type.js { render :text => "JS" } - type.all { render :text => "Nothing" } - end - end - - def json_or_yaml - respond_to do |type| - type.json { render :text => "JSON" } - type.yaml { render :text => "YAML" } - end - end - - def html_or_xml - respond_to do |type| - type.html { render :text => "HTML" } - type.xml { render :text => "XML" } - type.all { render :text => "Nothing" } - end - end - - def json_xml_or_html - respond_to do |type| - type.json { render :text => 'JSON' } - type.xml { render :xml => 'XML' } - type.html { render :text => 'HTML' } - end - end - - - def forced_xml - request.format = :xml - - respond_to do |type| - type.html { render :text => "HTML" } - type.xml { render :text => "XML" } - end - end - - def just_xml - respond_to do |type| - type.xml { render :text => "XML" } - end - end - - def using_defaults - respond_to do |type| - type.html - type.js - type.xml - end - end - - def using_defaults_with_type_list - respond_to(:html, :js, :xml) - end - - def made_for_content_type - respond_to do |type| - type.rss { render :text => "RSS" } - type.atom { render :text => "ATOM" } - type.all { render :text => "Nothing" } - end - end - - def custom_type_handling - respond_to do |type| - type.html { render :text => "HTML" } - type.custom("application/crazy-xml") { render :text => "Crazy XML" } - type.all { render :text => "Nothing" } - end - end - - Mime::Type.register("text/x-mobile", :mobile) - - def custom_constant_handling - respond_to do |type| - type.html { render :text => "HTML" } - type.mobile { render :text => "Mobile" } - end - end - - def custom_constant_handling_without_block - respond_to do |type| - type.html { render :text => "HTML" } - type.mobile - end - end - - def handle_any - respond_to do |type| - type.html { render :text => "HTML" } - type.any(:js, :xml) { render :text => "Either JS or XML" } - end - end - - def handle_any_any - respond_to do |type| - type.html { render :text => 'HTML' } - type.any { render :text => 'Whatever you ask for, I got it' } - end - end - - def all_types_with_layout - respond_to do |type| - type.html - type.js - end - end - - Mime::Type.register_alias("text/html", :iphone) - - def iphone_with_html_response_type - request.format = :iphone if request.env["HTTP_ACCEPT"] == "text/iphone" - - respond_to do |type| - type.html { @type = "Firefox" } - type.iphone { @type = "iPhone" } - end - end - - def iphone_with_html_response_type_without_layout - request.format = "iphone" if request.env["HTTP_ACCEPT"] == "text/iphone" - - respond_to do |type| - type.html { @type = "Firefox"; render :action => "iphone_with_html_response_type" } - type.iphone { @type = "iPhone" ; render :action => "iphone_with_html_response_type" } - end - end - - def rescue_action(e) - raise - end - - protected - def set_layout - if ["all_types_with_layout", "iphone_with_html_response_type"].include?(action_name) - "respond_to/layouts/standard" - elsif action_name == "iphone_with_html_response_type_without_layout" - "respond_to/layouts/missing" - end - end -end - -class RespondToControllerTest < ActionController::TestCase - tests RespondToController - - def setup - super - @request.host = "www.example.com" - end - - def teardown - super - end - - def test_html - @request.accept = "text/html" - get :js_or_html - assert_equal 'HTML', @response.body - - get :html_or_xml - assert_equal 'HTML', @response.body - - get :just_xml - assert_response 406 - end - - def test_all - @request.accept = "*/*" - get :js_or_html - assert_equal 'HTML', @response.body # js is not part of all - - get :html_or_xml - assert_equal 'HTML', @response.body - - get :just_xml - assert_equal 'XML', @response.body - end - - def test_xml - @request.accept = "application/xml" - get :html_xml_or_rss - assert_equal 'XML', @response.body - end - - def test_js_or_html - @request.accept = "text/javascript, text/html" - xhr :get, :js_or_html - assert_equal 'JS', @response.body - - @request.accept = "text/javascript, text/html" - xhr :get, :html_or_xml - assert_equal 'HTML', @response.body - - @request.accept = "text/javascript, text/html" - xhr :get, :just_xml - assert_response 406 - end - - def test_json_or_yaml - xhr :get, :json_or_yaml - assert_equal 'JSON', @response.body - - get :json_or_yaml, :format => 'json' - assert_equal 'JSON', @response.body - - get :json_or_yaml, :format => 'yaml' - assert_equal 'YAML', @response.body - - { 'YAML' => %w(text/yaml), - 'JSON' => %w(application/json text/x-json) - }.each do |body, content_types| - content_types.each do |content_type| - @request.accept = content_type - get :json_or_yaml - assert_equal body, @response.body - end - end - end - - def test_js_or_anything - @request.accept = "text/javascript, */*" - xhr :get, :js_or_html - assert_equal 'JS', @response.body - - xhr :get, :html_or_xml - assert_equal 'HTML', @response.body - - xhr :get, :just_xml - assert_equal 'XML', @response.body - end - - def test_using_defaults - @request.accept = "*/*" - get :using_defaults - assert_equal "text/html", @response.content_type - assert_equal 'Hello world!', @response.body - - @request.accept = "text/javascript" - get :using_defaults - assert_equal "text/javascript", @response.content_type - assert_equal '$("body").visualEffect("highlight");', @response.body - - @request.accept = "application/xml" - get :using_defaults - assert_equal "application/xml", @response.content_type - assert_equal "

Hello world!

\n", @response.body - end - - def test_using_defaults_with_type_list - @request.accept = "*/*" - get :using_defaults_with_type_list - assert_equal "text/html", @response.content_type - assert_equal 'Hello world!', @response.body - - @request.accept = "text/javascript" - get :using_defaults_with_type_list - assert_equal "text/javascript", @response.content_type - assert_equal '$("body").visualEffect("highlight");', @response.body - - @request.accept = "application/xml" - get :using_defaults_with_type_list - assert_equal "application/xml", @response.content_type - assert_equal "

Hello world!

\n", @response.body - end - - def test_with_atom_content_type - @request.accept = "" - @request.env["CONTENT_TYPE"] = "application/atom+xml" - xhr :get, :made_for_content_type - assert_equal "ATOM", @response.body - end - - def test_with_rss_content_type - @request.accept = "" - @request.env["CONTENT_TYPE"] = "application/rss+xml" - xhr :get, :made_for_content_type - assert_equal "RSS", @response.body - end - - def test_synonyms - @request.accept = "application/javascript" - get :js_or_html - assert_equal 'JS', @response.body - - @request.accept = "application/x-xml" - get :html_xml_or_rss - assert_equal "XML", @response.body - end - - def test_custom_types - @request.accept = "application/crazy-xml" - get :custom_type_handling - assert_equal "application/crazy-xml", @response.content_type - assert_equal 'Crazy XML', @response.body - - @request.accept = "text/html" - get :custom_type_handling - assert_equal "text/html", @response.content_type - assert_equal 'HTML', @response.body - end - - def test_xhtml_alias - @request.accept = "application/xhtml+xml,application/xml" - get :html_or_xml - assert_equal 'HTML', @response.body - end - - def test_firefox_simulation - @request.accept = "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5" - get :html_or_xml - assert_equal 'HTML', @response.body - end - - def test_handle_any - @request.accept = "*/*" - get :handle_any - assert_equal 'HTML', @response.body - - @request.accept = "text/javascript" - get :handle_any - assert_equal 'Either JS or XML', @response.body - - @request.accept = "text/xml" - get :handle_any - assert_equal 'Either JS or XML', @response.body - end - - def test_handle_any_any - @request.accept = "*/*" - get :handle_any_any - assert_equal 'HTML', @response.body - end - - def test_handle_any_any_parameter_format - get :handle_any_any, {:format=>'html'} - assert_equal 'HTML', @response.body - end - - def test_handle_any_any_explicit_html - @request.accept = "text/html" - get :handle_any_any - assert_equal 'HTML', @response.body - end - - def test_handle_any_any_javascript - @request.accept = "text/javascript" - get :handle_any_any - assert_equal 'Whatever you ask for, I got it', @response.body - end - - def test_handle_any_any_xml - @request.accept = "text/xml" - get :handle_any_any - assert_equal 'Whatever you ask for, I got it', @response.body - end - - def test_browser_check_with_any_any - @request.accept = "application/json, application/xml" - get :json_xml_or_html - assert_equal 'JSON', @response.body - - @request.accept = "application/json, application/xml, */*" - get :json_xml_or_html - assert_equal 'HTML', @response.body - end - - - def test_rjs_type_skips_layout - @request.accept = "text/javascript" - get :all_types_with_layout - assert_equal 'RJS for all_types_with_layout', @response.body - end - - def test_html_type_with_layout - @request.accept = "text/html" - get :all_types_with_layout - assert_equal '
HTML for all_types_with_layout
', @response.body - end - - def test_xhr - xhr :get, :js_or_html - assert_equal 'JS', @response.body - - xhr :get, :using_defaults - assert_equal '$("body").visualEffect("highlight");', @response.body - end - - def test_custom_constant - get :custom_constant_handling, :format => "mobile" - assert_equal "text/x-mobile", @response.content_type - assert_equal "Mobile", @response.body - end - - def test_custom_constant_handling_without_block - get :custom_constant_handling_without_block, :format => "mobile" - assert_equal "text/x-mobile", @response.content_type - assert_equal "Mobile", @response.body - end - - def test_forced_format - get :html_xml_or_rss - assert_equal "HTML", @response.body - - get :html_xml_or_rss, :format => "html" - assert_equal "HTML", @response.body - - get :html_xml_or_rss, :format => "xml" - assert_equal "XML", @response.body - - get :html_xml_or_rss, :format => "rss" - assert_equal "RSS", @response.body - end - - def test_internally_forced_format - get :forced_xml - assert_equal "XML", @response.body - - get :forced_xml, :format => "html" - assert_equal "XML", @response.body - end - - def test_extension_synonyms - get :html_xml_or_rss, :format => "xhtml" - assert_equal "HTML", @response.body - end - - def test_render_action_for_html - @controller.instance_eval do - def render(*args) - @action = args.first[:action] unless args.empty? - @action ||= action_name - - response.body = "#{@action} - #{formats}" - end - end - - get :using_defaults - assert_equal "using_defaults - #{[:html].to_s}", @response.body - - get :using_defaults, :format => "xml" - assert_equal "using_defaults - #{[:xml].to_s}", @response.body - end - - def test_format_with_custom_response_type - get :iphone_with_html_response_type - assert_equal '
Hello future from Firefox!
', @response.body - - get :iphone_with_html_response_type, :format => "iphone" - assert_equal "text/html", @response.content_type - assert_equal '
Hello iPhone future from iPhone!
', @response.body - end - - def test_format_with_custom_response_type_and_request_headers - @request.accept = "text/iphone" - get :iphone_with_html_response_type - assert_equal '
Hello iPhone future from iPhone!
', @response.body - assert_equal "text/html", @response.content_type - end -end - -class RespondWithController < ActionController::Base - respond_to :html, :json - respond_to :xml, :except => :using_resource_with_block - respond_to :js, :only => [ :using_resource_with_block, :using_resource ] - - def using_resource - respond_with(resource) - end - - def using_resource_with_block - respond_with(resource) do |format| - format.csv { render :text => "CSV" } - end - end - - def using_resource_with_overwrite_block - respond_with(resource) do |format| - format.html { render :text => "HTML" } - end - end - - def using_resource_with_collection - respond_with([resource, Customer.new("jamis", 9)]) - end - - def using_resource_with_parent - respond_with(Quiz::Store.new("developer?", 11), Customer.new("david", 13)) - end - - def using_resource_with_status_and_location - respond_with(resource, :location => "http://test.host/", :status => :created) - end - - def using_resource_with_responder - responder = proc { |c, r, o| c.render :text => "Resource name is #{r.first.name}" } - respond_with(resource, :responder => responder) - end - - def using_resource_with_action - respond_with(resource, :action => :foo) do |format| - format.html { raise ActionView::MissingTemplate.new([], "foo/bar", {}, false) } - end - end - - def using_responder_with_respond - responder = Class.new(ActionController::Responder) do - def respond; @controller.render :text => "respond #{format}"; end - end - respond_with(resource, :responder => responder) - end - -protected - - def resource - Customer.new("david", request.delete? ? nil : 13) - end - - def _render_js(js, options) - self.content_type ||= Mime::JS - self.response_body = js.respond_to?(:to_js) ? js.to_js : js - end -end - -class InheritedRespondWithController < RespondWithController - clear_respond_to - respond_to :xml, :json - - def index - respond_with(resource) do |format| - format.json { render :text => "JSON" } - end - end -end - -class EmptyRespondWithController < ActionController::Base - def index - respond_with(Customer.new("david", 13)) - end -end - -class RespondWithControllerTest < ActionController::TestCase - tests RespondWithController - - def setup - super - @request.host = "www.example.com" - end - - def teardown - super - end - - def test_using_resource - @request.accept = "text/javascript" - get :using_resource - assert_equal "text/javascript", @response.content_type - assert_equal '$("body").visualEffect("highlight");', @response.body - - @request.accept = "application/xml" - get :using_resource - assert_equal "application/xml", @response.content_type - assert_equal "david", @response.body - - @request.accept = "application/json" - assert_raise ActionView::MissingTemplate do - get :using_resource - end - end - - def test_using_resource_with_block - @request.accept = "*/*" - get :using_resource_with_block - assert_equal "text/html", @response.content_type - assert_equal 'Hello world!', @response.body - - @request.accept = "text/csv" - get :using_resource_with_block - assert_equal "text/csv", @response.content_type - assert_equal "CSV", @response.body - - @request.accept = "application/xml" - get :using_resource - assert_equal "application/xml", @response.content_type - assert_equal "david", @response.body - end - - def test_using_resource_with_overwrite_block - get :using_resource_with_overwrite_block - assert_equal "text/html", @response.content_type - assert_equal "HTML", @response.body - end - - def test_not_acceptable - @request.accept = "application/xml" - get :using_resource_with_block - assert_equal 406, @response.status - - @request.accept = "text/javascript" - get :using_resource_with_overwrite_block - assert_equal 406, @response.status - end - - def test_using_resource_for_post_with_html_redirects_on_success - with_test_route_set do - post :using_resource - assert_equal "text/html", @response.content_type - assert_equal 302, @response.status - assert_equal "http://www.example.com/customers/13", @response.location - assert @response.redirect? - end - end - - def test_using_resource_for_post_with_html_rerender_on_failure - with_test_route_set do - errors = { :name => :invalid } - Customer.any_instance.stubs(:errors).returns(errors) - post :using_resource - assert_equal "text/html", @response.content_type - assert_equal 200, @response.status - assert_equal "New world!\n", @response.body - assert_nil @response.location - end - end - - def test_using_resource_for_post_with_xml_yields_created_on_success - with_test_route_set do - @request.accept = "application/xml" - post :using_resource - assert_equal "application/xml", @response.content_type - assert_equal 201, @response.status - assert_equal "david", @response.body - assert_equal "http://www.example.com/customers/13", @response.location - end - end - - def test_using_resource_for_post_with_xml_yields_unprocessable_entity_on_failure - with_test_route_set do - @request.accept = "application/xml" - errors = { :name => :invalid } - Customer.any_instance.stubs(:errors).returns(errors) - post :using_resource - assert_equal "application/xml", @response.content_type - assert_equal 422, @response.status - assert_equal errors.to_xml, @response.body - assert_nil @response.location - end - end - - def test_using_resource_for_put_with_html_redirects_on_success - with_test_route_set do - put :using_resource - assert_equal "text/html", @response.content_type - assert_equal 302, @response.status - assert_equal "http://www.example.com/customers/13", @response.location - assert @response.redirect? - end - end - - def test_using_resource_for_put_with_html_rerender_on_failure - with_test_route_set do - errors = { :name => :invalid } - Customer.any_instance.stubs(:errors).returns(errors) - put :using_resource - assert_equal "text/html", @response.content_type - assert_equal 200, @response.status - assert_equal "Edit world!\n", @response.body - assert_nil @response.location - end - end - - def test_using_resource_for_put_with_html_rerender_on_failure_even_on_method_override - with_test_route_set do - errors = { :name => :invalid } - Customer.any_instance.stubs(:errors).returns(errors) - @request.env["rack.methodoverride.original_method"] = "POST" - put :using_resource - assert_equal "text/html", @response.content_type - assert_equal 200, @response.status - assert_equal "Edit world!\n", @response.body - assert_nil @response.location - end - end - - def test_using_resource_for_put_with_xml_yields_ok_on_success - @request.accept = "application/xml" - put :using_resource - assert_equal "application/xml", @response.content_type - assert_equal 200, @response.status - assert_equal " ", @response.body - end - - def test_using_resource_for_put_with_xml_yields_unprocessable_entity_on_failure - @request.accept = "application/xml" - errors = { :name => :invalid } - Customer.any_instance.stubs(:errors).returns(errors) - put :using_resource - assert_equal "application/xml", @response.content_type - assert_equal 422, @response.status - assert_equal errors.to_xml, @response.body - assert_nil @response.location - end - - def test_using_resource_for_delete_with_html_redirects_on_success - with_test_route_set do - Customer.any_instance.stubs(:destroyed?).returns(true) - delete :using_resource - assert_equal "text/html", @response.content_type - assert_equal 302, @response.status - assert_equal "http://www.example.com/customers", @response.location - end - end - - def test_using_resource_for_delete_with_xml_yields_ok_on_success - Customer.any_instance.stubs(:destroyed?).returns(true) - @request.accept = "application/xml" - delete :using_resource - assert_equal "application/xml", @response.content_type - assert_equal 200, @response.status - assert_equal " ", @response.body - end - - def test_using_resource_for_delete_with_html_redirects_on_failure - with_test_route_set do - errors = { :name => :invalid } - Customer.any_instance.stubs(:errors).returns(errors) - Customer.any_instance.stubs(:destroyed?).returns(false) - delete :using_resource - assert_equal "text/html", @response.content_type - assert_equal 302, @response.status - assert_equal "http://www.example.com/customers", @response.location - end - end - - def test_using_resource_with_parent_for_get - @request.accept = "application/xml" - get :using_resource_with_parent - assert_equal "application/xml", @response.content_type - assert_equal 200, @response.status - assert_equal "david", @response.body - end - - def test_using_resource_with_parent_for_post - with_test_route_set do - @request.accept = "application/xml" - - post :using_resource_with_parent - assert_equal "application/xml", @response.content_type - assert_equal 201, @response.status - assert_equal "david", @response.body - assert_equal "http://www.example.com/quiz_stores/11/customers/13", @response.location - - errors = { :name => :invalid } - Customer.any_instance.stubs(:errors).returns(errors) - post :using_resource - assert_equal "application/xml", @response.content_type - assert_equal 422, @response.status - assert_equal errors.to_xml, @response.body - assert_nil @response.location - end - end - - def test_using_resource_with_collection - @request.accept = "application/xml" - get :using_resource_with_collection - assert_equal "application/xml", @response.content_type - assert_equal 200, @response.status - assert_match /david<\/name>/, @response.body - assert_match /jamis<\/name>/, @response.body - end - - def test_using_resource_with_action - @controller.instance_eval do - def render(params={}) - self.response_body = "#{params[:action]} - #{formats}" - end - end - - errors = { :name => :invalid } - Customer.any_instance.stubs(:errors).returns(errors) - - post :using_resource_with_action - assert_equal "foo - #{[:html].to_s}", @controller.response.body - end - - def test_respond_as_responder_entry_point - @request.accept = "text/html" - get :using_responder_with_respond - assert_equal "respond html", @response.body - - @request.accept = "application/xml" - get :using_responder_with_respond - assert_equal "respond xml", @response.body - end - - def test_clear_respond_to - @controller = InheritedRespondWithController.new - @request.accept = "text/html" - get :index - assert_equal 406, @response.status - end - - def test_first_in_respond_to_has_higher_priority - @controller = InheritedRespondWithController.new - @request.accept = "*/*" - get :index - assert_equal "application/xml", @response.content_type - assert_equal "david", @response.body - end - - def test_block_inside_respond_with_is_rendered - @controller = InheritedRespondWithController.new - @request.accept = "application/json" - get :index - assert_equal "JSON", @response.body - end - - def test_no_double_render_is_raised - @request.accept = "text/html" - assert_raise ActionView::MissingTemplate do - get :using_resource - end - end - - def test_using_resource_with_status_and_location - @request.accept = "text/html" - post :using_resource_with_status_and_location - assert @response.redirect? - assert_equal "http://test.host/", @response.location - - @request.accept = "application/xml" - get :using_resource_with_status_and_location - assert_equal 201, @response.status - end - - def test_using_resource_with_responder - get :using_resource_with_responder - assert_equal "Resource name is david", @response.body - end - - def test_using_resource_with_set_responder - RespondWithController.responder = proc { |c, r, o| c.render :text => "Resource name is #{r.first.name}" } - get :using_resource - assert_equal "Resource name is david", @response.body - ensure - RespondWithController.responder = ActionController::Responder - end - - def test_error_is_raised_if_no_respond_to_is_declared_and_respond_with_is_called - @controller = EmptyRespondWithController.new - @request.accept = "*/*" - assert_raise RuntimeError do - get :index - end - end - - private - def with_test_route_set - with_routing do |set| - set.draw do |map| - resources :customers - resources :quiz_stores do - resources :customers - end - match ":controller/:action" - end - yield - end - end -end - -class AbstractPostController < ActionController::Base - self.view_paths = File.dirname(__FILE__) + "/../fixtures/post_test/" -end - -# For testing layouts which are set automatically -class PostController < AbstractPostController - around_filter :with_iphone - - def index - respond_to(:html, :iphone) - end - -protected - - def with_iphone - request.format = "iphone" if request.env["HTTP_ACCEPT"] == "text/iphone" - yield - end -end - -class SuperPostController < PostController -end - -class MimeControllerLayoutsTest < ActionController::TestCase - tests PostController - - def setup - super - @request.host = "www.example.com" - end - - def test_missing_layout_renders_properly - get :index - assert_equal '
Hello Firefox
', @response.body - - @request.accept = "text/iphone" - get :index - assert_equal 'Hello iPhone', @response.body - end - - def test_format_with_inherited_layouts - @controller = SuperPostController.new - - get :index - assert_equal '
Super Firefox
', @response.body - - @request.accept = "text/iphone" - get :index - assert_equal '
Super iPhone
', @response.body - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/bare_metal_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/bare_metal_test.rb deleted file mode 100644 index 575a1eba8..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/bare_metal_test.rb +++ /dev/null @@ -1,27 +0,0 @@ -require "abstract_unit" - -module BareMetalTest - class BareController < ActionController::Metal - def index - self.response_body = "Hello world" - end - end - - class BareTest < ActiveSupport::TestCase - test "response body is a Rack-compatible response" do - status, headers, body = BareController.action(:index).call(Rack::MockRequest.env_for("/")) - assert_equal 200, status - string = "" - - body.each do |part| - assert part.is_a?(String), "Each part of the body must be a String" - string << part - end - - assert_kind_of Hash, headers, "Headers must be a Hash" - assert headers["Content-Type"], "Content-Type must exist" - - assert_equal "Hello world", string - end - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/base_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/base_test.rb deleted file mode 100644 index 33bf4d849..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/base_test.rb +++ /dev/null @@ -1,132 +0,0 @@ -require 'abstract_unit' - -# Tests the controller dispatching happy path -module Dispatching - class SimpleController < ActionController::Base - before_filter :authenticate - - def index - render :text => "success" - end - - def modify_response_body - self.response_body = "success" - end - - def modify_response_body_twice - ret = (self.response_body = "success") - self.response_body = "#{ret}!" - end - - def modify_response_headers - end - - def show_actions - render :text => "actions: #{action_methods.to_a.sort.join(', ')}" - end - - protected - def authenticate - end - end - - class EmptyController < ActionController::Base ; end - class SubEmptyController < EmptyController ; end - class NonDefaultPathController < ActionController::Base - def self.controller_path; "i_am_not_default"; end - end - - module Submodule - class ContainedEmptyController < ActionController::Base ; end - class ContainedSubEmptyController < ContainedEmptyController ; end - class ContainedNonDefaultPathController < ActionController::Base - def self.controller_path; "i_am_extremly_not_default"; end - end - end - - class BaseTest < Rack::TestCase - # :api: plugin - test "simple dispatching" do - get "/dispatching/simple/index" - - assert_body "success" - assert_status 200 - assert_content_type "text/html; charset=utf-8" - end - - # :api: plugin - test "directly modifying response body" do - get "/dispatching/simple/modify_response_body" - - assert_body "success" - end - - # :api: plugin - test "directly modifying response body twice" do - get "/dispatching/simple/modify_response_body_twice" - - assert_body "success!" - end - - test "controller path" do - assert_equal 'dispatching/empty', EmptyController.controller_path - assert_equal EmptyController.controller_path, EmptyController.new.controller_path - end - - test "non-default controller path" do - assert_equal 'i_am_not_default', NonDefaultPathController.controller_path - assert_equal NonDefaultPathController.controller_path, NonDefaultPathController.new.controller_path - end - - test "sub controller path" do - assert_equal 'dispatching/sub_empty', SubEmptyController.controller_path - assert_equal SubEmptyController.controller_path, SubEmptyController.new.controller_path - end - - test "namespaced controller path" do - assert_equal 'dispatching/submodule/contained_empty', Submodule::ContainedEmptyController.controller_path - assert_equal Submodule::ContainedEmptyController.controller_path, Submodule::ContainedEmptyController.new.controller_path - end - - test "namespaced non-default controller path" do - assert_equal 'i_am_extremly_not_default', Submodule::ContainedNonDefaultPathController.controller_path - assert_equal Submodule::ContainedNonDefaultPathController.controller_path, Submodule::ContainedNonDefaultPathController.new.controller_path - end - - test "namespaced sub controller path" do - assert_equal 'dispatching/submodule/contained_sub_empty', Submodule::ContainedSubEmptyController.controller_path - assert_equal Submodule::ContainedSubEmptyController.controller_path, Submodule::ContainedSubEmptyController.new.controller_path - end - - test "controller name" do - assert_equal 'empty', EmptyController.controller_name - assert_equal 'contained_empty', Submodule::ContainedEmptyController.controller_name - end - - test "non-default path controller name" do - assert_equal 'non_default_path', NonDefaultPathController.controller_name - assert_equal 'contained_non_default_path', Submodule::ContainedNonDefaultPathController.controller_name - end - - test "sub controller name" do - assert_equal 'sub_empty', SubEmptyController.controller_name - assert_equal 'contained_sub_empty', Submodule::ContainedSubEmptyController.controller_name - end - - test "action methods" do - assert_equal Set.new(%w( - index - modify_response_headers - modify_response_body_twice - modify_response_body - show_actions - )), SimpleController.action_methods - - assert_equal Set.new, EmptyController.action_methods - assert_equal Set.new, Submodule::ContainedEmptyController.action_methods - - get "/dispatching/simple/show_actions" - assert_body "actions: index, modify_response_body, modify_response_body_twice, modify_response_headers, show_actions" - end - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/content_negotiation_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/content_negotiation_test.rb deleted file mode 100644 index 16639a84b..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/content_negotiation_test.rb +++ /dev/null @@ -1,18 +0,0 @@ -require 'abstract_unit' - -module ContentNegotiation - - # This has no layout and it works - class BasicController < ActionController::Base - self.view_paths = [ActionView::FixtureResolver.new( - "content_negotiation/basic/hello.html.erb" => "Hello world <%= request.formats.first.to_s %>!" - )] - end - - class TestContentNegotiation < Rack::TestCase - test "A */* Accept header will return HTML" do - get "/content_negotiation/basic/hello", {}, "HTTP_ACCEPT" => "*/*" - assert_body "Hello world */*!" - end - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/content_type_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/content_type_test.rb deleted file mode 100644 index 0d4f1b073..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/content_type_test.rb +++ /dev/null @@ -1,113 +0,0 @@ -require 'abstract_unit' - -module ContentType - class BaseController < ActionController::Base - def index - render :text => "Hello world!" - end - - def set_on_response_obj - response.content_type = Mime::RSS - render :text => "Hello world!" - end - - def set_on_render - render :text => "Hello world!", :content_type => Mime::RSS - end - end - - class ImpliedController < ActionController::Base - # Template's mime type is used if no content_type is specified - - self.view_paths = [ActionView::FixtureResolver.new( - "content_type/implied/i_am_html_erb.html.erb" => "Hello world!", - "content_type/implied/i_am_xml_erb.xml.erb" => "Hello world!", - "content_type/implied/i_am_html_builder.html.builder" => "xml.p 'Hello'", - "content_type/implied/i_am_xml_builder.xml.builder" => "xml.awesome 'Hello'", - "content_type/implied/i_am_js_rjs.js.rjs" => "page.alert 'hello'" - )] - end - - class CharsetController < ActionController::Base - def set_on_response_obj - response.charset = "utf-16" - render :text => "Hello world!" - end - - def set_as_nil_on_response_obj - response.charset = nil - render :text => "Hello world!" - end - end - - class ExplicitContentTypeTest < Rack::TestCase - test "default response is HTML and UTF8" do - get "/content_type/base" - - assert_body "Hello world!" - assert_header "Content-Type", "text/html; charset=utf-8" - end - - test "setting the content type of the response directly on the response object" do - get "/content_type/base/set_on_response_obj" - - assert_body "Hello world!" - assert_header "Content-Type", "application/rss+xml; charset=utf-8" - end - - test "setting the content type of the response as an option to render" do - get "/content_type/base/set_on_render" - - assert_body "Hello world!" - assert_header "Content-Type", "application/rss+xml; charset=utf-8" - end - end - - class ImpliedContentTypeTest < Rack::TestCase - test "sets Content-Type as text/html when rendering *.html.erb" do - get "/content_type/implied/i_am_html_erb" - - assert_header "Content-Type", "text/html; charset=utf-8" - end - - test "sets Content-Type as application/xml when rendering *.xml.erb" do - get "/content_type/implied/i_am_xml_erb", "format" => "xml" - - assert_header "Content-Type", "application/xml; charset=utf-8" - end - - test "sets Content-Type as text/html when rendering *.html.builder" do - get "/content_type/implied/i_am_html_builder" - - assert_header "Content-Type", "text/html; charset=utf-8" - end - - test "sets Content-Type as application/xml when rendering *.xml.builder" do - get "/content_type/implied/i_am_xml_builder", "format" => "xml" - - assert_header "Content-Type", "application/xml; charset=utf-8" - end - - test "sets Content-Type as text/javascript when rendering *.js" do - get "/content_type/implied/i_am_js_rjs", "format" => "js" - - assert_header "Content-Type", "text/javascript; charset=utf-8" - end - end - - class ExplicitCharsetTest < Rack::TestCase - test "setting the charset of the response directly on the response object" do - get "/content_type/charset/set_on_response_obj" - - assert_body "Hello world!" - assert_header "Content-Type", "text/html; charset=utf-16" - end - - test "setting the charset of the response as nil directly on the response object" do - get "/content_type/charset/set_as_nil_on_response_obj" - - assert_body "Hello world!" - assert_header "Content-Type", "text/html; charset=utf-8" - end - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/etag_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/etag_test.rb deleted file mode 100644 index 847b9feb0..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/etag_test.rb +++ /dev/null @@ -1,46 +0,0 @@ -require 'abstract_unit' - -module Etags - class BasicController < ActionController::Base - self.view_paths = [ActionView::FixtureResolver.new( - "etags/basic/base.html.erb" => "Hello from without_layout.html.erb", - "layouts/etags.html.erb" => "teh <%= yield %> tagz" - )] - - def without_layout - render :action => "base" - end - - def with_layout - render :action => "base", :layout => "etags" - end - end - - class EtagTest < Rack::TestCase - describe "Rendering without any special etag options returns an etag that is an MD5 hash of its text" - - test "an action without a layout" do - get "/etags/basic/without_layout" - - body = "Hello from without_layout.html.erb" - assert_body body - assert_header "Etag", etag_for(body) - assert_status 200 - end - - test "an action with a layout" do - get "/etags/basic/with_layout" - - body = "teh Hello from without_layout.html.erb tagz" - assert_body body - assert_header "Etag", etag_for(body) - assert_status 200 - end - - private - - def etag_for(text) - %("#{Digest::MD5.hexdigest(text)}") - end - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/metal_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/metal_test.rb deleted file mode 100644 index fbf5bb64f..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/metal_test.rb +++ /dev/null @@ -1,45 +0,0 @@ -require 'abstract_unit' - -module MetalTest - class MetalMiddleware < ActionController::Middleware - def call(env) - if env["PATH_INFO"] =~ /authed/ - app.call(env) - else - [401, headers, "Not authed!"] - end - end - end - - class Endpoint - def call(env) - [200, {}, "Hello World"] - end - end - - class TestMiddleware < ActiveSupport::TestCase - include RackTestUtils - - def setup - @app = Rack::Builder.new do - use MetalTest::MetalMiddleware - run MetalTest::Endpoint.new - end.to_app - end - - test "it can call the next app by using @app" do - env = Rack::MockRequest.env_for("/authed") - response = @app.call(env) - - assert_equal "Hello World", body_to_string(response[2]) - end - - test "it can return a response using the normal AC::Metal techniques" do - env = Rack::MockRequest.env_for("/") - response = @app.call(env) - - assert_equal "Not authed!", body_to_string(response[2]) - assert_equal 401, response[0] - end - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/middleware_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/middleware_test.rb deleted file mode 100644 index 8561ab3e4..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/middleware_test.rb +++ /dev/null @@ -1,88 +0,0 @@ -require 'abstract_unit' - -module MiddlewareTest - class MyMiddleware - def initialize(app) - @app = app - end - - def call(env) - result = @app.call(env) - result[1]["Middleware-Test"] = "Success" - result[1]["Middleware-Order"] = "First" - result - end - end - - class ExclaimerMiddleware - def initialize(app) - @app = app - end - - def call(env) - result = @app.call(env) - result[1]["Middleware-Order"] << "!" - result - end - end - - class MyController < ActionController::Metal - use MyMiddleware - middleware.insert_before MyMiddleware, ExclaimerMiddleware - - def index - self.response_body = "Hello World" - end - end - - class InheritedController < MyController - end - - class ActionsController < ActionController::Metal - use MyMiddleware, :only => :show - middleware.insert_before MyMiddleware, ExclaimerMiddleware, :except => :index - - def index - self.response_body = "index" - end - - def show - self.response_body = "show" - end - end - - class TestMiddleware < ActiveSupport::TestCase - def setup - @app = MyController.action(:index) - end - - test "middleware that is 'use'd is called as part of the Rack application" do - result = @app.call(env_for("/")) - assert_equal "Hello World", RackTestUtils.body_to_string(result[2]) - assert_equal "Success", result[1]["Middleware-Test"] - end - - test "the middleware stack is exposed as 'middleware' in the controller" do - result = @app.call(env_for("/")) - assert_equal "First!", result[1]["Middleware-Order"] - end - - test "middleware stack accepts only and except as options" do - result = ActionsController.action(:show).call(env_for("/")) - assert_equal "First!", result[1]["Middleware-Order"] - - result = ActionsController.action(:index).call(env_for("/")) - assert_nil result[1]["Middleware-Order"] - end - - def env_for(url) - Rack::MockRequest.env_for(url) - end - end - - class TestInheritedMiddleware < TestMiddleware - def setup - @app = InheritedController.action(:index) - end - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/render_action_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/render_action_test.rb deleted file mode 100644 index efeb6d6d2..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/render_action_test.rb +++ /dev/null @@ -1,320 +0,0 @@ -require 'abstract_unit' - -module RenderAction - # This has no layout and it works - class BasicController < ActionController::Base - self.view_paths = [ActionView::FixtureResolver.new( - "render_action/basic/hello_world.html.erb" => "Hello world!" - )] - - def hello_world - render :action => "hello_world" - end - - def hello_world_as_string - render "hello_world" - end - - def hello_world_as_string_with_options - render "hello_world", :status => 404 - end - - def hello_world_as_symbol - render :hello_world - end - - def hello_world_with_symbol - render :action => :hello_world - end - - def hello_world_with_layout - render :action => "hello_world", :layout => true - end - - def hello_world_with_layout_false - render :action => "hello_world", :layout => false - end - - def hello_world_with_layout_nil - render :action => "hello_world", :layout => nil - end - - def hello_world_with_custom_layout - render :action => "hello_world", :layout => "greetings" - end - - end - - class RenderActionTest < Rack::TestCase - test "rendering an action using :action => " do - get "/render_action/basic/hello_world" - - assert_body "Hello world!" - assert_status 200 - end - - test "rendering an action using ''" do - get "/render_action/basic/hello_world_as_string" - - assert_body "Hello world!" - assert_status 200 - end - - test "rendering an action using '' and options" do - get "/render_action/basic/hello_world_as_string_with_options" - - assert_body "Hello world!" - assert_status 404 - end - - test "rendering an action using :action" do - get "/render_action/basic/hello_world_as_symbol" - - assert_body "Hello world!" - assert_status 200 - end - - test "rendering an action using :action => :hello_world" do - get "/render_action/basic/hello_world_with_symbol" - - assert_body "Hello world!" - assert_status 200 - end - end - - class RenderLayoutTest < Rack::TestCase - describe "Both .html.erb and application.html.erb are missing" - - test "rendering with layout => true" do - assert_raise(ArgumentError) do - get "/render_action/basic/hello_world_with_layout", {}, "action_dispatch.show_exceptions" => false - end - end - - test "rendering with layout => false" do - get "/render_action/basic/hello_world_with_layout_false" - - assert_body "Hello world!" - assert_status 200 - end - - test "rendering with layout => :nil" do - get "/render_action/basic/hello_world_with_layout_nil" - - assert_body "Hello world!" - assert_status 200 - end - - test "rendering with layout => 'greetings'" do - assert_raise(ActionView::MissingTemplate) do - get "/render_action/basic/hello_world_with_custom_layout", {}, "action_dispatch.show_exceptions" => false - end - end - end -end - -module RenderActionWithApplicationLayout - # # ==== Render actions with layouts ==== - class BasicController < ::ApplicationController - # Set the view path to an application view structure with layouts - self.view_paths = [ActionView::FixtureResolver.new( - "render_action_with_application_layout/basic/hello_world.html.erb" => "Hello World!", - "render_action_with_application_layout/basic/hello.html.builder" => "xml.p 'Hello'", - "layouts/application.html.erb" => "Hi <%= yield %> OK, Bye", - "layouts/greetings.html.erb" => "Greetings <%= yield %> Bye", - "layouts/builder.html.builder" => "xml.html do\n xml << yield\nend" - )] - - def hello_world - render :action => "hello_world" - end - - def hello_world_with_layout - render :action => "hello_world", :layout => true - end - - def hello_world_with_layout_false - render :action => "hello_world", :layout => false - end - - def hello_world_with_layout_nil - render :action => "hello_world", :layout => nil - end - - def hello_world_with_custom_layout - render :action => "hello_world", :layout => "greetings" - end - - def with_builder_and_layout - render :action => "hello", :layout => "builder" - end - end - - class LayoutTest < Rack::TestCase - describe "Only application.html.erb is present and .html.erb is missing" - - test "rendering implicit application.html.erb as layout" do - get "/render_action_with_application_layout/basic/hello_world" - - assert_body "Hi Hello World! OK, Bye" - assert_status 200 - end - - test "rendering with layout => true" do - get "/render_action_with_application_layout/basic/hello_world_with_layout" - - assert_body "Hi Hello World! OK, Bye" - assert_status 200 - end - - test "rendering with layout => false" do - get "/render_action_with_application_layout/basic/hello_world_with_layout_false" - - assert_body "Hello World!" - assert_status 200 - end - - test "rendering with layout => :nil" do - get "/render_action_with_application_layout/basic/hello_world_with_layout_nil" - - assert_body "Hello World!" - assert_status 200 - end - - test "rendering with layout => 'greetings'" do - get "/render_action_with_application_layout/basic/hello_world_with_custom_layout" - - assert_body "Greetings Hello World! Bye" - assert_status 200 - end - end - - class TestLayout < Rack::TestCase - testing BasicController - - test "builder works with layouts" do - get :with_builder_and_layout - assert_response "\n

Hello

\n\n" - end - end - -end - -module RenderActionWithControllerLayout - class BasicController < ActionController::Base - self.view_paths = [ActionView::FixtureResolver.new( - "render_action_with_controller_layout/basic/hello_world.html.erb" => "Hello World!", - "layouts/render_action_with_controller_layout/basic.html.erb" => "With Controller Layout! <%= yield %> Bye" - )] - - def hello_world - render :action => "hello_world" - end - - def hello_world_with_layout - render :action => "hello_world", :layout => true - end - - def hello_world_with_layout_false - render :action => "hello_world", :layout => false - end - - def hello_world_with_layout_nil - render :action => "hello_world", :layout => nil - end - - def hello_world_with_custom_layout - render :action => "hello_world", :layout => "greetings" - end - end - - class ControllerLayoutTest < Rack::TestCase - describe "Only .html.erb is present and application.html.erb is missing" - - test "render hello_world and implicitly use .html.erb as a layout." do - get "/render_action_with_controller_layout/basic/hello_world" - - assert_body "With Controller Layout! Hello World! Bye" - assert_status 200 - end - - test "rendering with layout => true" do - get "/render_action_with_controller_layout/basic/hello_world_with_layout" - - assert_body "With Controller Layout! Hello World! Bye" - assert_status 200 - end - - test "rendering with layout => false" do - get "/render_action_with_controller_layout/basic/hello_world_with_layout_false" - - assert_body "Hello World!" - assert_status 200 - end - - test "rendering with layout => :nil" do - get "/render_action_with_controller_layout/basic/hello_world_with_layout_nil" - - assert_body "Hello World!" - assert_status 200 - end - end -end - -module RenderActionWithBothLayouts - class BasicController < ActionController::Base - self.view_paths = [ActionView::FixtureResolver.new({ - "render_action_with_both_layouts/basic/hello_world.html.erb" => "Hello World!", - "layouts/application.html.erb" => "Oh Hi <%= yield %> Bye", - "layouts/render_action_with_both_layouts/basic.html.erb" => "With Controller Layout! <%= yield %> Bye" - })] - - def hello_world - render :action => "hello_world" - end - - def hello_world_with_layout - render :action => "hello_world", :layout => true - end - - def hello_world_with_layout_false - render :action => "hello_world", :layout => false - end - - def hello_world_with_layout_nil - render :action => "hello_world", :layout => nil - end - end - - class ControllerLayoutTest < Rack::TestCase - describe "Both .html.erb and application.html.erb are present" - - test "rendering implicitly use .html.erb over application.html.erb as a layout" do - get "/render_action_with_both_layouts/basic/hello_world" - - assert_body "With Controller Layout! Hello World! Bye" - assert_status 200 - end - - test "rendering with layout => true" do - get "/render_action_with_both_layouts/basic/hello_world_with_layout" - - assert_body "With Controller Layout! Hello World! Bye" - assert_status 200 - end - - test "rendering with layout => false" do - get "/render_action_with_both_layouts/basic/hello_world_with_layout_false" - - assert_body "Hello World!" - assert_status 200 - end - - test "rendering with layout => :nil" do - get "/render_action_with_both_layouts/basic/hello_world_with_layout_nil" - - assert_body "Hello World!" - assert_status 200 - end - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/render_file_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/render_file_test.rb deleted file mode 100644 index fce10210c..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/render_file_test.rb +++ /dev/null @@ -1,99 +0,0 @@ -require 'abstract_unit' - -module RenderFile - class BasicController < ActionController::Base - self.view_paths = File.dirname(__FILE__) - - def index - render :file => File.join(File.dirname(__FILE__), *%w[.. .. fixtures test hello_world]) - end - - def with_instance_variables - @secret = 'in the sauce' - render :file => File.join(File.dirname(__FILE__), '../../fixtures/test/render_file_with_ivar.erb') - end - - def without_file_key - render File.join(File.dirname(__FILE__), *%w[.. .. fixtures test hello_world]) - end - - def without_file_key_with_instance_variable - @secret = 'in the sauce' - render File.join(File.dirname(__FILE__), '../../fixtures/test/render_file_with_ivar.erb') - end - - def relative_path - @secret = 'in the sauce' - render :file => '../../fixtures/test/render_file_with_ivar' - end - - def relative_path_with_dot - @secret = 'in the sauce' - render :file => '../../fixtures/test/dot.directory/render_file_with_ivar' - end - - def pathname - @secret = 'in the sauce' - render :file => Pathname.new(File.dirname(__FILE__)).join(*%w[.. .. fixtures test dot.directory render_file_with_ivar.erb]) - end - - def with_locals - path = File.join(File.dirname(__FILE__), '../../fixtures/test/render_file_with_locals.erb') - render :file => path, :locals => {:secret => 'in the sauce'} - end - - def without_file_key_with_locals - path = FIXTURES.join('test/render_file_with_locals.erb').to_s - render path, :locals => {:secret => 'in the sauce'} - end - end - - class TestBasic < Rack::TestCase - testing RenderFile::BasicController - - test "rendering simple template" do - get :index - assert_response "Hello world!" - end - - test "rendering template with ivar" do - get :with_instance_variables - assert_response "The secret is in the sauce\n" - end - - test "rendering path without specifying the :file key" do - get :without_file_key - assert_response "Hello world!" - end - - test "rendering path without specifying the :file key with ivar" do - get :without_file_key_with_instance_variable - assert_response "The secret is in the sauce\n" - end - - test "rendering a relative path" do - get :relative_path - assert_response "The secret is in the sauce\n" - end - - test "rendering a relative path with dot" do - get :relative_path_with_dot - assert_response "The secret is in the sauce\n" - end - - test "rendering a Pathname" do - get :pathname - assert_response "The secret is in the sauce\n" - end - - test "rendering file with locals" do - get :with_locals - assert_response "The secret is in the sauce\n" - end - - test "rendering path without specifying the :file key with locals" do - get :without_file_key_with_locals - assert_response "The secret is in the sauce\n" - end - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/render_implicit_action_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/render_implicit_action_test.rb deleted file mode 100644 index 67a690fab..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/render_implicit_action_test.rb +++ /dev/null @@ -1,28 +0,0 @@ -require 'abstract_unit' - -module RenderImplicitAction - class SimpleController < ::ApplicationController - self.view_paths = [ActionView::FixtureResolver.new( - "render_implicit_action/simple/hello_world.html.erb" => "Hello world!", - "render_implicit_action/simple/hyphen-ated.html.erb" => "Hello hyphen-ated!" - )] - - def hello_world() end - end - - class RenderImplicitActionTest < Rack::TestCase - test "render a simple action with new explicit call to render" do - get "/render_implicit_action/simple/hello_world" - - assert_body "Hello world!" - assert_status 200 - end - - test "render an action with a missing method and has special characters" do - get "/render_implicit_action/simple/hyphen-ated" - - assert_body "Hello hyphen-ated!" - assert_status 200 - end - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/render_layout_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/render_layout_test.rb deleted file mode 100644 index a5b9d69f3..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/render_layout_test.rb +++ /dev/null @@ -1,101 +0,0 @@ -require 'abstract_unit' - -module ControllerLayouts - class ImplicitController < ::ApplicationController - self.view_paths = [ActionView::FixtureResolver.new( - "layouts/application.html.erb" => "Main <%= yield %> Layout", - "layouts/override.html.erb" => "Override! <%= yield %>", - "basic.html.erb" => "Hello world!", - "controller_layouts/implicit/layout_false.html.erb" => "hi(layout_false.html.erb)" - )] - - def index - render :template => "basic" - end - - def override - render :template => "basic", :layout => "override" - end - - def layout_false - render :layout => false - end - - def builder_override - end - end - - class ImplicitNameController < ::ApplicationController - self.view_paths = [ActionView::FixtureResolver.new( - "layouts/controller_layouts/implicit_name.html.erb" => "Implicit <%= yield %> Layout", - "basic.html.erb" => "Hello world!" - )] - - def index - render :template => "basic" - end - end - - class RenderLayoutTest < Rack::TestCase - test "rendering a normal template, but using the implicit layout" do - get "/controller_layouts/implicit/index" - - assert_body "Main Hello world! Layout" - assert_status 200 - end - - test "rendering a normal template, but using an implicit NAMED layout" do - get "/controller_layouts/implicit_name/index" - - assert_body "Implicit Hello world! Layout" - assert_status 200 - end - - test "overriding an implicit layout with render :layout option" do - get "/controller_layouts/implicit/override" - assert_body "Override! Hello world!" - end - - end - - class LayoutOptionsTest < Rack::TestCase - testing ControllerLayouts::ImplicitController - - test "rendering with :layout => false leaves out the implicit layout" do - get :layout_false - assert_response "hi(layout_false.html.erb)" - end - end - - class MismatchFormatController < ::ApplicationController - self.view_paths = [ActionView::FixtureResolver.new( - "layouts/application.html.erb" => "<%= yield %>", - "controller_layouts/mismatch_format/index.js.rjs" => "page[:test].ext", - "controller_layouts/mismatch_format/implicit.rjs" => "page[:test].ext" - )] - - def explicit - render :layout => "application" - end - end - - class MismatchFormatTest < Rack::TestCase - testing ControllerLayouts::MismatchFormatController - - test "if JS is selected, an HTML template is not also selected" do - get :index, "format" => "js" - assert_response "$(\"test\").ext();" - end - - test "if JS is implicitly selected, an HTML template is not also selected" do - get :implicit - assert_response "$(\"test\").ext();" - end - - test "if an HTML template is explicitly provides for a JS template, an error is raised" do - assert_raises ActionView::MissingTemplate do - get :explicit, {}, "action_dispatch.show_exceptions" => false - end - end - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/render_partial_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/render_partial_test.rb deleted file mode 100644 index 53b76248f..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/render_partial_test.rb +++ /dev/null @@ -1,27 +0,0 @@ -require 'abstract_unit' - -module RenderPartial - - class BasicController < ActionController::Base - - self.view_paths = [ActionView::FixtureResolver.new( - "render_partial/basic/_basic.html.erb" => "BasicPartial!", - "render_partial/basic/basic.html.erb" => "<%= @test_unchanged = 'goodbye' %><%= render :partial => 'basic' %><%= @test_unchanged %>" - )] - - def changing - @test_unchanged = 'hello' - render :action => "basic" - end - end - - class TestPartial < Rack::TestCase - testing BasicController - - test "rendering a partial in ActionView doesn't pull the ivars again from the controller" do - get :changing - assert_response("goodbyeBasicPartial!goodbye") - end - end - -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/render_rjs_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/render_rjs_test.rb deleted file mode 100644 index a6f195a0a..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/render_rjs_test.rb +++ /dev/null @@ -1,71 +0,0 @@ -require 'abstract_unit' - -module RenderRjs - class BasicController < ActionController::Base - layout "application", :only => :index_respond_to - - self.view_paths = [ActionView::FixtureResolver.new( - "layouts/application.html.erb" => "", - "render_rjs/basic/index.js.rjs" => "page[:customer].replace_html render(:partial => 'customer')", - "render_rjs/basic/index_html.js.rjs" => "page[:customer].replace_html :partial => 'customer'", - "render_rjs/basic/index_no_js.js.erb" => "<%= render(:partial => 'developer') %>", - "render_rjs/basic/_customer.js.erb" => "JS Partial", - "render_rjs/basic/_customer.html.erb" => "HTML Partial", - "render_rjs/basic/_developer.html.erb" => "HTML Partial", - "render_rjs/basic/index_locale.js.rjs" => "page[:customer].replace_html :partial => 'customer'", - "render_rjs/basic/_customer.da.html.erb" => "Danish HTML Partial", - "render_rjs/basic/_customer.da.js.erb" => "Danish JS Partial" - )] - - def index - render - end - - def index_respond_to - respond_to do |format| - format.js { render :action => "index_no_js" } - end - end - - def index_locale - self.locale = :da - end - end - - class TestBasic < Rack::TestCase - testing BasicController - - def setup - @old_locale = I18n.locale - end - - def teardown - I18n.locale = @old_locale - end - - test "rendering a partial in an RJS template should pick the JS template over the HTML one" do - get :index, "format" => "js" - assert_response("$(\"customer\").update(\"JS Partial\");") - end - - test "rendering a partial in an RJS template should pick the HTML one if no JS is available" do - get :index_no_js, "format" => "js" - assert_response("HTML Partial") - end - - test "rendering a partial in an RJS template should pick the HTML one if no JS is available on respond_to" do - get :index_respond_to, "format" => "js" - assert_response("HTML Partial") - end - - test "replacing an element with a partial in an RJS template should pick the HTML template over the JS one" do - get :index_html, "format" => "js" - assert_response("$(\"customer\").update(\"HTML Partial\");") - end - - test "replacing an element with a partial in an RJS template with a locale should pick the localed HTML template" do - get :index_locale, "format" => "js" - assert_response("$(\"customer\").update(\"Danish HTML Partial\");") - end - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/render_template_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/render_template_test.rb deleted file mode 100644 index db7aba669..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/render_template_test.rb +++ /dev/null @@ -1,182 +0,0 @@ -require 'abstract_unit' - -module RenderTemplate - class WithoutLayoutController < ActionController::Base - - self.view_paths = [ActionView::FixtureResolver.new( - "test/basic.html.erb" => "Hello from basic.html.erb", - "shared.html.erb" => "Elastica", - "locals.html.erb" => "The secret is <%= secret %>", - "xml_template.xml.builder" => "xml.html do\n xml.p 'Hello'\nend", - "with_raw.html.erb" => "Hello <%=raw 'this is raw' %>" - )] - - def index - render :template => "test/basic" - end - - def index_without_key - render "test/basic" - end - - def in_top_directory - render :template => 'shared' - end - - def in_top_directory_with_slash - render :template => '/shared' - end - - def in_top_directory_with_slash_without_key - render '/shared' - end - - def with_locals - render :template => "locals", :locals => { :secret => 'area51' } - end - - def builder_template - render :template => "xml_template" - end - - def with_raw - render :template => "with_raw" - end - end - - class TestWithoutLayout < Rack::TestCase - testing RenderTemplate::WithoutLayoutController - - test "rendering a normal template with full path without layout" do - get :index - assert_response "Hello from basic.html.erb" - end - - test "rendering a normal template with full path without layout without key" do - get :index_without_key - assert_response "Hello from basic.html.erb" - end - - test "rendering a template not in a subdirectory" do - get :in_top_directory - assert_response "Elastica" - end - - test "rendering a template not in a subdirectory with a leading slash" do - get :in_top_directory_with_slash - assert_response "Elastica" - end - - test "rendering a template not in a subdirectory with a leading slash without key" do - get :in_top_directory_with_slash_without_key - assert_response "Elastica" - end - - test "rendering a template with local variables" do - get :with_locals - assert_response "The secret is area51" - end - - test "rendering a builder template" do - get :builder_template, "format" => "xml" - assert_response "\n

Hello

\n\n" - end - - test "rendering a template with <%=raw stuff %>" do - get :with_raw - - assert_body "Hello this is raw" - assert_status 200 - end - end - - class WithLayoutController < ::ApplicationController - self.view_paths = [ActionView::FixtureResolver.new( - "test/basic.html.erb" => "Hello from basic.html.erb", - "shared.html.erb" => "Elastica", - "layouts/application.html.erb" => "<%= yield %>, I'm here!", - "layouts/greetings.html.erb" => "<%= yield %>, I wish thee well." - )] - - def index - render :template => "test/basic" - end - - def with_layout - render :template => "test/basic", :layout => true - end - - def with_layout_false - render :template => "test/basic", :layout => false - end - - def with_layout_nil - render :template => "test/basic", :layout => nil - end - - def with_custom_layout - render :template => "test/basic", :layout => "greetings" - end - end - - class TestWithLayout < Rack::TestCase - describe "Rendering with :template using implicit or explicit layout" - - test "rendering with implicit layout" do - get "/render_template/with_layout" - - assert_body "Hello from basic.html.erb, I'm here!" - assert_status 200 - end - - test "rendering with layout => :true" do - get "/render_template/with_layout/with_layout" - - assert_body "Hello from basic.html.erb, I'm here!" - assert_status 200 - end - - test "rendering with layout => :false" do - get "/render_template/with_layout/with_layout_false" - - assert_body "Hello from basic.html.erb" - assert_status 200 - end - - test "rendering with layout => :nil" do - get "/render_template/with_layout/with_layout_nil" - - assert_body "Hello from basic.html.erb" - assert_status 200 - end - - test "rendering layout => 'greetings'" do - get "/render_template/with_layout/with_custom_layout" - - assert_body "Hello from basic.html.erb, I wish thee well." - assert_status 200 - end - end - - module Compatibility - class WithoutLayoutController < ActionController::Base - self.view_paths = [ActionView::FixtureResolver.new( - "test/basic.html.erb" => "Hello from basic.html.erb", - "shared.html.erb" => "Elastica" - )] - - def with_forward_slash - render :template => "/test/basic" - end - end - - class TestTemplateRenderWithForwardSlash < Rack::TestCase - test "rendering a normal template with full path starting with a leading slash" do - get "/render_template/compatibility/without_layout/with_forward_slash" - - assert_body "Hello from basic.html.erb" - assert_status 200 - end - end - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/render_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/render_test.rb deleted file mode 100644 index 717cd5e92..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/render_test.rb +++ /dev/null @@ -1,85 +0,0 @@ -require 'abstract_unit' - -module Render - class BlankRenderController < ActionController::Base - self.view_paths = [ActionView::FixtureResolver.new( - "render/blank_render/index.html.erb" => "Hello world!", - "render/blank_render/access_request.html.erb" => "The request: <%= request.method.to_s.upcase %>", - "render/blank_render/access_action_name.html.erb" => "Action Name: <%= action_name %>", - "render/blank_render/access_controller_name.html.erb" => "Controller Name: <%= controller_name %>" - )] - - def index - render - end - - def access_request - render :action => "access_request" - end - - def render_action_name - render :action => "access_action_name" - end - - private - - def secretz - render :text => "FAIL WHALE!" - end - end - - class DoubleRenderController < ActionController::Base - def index - render :text => "hello" - render :text => "world" - end - end - - class RenderTest < Rack::TestCase - test "render with blank" do - get "/render/blank_render" - - assert_body "Hello world!" - assert_status 200 - end - - test "rendering more than once raises an exception" do - assert_raises(AbstractController::DoubleRenderError) do - get "/render/double_render", {}, "action_dispatch.show_exceptions" => false - end - end - end - - class TestOnlyRenderPublicActions < Rack::TestCase - describe "Only public methods on actual controllers are callable actions" - - test "raises an exception when a method of Object is called" do - assert_raises(AbstractController::ActionNotFound) do - get "/render/blank_render/clone", {}, "action_dispatch.show_exceptions" => false - end - end - - test "raises an exception when a private method is called" do - assert_raises(AbstractController::ActionNotFound) do - get "/render/blank_render/secretz", {}, "action_dispatch.show_exceptions" => false - end - end - end - - class TestVariousObjectsAvailableInView < Rack::TestCase - test "The request object is accessible in the view" do - get "/render/blank_render/access_request" - assert_body "The request: GET" - end - - test "The action_name is accessible in the view" do - get "/render/blank_render/render_action_name" - assert_body "Action Name: render_action_name" - end - - test "The controller_name is accessible in the view" do - get "/render/blank_render/access_controller_name" - assert_body "Controller Name: blank_render" - end - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/render_text_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/render_text_test.rb deleted file mode 100644 index 11c3f1193..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/render_text_test.rb +++ /dev/null @@ -1,137 +0,0 @@ -require 'abstract_unit' - -module RenderText - class SimpleController < ActionController::Base - self.view_paths = [ActionView::FixtureResolver.new] - - def index - render :text => "hello david" - end - end - - class WithLayoutController < ::ApplicationController - self.view_paths = [ActionView::FixtureResolver.new( - "layouts/application.html.erb" => "<%= yield %>, I'm here!", - "layouts/greetings.html.erb" => "<%= yield %>, I wish thee well.", - "layouts/ivar.html.erb" => "<%= yield %>, <%= @ivar %>" - )] - - def index - render :text => "hello david" - end - - def custom_code - render :text => "hello world", :status => 404 - end - - def with_custom_code_as_string - render :text => "hello world", :status => "404 Not Found" - end - - def with_nil - render :text => nil - end - - def with_nil_and_status - render :text => nil, :status => 403 - end - - def with_false - render :text => false - end - - def with_layout_true - render :text => "hello world", :layout => true - end - - def with_layout_false - render :text => "hello world", :layout => false - end - - def with_layout_nil - render :text => "hello world", :layout => nil - end - - def with_custom_layout - render :text => "hello world", :layout => "greetings" - end - - def with_ivar_in_layout - @ivar = "hello world" - render :text => "hello world", :layout => "ivar" - end - end - - class RenderTextTest < Rack::TestCase - describe "Rendering text using render :text" - - test "rendering text from a action with default options renders the text with the layout" do - get "/render_text/simple" - assert_body "hello david" - assert_status 200 - end - - test "rendering text from a action with default options renders the text without the layout" do - get "/render_text/with_layout" - - assert_body "hello david" - assert_status 200 - end - - test "rendering text, while also providing a custom status code" do - get "/render_text/with_layout/custom_code" - - assert_body "hello world" - assert_status 404 - end - - test "rendering text with nil returns an empty body padded for Safari" do - get "/render_text/with_layout/with_nil" - - assert_body " " - assert_status 200 - end - - test "Rendering text with nil and custom status code returns an empty body padded for Safari and the status" do - get "/render_text/with_layout/with_nil_and_status" - - assert_body " " - assert_status 403 - end - - test "rendering text with false returns the string 'false'" do - get "/render_text/with_layout/with_false" - - assert_body "false" - assert_status 200 - end - - test "rendering text with :layout => true" do - get "/render_text/with_layout/with_layout_true" - - assert_body "hello world, I'm here!" - assert_status 200 - end - - test "rendering text with :layout => 'greetings'" do - get "/render_text/with_layout/with_custom_layout" - - assert_body "hello world, I wish thee well." - assert_status 200 - end - - test "rendering text with :layout => false" do - get "/render_text/with_layout/with_layout_false" - - assert_body "hello world" - assert_status 200 - end - - test "rendering text with :layout => nil" do - get "/render_text/with_layout/with_layout_nil" - - assert_body "hello world" - assert_status 200 - end - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/render_xml_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/render_xml_test.rb deleted file mode 100644 index 130936730..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/new_base/render_xml_test.rb +++ /dev/null @@ -1,11 +0,0 @@ -require 'abstract_unit' - -module RenderXml - - # This has no layout and it works - class BasicController < ActionController::Base - self.view_paths = [ActionView::FixtureResolver.new( - "render_xml/basic/with_render_erb" => "Hello world!" - )] - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/output_escaping_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/output_escaping_test.rb deleted file mode 100644 index 1d78d31ff..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/output_escaping_test.rb +++ /dev/null @@ -1,19 +0,0 @@ -require 'abstract_unit' - -class OutputEscapingTest < ActiveSupport::TestCase - - test "escape_html shouldn't die when passed nil" do - assert_blank ERB::Util.h(nil) - end - - test "escapeHTML should escape strings" do - assert_equal "<>"", ERB::Util.h("<>\"") - end - - test "escapeHTML shouldn't touch explicitly safe strings" do - # TODO this seems easier to compose and reason about, but - # this should be verified - assert_equal "<", ERB::Util.h("<".html_safe) - end - -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/record_identifier_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/record_identifier_test.rb deleted file mode 100644 index 88a58bde5..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/record_identifier_test.rb +++ /dev/null @@ -1,65 +0,0 @@ -require 'abstract_unit' - -class Comment - extend ActiveModel::Naming - include ActiveModel::Conversion - - attr_reader :id - def to_key; id ? [id] : nil end - def save; @id = 1 end - def new_record?; @id.nil? end - def name - @id.nil? ? 'new comment' : "comment ##{@id}" - end -end - -class Sheep - extend ActiveModel::Naming - include ActiveModel::Conversion - - attr_reader :id - def to_key; id ? [id] : nil end - def save; @id = 1 end - def new_record?; @id.nil? end - def name - @id.nil? ? 'new sheep' : "sheep ##{@id}" - end -end - -class RecordIdentifierTest < Test::Unit::TestCase - include ActionController::RecordIdentifier - - def setup - @klass = Comment - @record = @klass.new - @singular = 'comment' - @plural = 'comments' - @uncountable = Sheep - end - - def test_dom_id_with_new_record - assert_equal "new_#{@singular}", dom_id(@record) - end - - def test_dom_id_with_new_record_and_prefix - assert_equal "custom_prefix_#{@singular}", dom_id(@record, :custom_prefix) - end - - def test_dom_id_with_saved_record - @record.save - assert_equal "#{@singular}_1", dom_id(@record) - end - - def test_dom_id_with_prefix - @record.save - assert_equal "edit_#{@singular}_1", dom_id(@record, :edit) - end - - def test_dom_class - assert_equal @singular, dom_class(@record) - end - - def test_dom_class_with_prefix - assert_equal "custom_prefix_#{@singular}", dom_class(@record, :custom_prefix) - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/redirect_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/redirect_test.rb deleted file mode 100644 index 429b3baa1..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/redirect_test.rb +++ /dev/null @@ -1,291 +0,0 @@ -require 'abstract_unit' - -class WorkshopsController < ActionController::Base -end - -class Workshop - extend ActiveModel::Naming - include ActiveModel::Conversion - attr_accessor :id - - def initialize(id) - @id = id - end - - def persisted? - id.present? - end - - def to_s - id.to_s - end -end - -class RedirectController < ActionController::Base - def simple_redirect - redirect_to :action => "hello_world" - end - - def redirect_with_status - redirect_to({:action => "hello_world", :status => 301}) - end - - def redirect_with_status_hash - redirect_to({:action => "hello_world"}, {:status => 301}) - end - - def redirect_with_protocol - redirect_to :action => "hello_world", :protocol => "https" - end - - def url_redirect_with_status - redirect_to("http://www.example.com", :status => :moved_permanently) - end - - def url_redirect_with_status_hash - redirect_to("http://www.example.com", {:status => 301}) - end - - def relative_url_redirect_with_status - redirect_to("/things/stuff", :status => :found) - end - - def relative_url_redirect_with_status_hash - redirect_to("/things/stuff", {:status => 301}) - end - - def redirect_to_back_with_status - redirect_to :back, :status => 307 - end - - def host_redirect - redirect_to :action => "other_host", :only_path => false, :host => 'other.test.host' - end - - def module_redirect - redirect_to :controller => 'module_test/module_redirect', :action => "hello_world" - end - - def redirect_with_assigns - @hello = "world" - redirect_to :action => "hello_world" - end - - def redirect_to_url - redirect_to "http://www.rubyonrails.org/" - end - - def redirect_to_url_with_unescaped_query_string - redirect_to "http://dev.rubyonrails.org/query?status=new" - end - - def redirect_to_url_with_complex_scheme - redirect_to "x-test+scheme.complex:redirect" - end - - def redirect_to_back - redirect_to :back - end - - def redirect_to_existing_record - redirect_to Workshop.new(5) - end - - def redirect_to_new_record - redirect_to Workshop.new(nil) - end - - def redirect_to_nil - redirect_to nil - end - - def rescue_errors(e) raise e end - - def rescue_action(e) raise end - - protected - def dashbord_url(id, message) - url_for :action => "dashboard", :params => { "id" => id, "message" => message } - end -end - -class RedirectTest < ActionController::TestCase - tests RedirectController - - def test_simple_redirect - get :simple_redirect - assert_response :redirect - assert_equal "http://test.host/redirect/hello_world", redirect_to_url - end - - def test_redirect_with_no_status - get :simple_redirect - assert_response 302 - assert_equal "http://test.host/redirect/hello_world", redirect_to_url - end - - def test_redirect_with_status - get :redirect_with_status - assert_response 301 - assert_equal "http://test.host/redirect/hello_world", redirect_to_url - end - - def test_redirect_with_status_hash - get :redirect_with_status_hash - assert_response 301 - assert_equal "http://test.host/redirect/hello_world", redirect_to_url - end - - def test_redirect_with_protocol - get :redirect_with_protocol - assert_response 302 - assert_equal "https://test.host/redirect/hello_world", redirect_to_url - end - - def test_url_redirect_with_status - get :url_redirect_with_status - assert_response 301 - assert_equal "http://www.example.com", redirect_to_url - end - - def test_url_redirect_with_status_hash - get :url_redirect_with_status_hash - assert_response 301 - assert_equal "http://www.example.com", redirect_to_url - end - - - def test_relative_url_redirect_with_status - get :relative_url_redirect_with_status - assert_response 302 - assert_equal "http://test.host/things/stuff", redirect_to_url - end - - def test_relative_url_redirect_with_status_hash - get :relative_url_redirect_with_status_hash - assert_response 301 - assert_equal "http://test.host/things/stuff", redirect_to_url - end - - def test_redirect_to_back_with_status - @request.env["HTTP_REFERER"] = "http://www.example.com/coming/from" - get :redirect_to_back_with_status - assert_response 307 - assert_equal "http://www.example.com/coming/from", redirect_to_url - end - - def test_simple_redirect_using_options - get :host_redirect - assert_response :redirect - assert_redirected_to :action => "other_host", :only_path => false, :host => 'other.test.host' - end - - def test_module_redirect - get :module_redirect - assert_response :redirect - assert_redirected_to "http://test.host/module_test/module_redirect/hello_world" - end - - def test_module_redirect_using_options - get :module_redirect - assert_response :redirect - assert_redirected_to :controller => 'module_test/module_redirect', :action => 'hello_world' - end - - def test_redirect_with_assigns - get :redirect_with_assigns - assert_response :redirect - assert_equal "world", assigns["hello"] - end - - def test_redirect_to_url - get :redirect_to_url - assert_response :redirect - assert_redirected_to "http://www.rubyonrails.org/" - end - - def test_redirect_to_url_with_unescaped_query_string - get :redirect_to_url_with_unescaped_query_string - assert_response :redirect - assert_redirected_to "http://dev.rubyonrails.org/query?status=new" - end - - def test_redirect_to_url_with_complex_scheme - get :redirect_to_url_with_complex_scheme - assert_response :redirect - assert_equal "x-test+scheme.complex:redirect", redirect_to_url - end - - def test_redirect_to_back - @request.env["HTTP_REFERER"] = "http://www.example.com/coming/from" - get :redirect_to_back - assert_response :redirect - assert_equal "http://www.example.com/coming/from", redirect_to_url - end - - def test_redirect_to_back_with_no_referer - assert_raise(ActionController::RedirectBackError) { - @request.env["HTTP_REFERER"] = nil - get :redirect_to_back - } - end - - def test_redirect_to_record - with_routing do |set| - set.draw do |map| - resources :workshops - match ':controller/:action' - end - - get :redirect_to_existing_record - assert_equal "http://test.host/workshops/5", redirect_to_url - assert_redirected_to Workshop.new(5) - - get :redirect_to_new_record - assert_equal "http://test.host/workshops", redirect_to_url - assert_redirected_to Workshop.new(nil) - end - end - - def test_redirect_to_nil - assert_raise(ActionController::ActionControllerError) do - get :redirect_to_nil - end - end -end - -module ModuleTest - class ModuleRedirectController < ::RedirectController - def module_redirect - redirect_to :controller => '/redirect', :action => "hello_world" - end - end - - class ModuleRedirectTest < ActionController::TestCase - tests ModuleRedirectController - - def test_simple_redirect - get :simple_redirect - assert_response :redirect - assert_equal "http://test.host/module_test/module_redirect/hello_world", redirect_to_url - end - - def test_simple_redirect_using_options - get :host_redirect - assert_response :redirect - assert_redirected_to :action => "other_host", :only_path => false, :host => 'other.test.host' - end - - def test_module_redirect - get :module_redirect - assert_response :redirect - assert_equal "http://test.host/redirect/hello_world", redirect_to_url - end - - def test_module_redirect_using_options - get :module_redirect - assert_response :redirect - assert_redirected_to :controller => '/redirect', :action => "hello_world" - end - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/render_js_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/render_js_test.rb deleted file mode 100644 index 636701b98..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/render_js_test.rb +++ /dev/null @@ -1,43 +0,0 @@ -require 'abstract_unit' -require 'controller/fake_models' -require 'pathname' - -class RenderJSTest < ActionController::TestCase - class TestController < ActionController::Base - protect_from_forgery - - def self.controller_path - 'test' - end - - def render_vanilla_js_hello - render :js => "alert('hello')" - end - - def greeting - # let's just rely on the template - end - - def show_partial - render :partial => 'partial' - end - end - - tests TestController - - def test_render_vanilla_js - get :render_vanilla_js_hello - assert_equal "alert('hello')", @response.body - assert_equal "text/javascript", @response.content_type - end - - def test_render_with_default_from_accept_header - xhr :get, :greeting - assert_equal "$(\"body\").visualEffect(\"highlight\");", @response.body - end - - def test_should_render_js_partial - xhr :get, :show_partial, :format => 'js' - assert_equal 'partial js', @response.body - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/render_json_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/render_json_test.rb deleted file mode 100644 index 4cedec732..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/render_json_test.rb +++ /dev/null @@ -1,112 +0,0 @@ -require 'abstract_unit' -require 'controller/fake_models' -require 'pathname' - -class RenderJsonTest < ActionController::TestCase - class JsonRenderable - def as_json(options={}) - hash = { :a => :b, :c => :d, :e => :f } - hash.except!(*options[:except]) if options[:except] - hash - end - end - - class TestController < ActionController::Base - protect_from_forgery - - def self.controller_path - 'test' - end - - def render_json_nil - render :json => nil - end - - def render_json_hello_world - render :json => ActiveSupport::JSON.encode(:hello => 'world') - end - - def render_json_hello_world_with_status - render :json => ActiveSupport::JSON.encode(:hello => 'world'), :status => 401 - end - - def render_json_hello_world_with_callback - render :json => ActiveSupport::JSON.encode(:hello => 'world'), :callback => 'alert' - end - - def render_json_with_custom_content_type - render :json => ActiveSupport::JSON.encode(:hello => 'world'), :content_type => 'text/javascript' - end - - def render_symbol_json - render :json => ActiveSupport::JSON.encode(:hello => 'world') - end - - def render_json_with_render_to_string - render :json => {:hello => render_to_string(:partial => 'partial')} - end - - def render_json_with_extra_options - render :json => JsonRenderable.new, :except => [:c, :e] - end - end - - tests TestController - - def setup - # enable a logger so that (e.g.) the benchmarking stuff runs, so we can get - # a more accurate simulation of what happens in "real life". - super - @controller.logger = Logger.new(nil) - - @request.host = "www.nextangle.com" - end - - def test_render_json_nil - get :render_json_nil - assert_equal 'null', @response.body - assert_equal 'application/json', @response.content_type - end - - def test_render_json - get :render_json_hello_world - assert_equal '{"hello":"world"}', @response.body - assert_equal 'application/json', @response.content_type - end - - def test_render_json_with_status - get :render_json_hello_world_with_status - assert_equal '{"hello":"world"}', @response.body - assert_equal 401, @response.status - end - - def test_render_json_with_callback - get :render_json_hello_world_with_callback - assert_equal 'alert({"hello":"world"})', @response.body - assert_equal 'application/json', @response.content_type - end - - def test_render_json_with_custom_content_type - get :render_json_with_custom_content_type - assert_equal '{"hello":"world"}', @response.body - assert_equal 'text/javascript', @response.content_type - end - - def test_render_symbol_json - get :render_symbol_json - assert_equal '{"hello":"world"}', @response.body - assert_equal 'application/json', @response.content_type - end - - def test_render_json_with_render_to_string - get :render_json_with_render_to_string - assert_equal '{"hello":"partial html"}', @response.body - assert_equal 'application/json', @response.content_type - end - - def test_render_json_forwards_extra_options - get :render_json_with_extra_options - assert_equal '{"a":"b"}', @response.body - assert_equal 'application/json', @response.content_type - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/render_other_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/render_other_test.rb deleted file mode 100644 index f36fa7dc3..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/render_other_test.rb +++ /dev/null @@ -1,257 +0,0 @@ -require 'abstract_unit' -require 'controller/fake_models' -require 'pathname' - -ActionController.add_renderer :simon do |says, options| - self.content_type = Mime::TEXT - self.response_body = "Simon says: #{says}" -end - -class RenderOtherTest < ActionController::TestCase - class TestController < ActionController::Base - protect_from_forgery - - def self.controller_path - 'test' - end - - layout :determine_layout - - module RenderTestHelper - def rjs_helper_method_from_module - page.visual_effect :highlight - end - end - - helper RenderTestHelper - helper do - def rjs_helper_method(value) - page.visual_effect :highlight, value - end - end - - def enum_rjs_test - render :update do |page| - page.select('.product').each do |value| - page.rjs_helper_method_from_module - page.rjs_helper_method(value) - page.sortable(value, :url => { :action => "order" }) - page.draggable(value) - end - end - end - - def render_explicit_html_template - end - - def render_custom_code_rjs - render :update, :status => 404 do |page| - page.replace :foo, :partial => 'partial' - end - end - - def render_implicit_html_template - end - - def render_js_with_explicit_template - @project_id = 4 - render :template => 'test/delete_with_js' - end - - def render_js_with_explicit_action_template - @project_id = 4 - render :action => 'delete_with_js' - end - - def delete_with_js - @project_id = 4 - end - - def update_page - render :update do |page| - page.replace_html 'balance', '$37,000,000.00' - page.visual_effect :highlight, 'balance' - end - end - - def update_page_with_instance_variables - @money = '$37,000,000.00' - @div_id = 'balance' - render :update do |page| - page.replace_html @div_id, @money - page.visual_effect :highlight, @div_id - end - end - - def update_page_with_view_method - render :update do |page| - page.replace_html 'person', pluralize(2, 'person') - end - end - - def partial_as_rjs - render :update do |page| - page.replace :foo, :partial => 'partial' - end - end - - def respond_to_partial_as_rjs - respond_to do |format| - format.js do - render :update do |page| - page.replace :foo, :partial => 'partial' - end - end - end - end - - def render_alternate_default - # For this test, the method "default_render" is overridden: - @alternate_default_render = lambda do - render :update do |page| - page.replace :foo, :partial => 'partial' - end - end - end - - def render_simon_says - render :simon => "foo" - end - - private - def default_render - if @alternate_default_render - @alternate_default_render.call - else - super - end - end - - def determine_layout - case action_name - when "hello_world", "layout_test", "rendering_without_layout", - "rendering_nothing_on_layout", "render_text_hello_world", - "render_text_hello_world_with_layout", - "hello_world_with_layout_false", - "partial_only", "partial_only_with_layout", - "accessing_params_in_template", - "accessing_params_in_template_with_layout", - "render_with_explicit_template", - "render_with_explicit_string_template", - "update_page", "update_page_with_instance_variables" - - "layouts/standard" - when "action_talk_to_layout", "layout_overriding_layout" - "layouts/talk_from_action" - when "render_implicit_html_template_from_xhr_request" - (request.xhr? ? 'layouts/xhr' : 'layouts/standard') - end - end - end - - tests TestController - - def setup - # enable a logger so that (e.g.) the benchmarking stuff runs, so we can get - # a more accurate simulation of what happens in "real life". - super - @controller.logger = Logger.new(nil) - - @request.host = "www.nextangle.com" - end - - def test_enum_rjs_test - ActiveSupport::SecureRandom.stubs(:base64).returns("asdf") - get :enum_rjs_test - body = %{ - $$(".product").each(function(value, index) { - new Effect.Highlight(element,{}); - new Effect.Highlight(value,{}); - Sortable.create(value, {onUpdate:function(){new Ajax.Request('/render_other_test/test/order', {asynchronous:true, evalScripts:true, parameters:Sortable.serialize(value) + '&authenticity_token=' + encodeURIComponent('asdf')})}}); - new Draggable(value, {}); - }); - }.gsub(/^ /, '').strip - assert_equal body, @response.body - end - - def test_explicitly_rendering_an_html_template_with_implicit_html_template_renders_should_be_possible_from_an_rjs_template - [:js, "js"].each do |format| - assert_nothing_raised do - get :render_explicit_html_template, :format => format - assert_equal %(document.write("Hello world\\n");), @response.body - end - end - end - - def test_render_custom_code_rjs - get :render_custom_code_rjs - assert_response 404 - assert_equal %(Element.replace("foo", "partial html");), @response.body - end - - def test_render_in_an_rjs_template_should_pick_html_templates_when_available - [:js, "js"].each do |format| - assert_nothing_raised do - get :render_implicit_html_template, :format => format - assert_equal %(document.write("Hello world\\n");), @response.body - end - end - end - - def test_render_rjs_template_explicitly - get :render_js_with_explicit_template - assert_equal %!Element.remove("person");\nnew Effect.Highlight(\"project-4\",{});!, @response.body - end - - def test_rendering_rjs_action_explicitly - get :render_js_with_explicit_action_template - assert_equal %!Element.remove("person");\nnew Effect.Highlight(\"project-4\",{});!, @response.body - end - - def test_render_rjs_with_default - get :delete_with_js - assert_equal %!Element.remove("person");\nnew Effect.Highlight(\"project-4\",{});!, @response.body - end - - def test_update_page - get :update_page - assert_template nil - assert_equal 'text/javascript; charset=utf-8', @response.headers['Content-Type'] - assert_equal 2, @response.body.split($/).length - end - - def test_update_page_with_instance_variables - get :update_page_with_instance_variables - assert_template nil - assert_equal 'text/javascript; charset=utf-8', @response.headers["Content-Type"] - assert_match /balance/, @response.body - assert_match /\$37/, @response.body - end - - def test_update_page_with_view_method - get :update_page_with_view_method - assert_template nil - assert_equal 'text/javascript; charset=utf-8', @response.headers["Content-Type"] - assert_match /2 people/, @response.body - end - - def test_should_render_html_formatted_partial_with_rjs - xhr :get, :partial_as_rjs - assert_equal %(Element.replace("foo", "partial html");), @response.body - end - - def test_should_render_html_formatted_partial_with_rjs_and_js_format - xhr :get, :respond_to_partial_as_rjs - assert_equal %(Element.replace("foo", "partial html");), @response.body - end - - def test_should_render_with_alternate_default_render - xhr :get, :render_alternate_default - assert_equal %(Element.replace("foo", "partial html");), @response.body - end - - def test_using_custom_render_option - get :render_simon_says - assert_equal "Simon says: foo", @response.body - end -end diff --git a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/render_test.rb b/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/render_test.rb deleted file mode 100644 index a718b3c79..000000000 --- a/Tests/Libraries/Rails-3.0.0/actionpack/test/controller/render_test.rb +++ /dev/null @@ -1,1538 +0,0 @@ -require 'abstract_unit' -require 'controller/fake_models' -require 'pathname' - -module Fun - class GamesController < ActionController::Base - # :ported: - def hello_world - end - - def nested_partial_with_form_builder - render :partial => ActionView::Helpers::FormBuilder.new(:post, nil, view_context, {}, Proc.new {}) - end - end -end - -class TestController < ActionController::Base - protect_from_forgery - - class LabellingFormBuilder < ActionView::Helpers::FormBuilder - end - - layout :determine_layout - - def name - nil - end - - private :name - helper_method :name - - def hello_world - end - - def hello_world_file - render :file => File.expand_path("../../fixtures/hello.html", __FILE__) - end - - def conditional_hello - if stale?(:last_modified => Time.now.utc.beginning_of_day, :etag => [:foo, 123]) - render :action => 'hello_world' - end - end - - def conditional_hello_with_public_header - if stale?(:last_modified => Time.now.utc.beginning_of_day, :etag => [:foo, 123], :public => true) - render :action => 'hello_world' - end - end - - def conditional_hello_with_public_header_and_expires_at - expires_in 1.minute - if stale?(:last_modified => Time.now.utc.beginning_of_day, :etag => [:foo, 123], :public => true) - render :action => 'hello_world' - end - end - - def conditional_hello_with_expires_in - expires_in 60.1.seconds - render :action => 'hello_world' - end - - def conditional_hello_with_expires_in_with_public - expires_in 1.minute, :public => true - render :action => 'hello_world' - end - - def conditional_hello_with_expires_in_with_public_with_more_keys - expires_in 1.minute, :public => true, 'max-stale' => 5.hours - render :action => 'hello_world' - end - - def conditional_hello_with_expires_in_with_public_with_more_keys_old_syntax - expires_in 1.minute, :public => true, :private => nil, 'max-stale' => 5.hours - render :action => 'hello_world' - end - - def conditional_hello_with_expires_now - expires_now - render :action => 'hello_world' - end - - def conditional_hello_with_bangs - render :action => 'hello_world' - end - before_filter :handle_last_modified_and_etags, :only=>:conditional_hello_with_bangs - - def handle_last_modified_and_etags - fresh_when(:last_modified => Time.now.utc.beginning_of_day, :etag => [ :foo, 123 ]) - end - - # :ported: - def render_hello_world - render :template => "test/hello_world" - end - - def render_hello_world_with_last_modified_set - response.last_modified = Date.new(2008, 10, 10).to_time - render :template => "test/hello_world" - end - - def render_hello_world_with_etag_set - response.etag = "hello_world" - render :template => "test/hello_world" - end - - # :ported: compatibility - def render_hello_world_with_forward_slash - render :template => "/test/hello_world" - end - - # :ported: - def render_template_in_top_directory - render :template => 'shared' - end - - # :deprecated: - def render_template_in_top_directory_with_slash - render :template => '/shared' - end - - # :ported: - def render_hello_world_from_variable - @person = "david" - render :text => "hello #{@person}" - end - - # :ported: - def render_action_hello_world - render :action => "hello_world" - end - - def render_action_hello_world_as_string - render "hello_world" - end - - def render_action_hello_world_with_symbol - render :action => :hello_world - end - - # :ported: - def render_text_hello_world - render :text => "hello world" - end - - # :ported: - def render_text_hello_world_with_layout - @variable_for_layout = ", I'm here!" - render :text => "hello world", :layout => true - end - - def hello_world_with_layout_false - render :layout => false - end - - # :ported: - def render_file_with_instance_variables - @secret = 'in the sauce' - path = File.join(File.dirname(__FILE__), '../fixtures/test/render_file_with_ivar.erb') - render :file => path - end - - # :ported: - def render_file_as_string_with_instance_variables - @secret = 'in the sauce' - path = File.expand_path(File.join(File.dirname(__FILE__), '../fixtures/test/render_file_with_ivar.erb')) - render path - end - - # :ported: - def render_file_not_using_full_path - @secret = 'in the sauce' - render :file => 'test/render_file_with_ivar' - end - - def render_file_not_using_full_path_with_dot_in_path - @secret = 'in the sauce' - render :file => 'test/dot.directory/render_file_with_ivar' - end - - def render_file_using_pathname - @secret = 'in the sauce' - render :file => Pathname.new(File.dirname(__FILE__)).join('..', 'fixtures', 'test', 'dot.directory', 'render_file_with_ivar.erb') - end - - def render_file_from_template - @secret = 'in the sauce' - @path = File.expand_path(File.join(File.dirname(__FILE__), '../fixtures/test/render_file_with_ivar.erb')) - end - - def render_file_with_locals - path = File.join(File.dirname(__FILE__), '../fixtures/test/render_file_with_locals.erb') - render :file => path, :locals => {:secret => 'in the sauce'} - end - - def render_file_as_string_with_locals - path = File.expand_path(File.join(File.dirname(__FILE__), '../fixtures/test/render_file_with_locals.erb')) - render path, :locals => {:secret => 'in the sauce'} - end - - def accessing_request_in_template - render :inline => "Hello: <%= request.host %>" - end - - def accessing_logger_in_template - render :inline => "<%= logger.class %>" - end - - def accessing_action_name_in_template - render :inline => "<%= action_name %>" - end - - def accessing_controller_name_in_template - render :inline => "<%= controller_name %>" - end - - # :ported: - def render_custom_code - render :text => "hello world", :status => 404 - end - - # :ported: - def render_text_with_nil - render :text => nil - end - - # :ported: - def render_text_with_false - render :text => false - end - - def render_text_with_resource - render :text => Customer.new("David") - end - - # :ported: - def render_nothing_with_appendix - render :text => "appended" - end - - # This test is testing 3 things: - # render :file in AV :ported: - # render :template in AC :ported: - # setting content type - def render_xml_hello - @name = "David" - render :template => "test/hello" - end - - def render_xml_hello_as_string_template - @name = "David" - render "test/hello" - end - - def render_line_offset - render :inline => '<% raise %>', :locals => {:foo => 'bar'} - end - - def heading - head :ok - end - - def greeting - # let's just rely on the template - end - - # :ported: - def blank_response - render :text => ' ' - end - - # :ported: - def layout_test - render :action => "hello_world" - end - - # :ported: - def builder_layout_test - render :action => "hello", :layout => "layouts/builder" - end - - # :move: test this in Action View - def builder_partial_test - render :action => "hello_world_container" - end - - # :ported: - def partials_list - @test_unchanged = 'hello' - @customers = [ Customer.new("david"), Customer.new("mary") ] - render :action => "list" - end - - def partial_only - render :partial => true - end - - def hello_in_a_string - @customers = [ Customer.new("david"), Customer.new("mary") ] - render :text => "How's there? " + render_to_string(:template => "test/list") - end - - def accessing_params_in_template - render :inline => "Hello: <%= params[:name] %>" - end - - def accessing_local_assigns_in_inline_template - name = params[:local_name] - render :inline => "<%= 'Goodbye, ' + local_name %>", - :locals => { :local_name => name } - end - - def render_implicit_html_template_from_xhr_request - end - - def render_implicit_js_template_without_layout - end - - def formatted_html_erb - end - - def formatted_xml_erb - end - - def render_to_string_test - @foo = render_to_string :inline => "this is a test" - end - - def default_render - if @alternate_default_render - @alternate_default_render.call - else - super - end - end - - def render_action_hello_world_as_symbol - render :action => :hello_world - end - - def layout_test_with_different_layout - render :action => "hello_world", :layout => "standard" - end - - def layout_test_with_different_layout_and_string_action - render "hello_world", :layout => "standard" - end - - def layout_test_with_different_layout_and_symbol_action - render :hello_world, :layout => "standard" - end - - def rendering_without_layout - render :action => "hello_world", :layout => false - end - - def layout_overriding_layout - render :action => "hello_world", :layout => "standard" - end - - def rendering_nothing_on_layout - render :nothing => true - end - - def render_to_string_with_assigns - @before = "i'm before the render" - render_to_string :text => "foo" - @after = "i'm after the render" - render :template => "test/hello_world" - end - - def render_to_string_with_exception - render_to_string :file => "exception that will not be caught - this will certainly not work" - end - - def render_to_string_with_caught_exception - @before = "i'm before the render" - begin - render_to_string :file => "exception that will be caught- hope my future instance vars still work!" - rescue - end - @after = "i'm after the render" - render :template => "test/hello_world" - end - - def accessing_params_in_template_with_layout - render :layout => true, :inline => "Hello: <%= params[:name] %>" - end - - # :ported: - def render_with_explicit_template - render :template => "test/hello_world" - end - - def render_with_explicit_string_template - render "test/hello_world" - end - - # :ported: - def render_with_explicit_template_with_locals - render :template => "test/render_file_with_locals", :locals => { :secret => 'area51' } - end - - # :ported: - def double_render - render :text => "hello" - render :text => "world" - end - - def double_redirect - redirect_to :action => "double_render" - redirect_to :action => "double_render" - end - - def render_and_redirect - render :text => "hello" - redirect_to :action => "double_render" - end - - def render_to_string_and_render - @stuff = render_to_string :text => "here is some cached stuff" - render :text => "Hi web users! #{@stuff}" - end - - def render_to_string_with_inline_and_render - render_to_string :inline => "<%= 'dlrow olleh'.reverse %>" - render :template => "test/hello_world" - end - - def rendering_with_conflicting_local_vars - @name = "David" - render :action => "potential_conflicts" - end - - # :deprecated: - # Tests being able to pick a .builder template over a .erb - # For instance, being able to have hello.xml.builder and hello.xml.erb - # and select one via "hello.builder" or "hello.erb" - def hello_world_from_rxml_using_action - render :action => "hello_world_from_rxml.builder" - end - - # :deprecated: - def hello_world_from_rxml_using_template - render :template => "test/hello_world_from_rxml.builder" - end - - def action_talk_to_layout - # Action template sets variable that's picked up by layout - end - - # :addressed: - def render_text_with_assigns - @hello = "world" - render :text => "foo" - end - - def yield_content_for - render :action => "content_for", :layout => "yield" - end - - def render_content_type_from_body - response.content_type = Mime::RSS - render :text => "hello world!" - end - - def head_with_location_header - head :location => "/foo" - end - - def head_with_location_object - head :location => Customer.new("david", 1) - end - - def head_with_symbolic_status - head :status => params[:status].intern - end - - def head_with_integer_status - head :status => params[:status].to_i - end - - def head_with_string_status - head :status => params[:status] - end - - def head_with_custom_header - head :x_custom_header => "something" - end - - def head_with_status_code_first - head :forbidden, :x_custom_header => "something" - end - - def render_using_layout_around_block - render :action => "using_layout_around_block" - end - - def render_using_layout_around_block_in_main_layout_and_within_content_for_layout - render :action => "using_layout_around_block", :layout => "layouts/block_with_layout" - end - - def partial_dot_html - render :partial => 'partial.html.erb' - end - - def partial - render :partial => 'partial' - end - - def render_alternate_default - # For this test, the method "default_render" is overridden: - @alternate_default_render = lambda do - render :update do |page| - page.replace :foo, :partial => 'partial' - end - end - end - - def render_to_string_with_partial - @partial_only = render_to_string :partial => "partial_only" - @partial_with_locals = render_to_string :partial => "customer", :locals => { :customer => Customer.new("david") } - render :template => "test/hello_world" - end - - def partial_with_counter - render :partial => "counter", :locals => { :counter_counter => 5 } - end - - def partial_with_locals - render :partial => "customer", :locals => { :customer => Customer.new("david") } - end - - def partial_with_form_builder - render :partial => ActionView::Helpers::FormBuilder.new(:post, nil, view_context, {}, Proc.new {}) - end - - def partial_with_form_builder_subclass - render :partial => LabellingFormBuilder.new(:post, nil, view_context, {}, Proc.new {}) - end - - def partial_collection - render :partial => "customer", :collection => [ Customer.new("david"), Customer.new("mary") ] - end - - def partial_collection_with_as - render :partial => "customer_with_var", :collection => [ Customer.new("david"), Customer.new("mary") ], :as => :customer - end - - def partial_collection_with_counter - render :partial => "customer_counter", :collection => [ Customer.new("david"), Customer.new("mary") ] - end - - def partial_collection_with_as_and_counter - render :partial => "customer_counter_with_as", :collection => [ Customer.new("david"), Customer.new("mary") ], :as => :client - end - - def partial_collection_with_locals - render :partial => "customer_greeting", :collection => [ Customer.new("david"), Customer.new("mary") ], :locals => { :greeting => "Bonjour" } - end - - def partial_collection_with_spacer - render :partial => "customer", :spacer_template => "partial_only", :collection => [ Customer.new("david"), Customer.new("mary") ] - end - - def partial_collection_shorthand_with_locals - render :partial => [ Customer.new("david"), Customer.new("mary") ], :locals => { :greeting => "Bonjour" } - end - - def partial_collection_shorthand_with_different_types_of_records - render :partial => [ - BadCustomer.new("mark"), - GoodCustomer.new("craig"), - BadCustomer.new("john"), - GoodCustomer.new("zach"), - GoodCustomer.new("brandon"), - BadCustomer.new("dan") ], - :locals => { :greeting => "Bonjour" } - end - - def empty_partial_collection - render :partial => "customer", :collection => [] - end - - def partial_collection_shorthand_with_different_types_of_records_with_counter - partial_collection_shorthand_with_different_types_of_records - end - - def missing_partial - render :partial => 'thisFileIsntHere' - end - - def partial_with_hash_object - render :partial => "hash_object", :object => {:first_name => "Sam"} - end - - def partial_with_nested_object - render :partial => "quiz/questions/question", :object => Quiz::Question.new("first") - end - - def partial_with_nested_object_shorthand - render Quiz::Question.new("first") - end - - def partial_hash_collection - render :partial => "hash_object", :collection => [ {:first_name => "Pratik"}, {:first_name => "Amy"} ] - end - - def partial_hash_collection_with_locals - render :partial => "hash_greeting", :collection => [ {:first_name => "Pratik"}, {:first_name => "Amy"} ], :locals => { :greeting => "Hola" } - end - - def partial_with_implicit_local_assignment - @customer = Customer.new("Marcel") - render :partial => "customer" - end - - def render_call_to_partial_with_layout - render :action => "calling_partial_with_layout" - end - - def render_call_to_partial_with_layout_in_main_layout_and_within_content_for_layout - render :action => "calling_partial_with_layout", :layout => "layouts/partial_with_layout" - end - - def rescue_action(e) - raise - end - - before_filter :only => :render_with_filters do - request.format = :xml - end - - # Ensure that the before filter is executed *before* self.formats is set. - def render_with_filters - render :action => :formatted_xml_erb - end - - private - - def determine_layout - case action_name - when "hello_world", "layout_test", "rendering_without_layout", - "rendering_nothing_on_layout", "render_text_hello_world", - "render_text_hello_world_with_layout", - "hello_world_with_layout_false", - "partial_only", "accessing_params_in_template", - "accessing_params_in_template_with_layout", - "render_with_explicit_template", - "render_with_explicit_string_template", - "update_page", "update_page_with_instance_variables" - - "layouts/standard" - when "action_talk_to_layout", "layout_overriding_layout" - "layouts/talk_from_action" - when "render_implicit_html_template_from_xhr_request" - (request.xhr? ? 'layouts/xhr' : 'layouts/standard') - end - end -end - -class RenderTest < ActionController::TestCase - tests TestController - - def setup - # enable a logger so that (e.g.) the benchmarking stuff runs, so we can get - # a more accurate simulation of what happens in "real life". - super - @controller.logger = Logger.new(nil) - - @request.host = "www.nextangle.com" - end - - # :ported: - def test_simple_show - get :hello_world - assert_response 200 - assert_response :success - assert_template "test/hello_world" - assert_equal "Hello world!", @response.body - end - - # :ported: - def test_renders_default_template_for_missing_action - get :'hyphen-ated' - assert_template 'test/hyphen-ated' - end - - # :ported: - def test_render - get :render_hello_world - assert_template "test/hello_world" - end - - def test_line_offset - begin - get :render_line_offset - flunk "the action should have raised an exception" - rescue StandardError => exc - line = exc.backtrace.first - assert(line =~ %r{:(\d+):}) - assert_equal "1", $1, - "The line offset is wrong, perhaps the wrong exception has been raised, exception was: #{exc.inspect}" - end - end - - # :ported: compatibility - def test_render_with_forward_slash - get :render_hello_world_with_forward_slash - assert_template "test/hello_world" - end - - # :ported: - def test_render_in_top_directory - get :render_template_in_top_directory - assert_template "shared" - assert_equal "Elastica", @response.body - end - - # :ported: - def test_render_in_top_directory_with_slash - get :render_template_in_top_directory_with_slash - assert_template "shared" - assert_equal "Elastica", @response.body - end - - # :ported: - def test_render_from_variable - get :render_hello_world_from_variable - assert_equal "hello david", @response.body - end - - # :ported: - def test_render_action - get :render_action_hello_world - assert_template "test/hello_world" - end - - # :ported: - def test_render_action_hello_world_as_string - get :render_action_hello_world_as_string - assert_equal "Hello world!", @response.body - assert_template "test/hello_world" - end - - # :ported: - def test_render_action_with_symbol - get :render_action_hello_world_with_symbol - assert_template "test/hello_world" - end - - # :ported: - def test_render_text - get :render_text_hello_world - assert_equal "hello world", @response.body - end - - # :ported: - def test_do_with_render_text_and_layout - get :render_text_hello_world_with_layout - assert_equal "hello world, I'm here!", @response.body - end - - # :ported: - def test_do_with_render_action_and_layout_false - get :hello_world_with_layout_false - assert_equal 'Hello world!', @response.body - end - - # :ported: - def test_render_file_with_instance_variables - get :render_file_with_instance_variables - assert_equal "The secret is in the sauce\n", @response.body - end - - def test_render_file - get :hello_world_file - assert_equal "Hello world!", @response.body - end - - # :ported: - def test_render_file_as_string_with_instance_variables - get :render_file_as_string_with_instance_variables - assert_equal "The secret is in the sauce\n", @response.body - end - - # :ported: - def test_render_file_not_using_full_path - get :render_file_not_using_full_path - assert_equal "The secret is in the sauce\n", @response.body - end - - # :ported: - def test_render_file_not_using_full_path_with_dot_in_path - get :render_file_not_using_full_path_with_dot_in_path - assert_equal "The secret is in the sauce\n", @response.body - end - - # :ported: - def test_render_file_using_pathname - get :render_file_using_pathname - assert_equal "The secret is in the sauce\n", @response.body - end - - # :ported: - def test_render_file_with_locals - get :render_file_with_locals - assert_equal "The secret is in the sauce\n", @response.body - end - - # :ported: - def test_render_file_as_string_with_locals - get :render_file_as_string_with_locals - assert_equal "The secret is in the sauce\n", @response.body - end - - # :assessed: - def test_render_file_from_template - get :render_file_from_template - assert_equal "The secret is in the sauce\n", @response.body - end - - # :ported: - def test_render_custom_code - get :render_custom_code - assert_response 404 - assert_response :missing - assert_equal 'hello world', @response.body - end - - # :ported: - def test_render_text_with_nil - get :render_text_with_nil - assert_response 200 - assert_equal ' ', @response.body - end - - # :ported: - def test_render_text_with_false - get :render_text_with_false - assert_equal 'false', @response.body - end - - # :ported: - def test_render_nothing_with_appendix - get :render_nothing_with_appendix - assert_response 200 - assert_equal 'appended', @response.body - end - - def test_render_text_with_resource - get :render_text_with_resource - assert_equal 'name: "David"', @response.body - end - - # :ported: - def test_attempt_to_access_object_method - assert_raise(ActionController::UnknownAction, "No action responded to [clone]") { get :clone } - end - - # :ported: - def test_private_methods - assert_raise(ActionController::UnknownAction, "No action responded to [determine_layout]") { get :determine_layout } - end - - # :ported: - def test_access_to_request_in_view - get :accessing_request_in_template - assert_equal "Hello: www.nextangle.com", @response.body - end - - def test_access_to_logger_in_view - get :accessing_logger_in_template - assert_equal "Logger", @response.body - end - - # :ported: - def test_access_to_action_name_in_view - get :accessing_action_name_in_template - assert_equal "accessing_action_name_in_template", @response.body - end - - # :ported: - def test_access_to_controller_name_in_view - get :accessing_controller_name_in_template - assert_equal "test", @response.body # name is explicitly set in the controller. - end - - # :ported: - def test_render_xml - get :render_xml_hello - assert_equal "\n

Hello David

\n

This is grand!

\n\n", @response.body - assert_equal "application/xml", @response.content_type - end - - # :ported: - def test_render_xml_as_string_template - get :render_xml_hello_as_string_template - assert_equal "\n

Hello David

\n

This is grand!

\n\n", @response.body - assert_equal "application/xml", @response.content_type - end - - # :ported: - def test_render_xml_with_default - get :greeting - assert_equal "

This is grand!

\n", @response.body - end - - # :move: test in AV - def test_render_xml_with_partial - get :builder_partial_test - assert_equal "\n \n\n", @response.body - end - - # :ported: - def test_layout_rendering - get :layout_test - assert_equal "Hello world!", @response.body - end - - def test_render_xml_with_layouts - get :builder_layout_test - assert_equal "\n\n

Hello

\n

This is grand!

\n\n
\n", @response.body - end - - def test_partials_list - get :partials_list - assert_equal "goodbyeHello: davidHello: marygoodbye\n", @response.body - end - - def test_render_to_string - get :hello_in_a_string - assert_equal "How's there? goodbyeHello: davidHello: marygoodbye\n", @response.body - end - - def test_render_to_string_resets_assigns - get :render_to_string_test - assert_equal "The value of foo is: ::this is a test::\n", @response.body - end - - def test_render_to_string_inline - get :render_to_string_with_inline_and_render - assert_template "test/hello_world" - end - - # :ported: - def test_nested_rendering - @controller = Fun::GamesController.new - get :hello_world - assert_equal "Living in a nested world", @response.body - end - - def test_accessing_params_in_template - get :accessing_params_in_template, :name => "David" - assert_equal "Hello: David", @response.body - end - - def test_accessing_local_assigns_in_inline_template - get :accessing_local_assigns_in_inline_template, :local_name => "Local David" - assert_equal "Goodbye, Local David", @response.body - end - - def test_should_implicitly_render_html_template_from_xhr_request - xhr :get, :render_implicit_html_template_from_xhr_request - assert_equal "XHR!\nHello HTML!", @response.body - end - - def test_should_implicitly_render_js_template_without_layout - get :render_implicit_js_template_without_layout, :format => :js - assert_no_match %r{}, @response.body - end - - def test_should_render_formatted_template - get :formatted_html_erb - assert_equal 'formatted html erb', @response.body - end - - def test_should_render_formatted_html_erb_template - get :formatted_xml_erb - assert_equal 'passed formatted html erb', @response.body - end - - def test_should_render_formatted_html_erb_template_with_faulty_accepts_header - @request.accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, appliction/x-shockwave-flash, */*" - get :formatted_xml_erb - assert_equal 'passed formatted html erb', @response.body - end - - def test_layout_test_with_different_layout - get :layout_test_with_different_layout - assert_equal "Hello world!", @response.body - end - - def test_layout_test_with_different_layout_and_string_action - get :layout_test_with_different_layout_and_string_action - assert_equal "Hello world!", @response.body - end - - def test_layout_test_with_different_layout_and_symbol_action - get :layout_test_with_different_layout_and_symbol_action - assert_equal "Hello world!", @response.body - end - - def test_rendering_without_layout - get :rendering_without_layout - assert_equal "Hello world!", @response.body - end - - def test_layout_overriding_layout - get :layout_overriding_layout - assert_no_match %r{}, @response.body - end - - def test_rendering_nothing_on_layout - get :rendering_nothing_on_layout - assert_equal " ", @response.body - end - - def test_render_to_string - assert_not_deprecated { get :hello_in_a_string } - assert_equal "How's there? goodbyeHello: davidHello: marygoodbye\n", @response.body - end - - def test_render_to_string_doesnt_break_assigns - get :render_to_string_with_assigns - assert_equal "i'm before the render", assigns(:before) - assert_equal "i'm after the render", assigns(:after) - end - - def test_bad_render_to_string_still_throws_exception - assert_raise(ActionView::MissingTemplate) { get :render_to_string_with_exception } - end - - def test_render_to_string_that_throws_caught_exception_doesnt_break_assigns - assert_nothing_raised { get :render_to_string_with_caught_exception } - assert_equal "i'm before the render", assigns(:before) - assert_equal "i'm after the render", assigns(:after) - end - - def test_accessing_params_in_template_with_layout - get :accessing_params_in_template_with_layout, :name => "David" - assert_equal "<html>Hello: David</html>", @response.body - end - - def test_render_with_explicit_template - get :render_with_explicit_template - assert_response :success - end - - def test_render_with_explicit_string_template - get :render_with_explicit_string_template - assert_equal "<html>Hello world!</html>", @response.body - end - - def test_render_with_filters - get :render_with_filters - assert_equal "<test>passed formatted xml erb</test>", @response.body - end - - # :ported: - def test_double_render - assert_raise(ActionController::DoubleRenderError) { get :double_render } - end - - def test_double_redirect - assert_raise(ActionController::DoubleRenderError) { get :double_redirect } - end - - def test_render_and_redirect - assert_raise(ActionController::DoubleRenderError) { get :render_and_redirect } - end - - # specify the one exception to double render rule - render_to_string followed by render - def test_render_to_string_and_render - get :render_to_string_and_render - assert_equal("Hi web users! here is some cached stuff", @response.body) - end - - def test_rendering_with_conflicting_local_vars - get :rendering_with_conflicting_local_vars - assert_equal("First: David\nSecond: Stephan\nThird: David\nFourth: David\nFifth: ", @response.body) - end - - def test_action_talk_to_layout - get :action_talk_to_layout - assert_equal "<title>Talking to the layout\nAction was here!", @response.body - end - - # :addressed: - def test_render_text_with_assigns - get :render_text_with_assigns - assert_equal "world", assigns["hello"] - end - - # :ported: - def test_template_with_locals - get :render_with_explicit_template_with_locals - assert_equal "The secret is area51\n", @response.body - end - - def test_yield_content_for - assert_not_deprecated { get :yield_content_for } - assert_equal "Putting stuff in the title!\nGreat stuff!\n", @response.body - end - - def test_overwritting_rendering_relative_file_with_extension - get :hello_world_from_rxml_using_template - assert_equal "\n

Hello

\n\n", @response.body - - get :hello_world_from_rxml_using_action - assert_equal "\n

Hello

\n\n", @response.body - end - - def test_head_with_location_header - get :head_with_location_header - assert_blank @response.body - assert_equal "/foo", @response.headers["Location"] - assert_response :ok - end - - def test_head_with_location_object - with_routing do |set| - set.draw do |map| - resources :customers - match ':controller/:action' - end - - get :head_with_location_object - assert_blank @response.body - assert_equal "http://www.nextangle.com/customers/1", @response.headers["Location"] - assert_response :ok - end - end - - def test_head_with_custom_header - get :head_with_custom_header - assert_blank @response.body - assert_equal "something", @response.headers["X-Custom-Header"] - assert_response :ok - end - - def test_head_with_symbolic_status - get :head_with_symbolic_status, :status => "ok" - assert_equal 200, @response.status - assert_response :ok - - get :head_with_symbolic_status, :status => "not_found" - assert_equal 404, @response.status - assert_response :not_found - - get :head_with_symbolic_status, :status => "no_content" - assert_equal 204, @response.status - assert !@response.headers.include?('Content-Length') - assert_response :no_content - - Rack::Utils::SYMBOL_TO_STATUS_CODE.each do |status, code| - get :head_with_symbolic_status, :status => status.to_s - assert_equal code, @response.response_code - assert_response status - end - end - - def test_head_with_integer_status - Rack::Utils::HTTP_STATUS_CODES.each do |code, message| - get :head_with_integer_status, :status => code.to_s - assert_equal message, @response.message - end - end - - def test_head_with_string_status - get :head_with_string_status, :status => "404 Eat Dirt" - assert_equal 404, @response.response_code - assert_equal "Not Found", @response.message - assert_response :not_found - end - - def test_head_with_status_code_first - get :head_with_status_code_first - assert_equal 403, @response.response_code - assert_equal "Forbidden", @response.message - assert_equal "something", @response.headers["X-Custom-Header"] - assert_response :forbidden - end - - def test_using_layout_around_block - get :render_using_layout_around_block - assert_equal "Before (David)\nInside from block\nAfter", @response.body - end - - def test_using_layout_around_block_in_main_layout_and_within_content_for_layout - get :render_using_layout_around_block_in_main_layout_and_within_content_for_layout - assert_equal "Before (Anthony)\nInside from first block in layout\nAfter\nBefore (David)\nInside from block\nAfter\nBefore (Ramm)\nInside from second block in layout\nAfter\n", @response.body - end - - def test_partial_only - get :partial_only - assert_equal "only partial", @response.body - end - - def test_should_render_html_formatted_partial - get :partial - assert_equal 'partial html', @response.body - end - - def test_should_render_html_partial_with_dot - get :partial_dot_html - assert_equal 'partial html', @response.body - end - - def test_render_to_string_partial - get :render_to_string_with_partial - assert_equal "only partial", assigns(:partial_only) - assert_equal "Hello: david", assigns(:partial_with_locals) - end - - def test_partial_with_counter - get :partial_with_counter - assert_equal "5", @response.body - end - - def test_partial_with_locals - get :partial_with_locals - assert_equal "Hello: david", @response.body - end - - def test_partial_with_form_builder - get :partial_with_form_builder - assert_match(/