carats 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/ChangeLog +2 -0
- data/LICENSE +5 -0
- data/README +67 -0
- data/Reapfile +72 -0
- data/ToDo +24 -0
- data/bench/b_harray.rb +49 -0
- data/bench/b_range.rb +64 -0
- data/demo/ansicolor/cdiff.rb +20 -0
- data/demo/ansicolor/example.rb +82 -0
- data/demo/io-reactor/chatserver.rb +347 -0
- data/doc/classes/Array.html +172 -0
- data/doc/classes/BBCode.html +638 -0
- data/doc/classes/BinaryReader.html +675 -0
- data/doc/classes/Binding.html +223 -0
- data/doc/classes/ByteOrder.html +284 -0
- data/doc/classes/Class.html +189 -0
- data/doc/classes/Constant.html +785 -0
- data/doc/classes/Constant/CGS.html +609 -0
- data/doc/classes/Continuation.html +113 -0
- data/doc/classes/Coroutine.html +387 -0
- data/doc/classes/CountingSemaphore.html +337 -0
- data/doc/classes/CrossCase.html +561 -0
- data/doc/classes/DynamicMixin.html +185 -0
- data/doc/classes/EnumerableWithArgs.html +550 -0
- data/doc/classes/Expect.html +428 -0
- data/doc/classes/Expect/DefaultChain.html +113 -0
- data/doc/classes/Expect/SeparatedPattern.html +223 -0
- data/doc/classes/Expect/Timeout.html +167 -0
- data/doc/classes/Expect/UnmatchedMessage.html +160 -0
- data/doc/classes/FileList.html +833 -0
- data/doc/classes/FloatString.html +534 -0
- data/doc/classes/Functor.html +211 -0
- data/doc/classes/HArray.html +1872 -0
- data/doc/classes/HTML.html +328 -0
- data/doc/classes/Heap.html +683 -0
- data/doc/classes/Heap/EmptyHeapException.html +111 -0
- data/doc/classes/Heap/Max.html +176 -0
- data/doc/classes/Heap/Min.html +176 -0
- data/doc/classes/IO.html +108 -0
- data/doc/classes/IO/Reactor.html +790 -0
- data/doc/classes/IO/Redirect.html +289 -0
- data/doc/classes/Infinity.html +320 -0
- data/doc/classes/Interval.html +1014 -0
- data/doc/classes/InvalidNackError.html +161 -0
- data/doc/classes/Kernel.html +204 -0
- data/doc/classes/Lisp.html +1132 -0
- data/doc/classes/Lisp/DottedPair.html +379 -0
- data/doc/classes/Lisp/Format.html +178 -0
- data/doc/classes/Lisp/Format/ArgumentError.html +126 -0
- data/doc/classes/Lisp/Format/Directives.html +155 -0
- data/doc/classes/Lisp/Format/Directives/ArgJump.html +178 -0
- data/doc/classes/Lisp/Format/Directives/Ascii.html +119 -0
- data/doc/classes/Lisp/Format/Directives/BeginCaseConversion.html +185 -0
- data/doc/classes/Lisp/Format/Directives/BeginConditional.html +307 -0
- data/doc/classes/Lisp/Format/Directives/BeginIteration.html +338 -0
- data/doc/classes/Lisp/Format/Directives/Binary.html +157 -0
- data/doc/classes/Lisp/Format/Directives/Character.html +228 -0
- data/doc/classes/Lisp/Format/Directives/CharacterDirective.html +203 -0
- data/doc/classes/Lisp/Format/Directives/ClauseSeparator.html +166 -0
- data/doc/classes/Lisp/Format/Directives/Decimal.html +119 -0
- data/doc/classes/Lisp/Format/Directives/Directive.html +397 -0
- data/doc/classes/Lisp/Format/Directives/DollarFP.html +205 -0
- data/doc/classes/Lisp/Format/Directives/EndCaseConversion.html +174 -0
- data/doc/classes/Lisp/Format/Directives/EndConditional.html +159 -0
- data/doc/classes/Lisp/Format/Directives/EndIteration.html +163 -0
- data/doc/classes/Lisp/Format/Directives/ExpFP.html +252 -0
- data/doc/classes/Lisp/Format/Directives/FFFP.html +224 -0
- data/doc/classes/Lisp/Format/Directives/Factory.html +180 -0
- data/doc/classes/Lisp/Format/Directives/FreshLine.html +175 -0
- data/doc/classes/Lisp/Format/Directives/GeneralFP.html +265 -0
- data/doc/classes/Lisp/Format/Directives/Hexadecimal.html +157 -0
- data/doc/classes/Lisp/Format/Directives/Indirection.html +183 -0
- data/doc/classes/Lisp/Format/Directives/Literal.html +187 -0
- data/doc/classes/Lisp/Format/Directives/NewLine.html +158 -0
- data/doc/classes/Lisp/Format/Directives/NewPage.html +158 -0
- data/doc/classes/Lisp/Format/Directives/Number.html +243 -0
- data/doc/classes/Lisp/Format/Directives/Octal.html +157 -0
- data/doc/classes/Lisp/Format/Directives/Plural.html +177 -0
- data/doc/classes/Lisp/Format/Directives/Print.html +237 -0
- data/doc/classes/Lisp/Format/Directives/Radix.html +432 -0
- data/doc/classes/Lisp/Format/Directives/SExpression.html +157 -0
- data/doc/classes/Lisp/Format/Directives/SkipWhitespace.html +165 -0
- data/doc/classes/Lisp/Format/Directives/Tabulate.html +198 -0
- data/doc/classes/Lisp/Format/Directives/Tilde.html +158 -0
- data/doc/classes/Lisp/Format/Directives/UnknownDirectiveError.html +117 -0
- data/doc/classes/Lisp/Format/Formatter.html +193 -0
- data/doc/classes/Lisp/Format/IncompleteParameterError.html +119 -0
- data/doc/classes/Lisp/Format/IndexError.html +126 -0
- data/doc/classes/Lisp/Format/Lexer.html +479 -0
- data/doc/classes/Lisp/Format/MalformedError.html +119 -0
- data/doc/classes/Lisp/Format/MissingParameterError.html +119 -0
- data/doc/classes/Lisp/Format/ModifierError.html +119 -0
- data/doc/classes/Lisp/Format/Output.html +239 -0
- data/doc/classes/Lisp/Format/ParameterError.html +126 -0
- data/doc/classes/Lisp/Format/Parameters.html +123 -0
- data/doc/classes/Lisp/Format/Parameters/Argument.html +172 -0
- data/doc/classes/Lisp/Format/Parameters/ArgumentCount.html +159 -0
- data/doc/classes/Lisp/Format/Parameters/Character.html +119 -0
- data/doc/classes/Lisp/Format/Parameters/Default.html +120 -0
- data/doc/classes/Lisp/Format/Parameters/Integer.html +119 -0
- data/doc/classes/Lisp/Format/Parameters/Parameter.html +206 -0
- data/doc/classes/Lisp/Format/Parser.html +212 -0
- data/doc/classes/Lisp/Format/Positioned.html +166 -0
- data/doc/classes/Lisp/Format/State.html +455 -0
- data/doc/classes/Lisp/Format/SyntaxError.html +126 -0
- data/doc/classes/Method.html +274 -0
- data/doc/classes/Method/DuckHunter.html +281 -0
- data/doc/classes/Module.html +709 -0
- data/doc/classes/Multiton.html +284 -0
- data/doc/classes/Multiton/New.html +164 -0
- data/doc/classes/Multiton/Semi.html +155 -0
- data/doc/classes/NackClass.html +322 -0
- data/doc/classes/NilClass.html +231 -0
- data/doc/classes/NilComparable.html +179 -0
- data/doc/classes/NotCopyable.html +273 -0
- data/doc/classes/Object.html +261 -0
- data/doc/classes/OpenStructable.html +346 -0
- data/doc/classes/OrderedHash.html +939 -0
- data/doc/classes/Parser.html +515 -0
- data/doc/classes/Parser/Main.html +178 -0
- data/doc/classes/Parser/Marker.html +475 -0
- data/doc/classes/Parser/Registry.html +354 -0
- data/doc/classes/Parser/Token.html +399 -0
- data/doc/classes/Parser/UnitToken.html +222 -0
- data/doc/classes/Ref.html +230 -0
- data/doc/classes/SimpleStringIO.html +183 -0
- data/doc/classes/StaticHash.html +202 -0
- data/doc/classes/String.html +172 -0
- data/doc/classes/Struct.html +181 -0
- data/doc/classes/SuperStruct.html +382 -0
- data/doc/classes/Term.html +156 -0
- data/doc/classes/Term/ANSIColor.html +185 -0
- data/doc/classes/Text.html +138 -0
- data/doc/classes/Text/Soundex.html +222 -0
- data/doc/classes/TextTagIterator.html +911 -0
- data/doc/classes/Time.html +119 -0
- data/doc/classes/Time/Limit.html +303 -0
- data/doc/classes/Time/Limit/Dummy.html +181 -0
- data/doc/classes/Timer.html +351 -0
- data/doc/classes/TracePoint.html +532 -0
- data/doc/classes/Tuple.html +178 -0
- data/doc/classes/Uninheritable.html +213 -0
- data/doc/classes/Version.html +783 -0
- data/doc/created.rid +1 -0
- data/doc/files/LICENSE.html +113 -0
- data/doc/files/README.html +201 -0
- data/doc/files/lib/carat/1st_rb.html +107 -0
- data/doc/files/lib/carat/ansicolor_rb.html +146 -0
- data/doc/files/lib/carat/attr_rb.html +101 -0
- data/doc/files/lib/carat/bbcode_rb.html +152 -0
- data/doc/files/lib/carat/binaryreader_rb.html +114 -0
- data/doc/files/lib/carat/binding-of-caller_rb.html +108 -0
- data/doc/files/lib/carat/byteorder_rb.html +107 -0
- data/doc/files/lib/carat/constant_rb.html +167 -0
- data/doc/files/lib/carat/coroutine_rb.html +156 -0
- data/doc/files/lib/carat/crosscase_rb.html +224 -0
- data/doc/files/lib/carat/duckhunter_rb.html +165 -0
- data/doc/files/lib/carat/dynamic-mixin_rb.html +101 -0
- data/doc/files/lib/carat/enumerable-args_rb.html +140 -0
- data/doc/files/lib/carat/expect_rb.html +137 -0
- data/doc/files/lib/carat/filelist_rb.html +130 -0
- data/doc/files/lib/carat/floatstring_rb.html +126 -0
- data/doc/files/lib/carat/functor_rb.html +140 -0
- data/doc/files/lib/carat/harray_rb.html +128 -0
- data/doc/files/lib/carat/heap_rb.html +154 -0
- data/doc/files/lib/carat/html-helpers_rb.html +116 -0
- data/doc/files/lib/carat/infinity_rb.html +142 -0
- data/doc/files/lib/carat/init_rb.html +127 -0
- data/doc/files/lib/carat/interval_rb.html +162 -0
- data/doc/files/lib/carat/io-reactor_rb.html +211 -0
- data/doc/files/lib/carat/io-redirect_rb.html +132 -0
- data/doc/files/lib/carat/lisp-format_rb.html +187 -0
- data/doc/files/lib/carat/lisp_rb.html +152 -0
- data/doc/files/lib/carat/macro_rb.html +129 -0
- data/doc/files/lib/carat/multiton_rb.html +178 -0
- data/doc/files/lib/carat/nack_rb.html +193 -0
- data/doc/files/lib/carat/nil-comparable_rb.html +126 -0
- data/doc/files/lib/carat/nil-missing_rb.html +101 -0
- data/doc/files/lib/carat/notcopyable_rb.html +166 -0
- data/doc/files/lib/carat/orderedhash_rb.html +107 -0
- data/doc/files/lib/carat/ostructable_rb.html +157 -0
- data/doc/files/lib/carat/parser-old_rb.html +239 -0
- data/doc/files/lib/carat/parser_rb.html +244 -0
- data/doc/files/lib/carat/ref_rb.html +107 -0
- data/doc/files/lib/carat/semaphore_rb.html +132 -0
- data/doc/files/lib/carat/snapshot_rb.html +152 -0
- data/doc/files/lib/carat/soundex_rb.html +128 -0
- data/doc/files/lib/carat/sstruct_rb.html +142 -0
- data/doc/files/lib/carat/statichash_rb.html +150 -0
- data/doc/files/lib/carat/tagiter_rb.html +236 -0
- data/doc/files/lib/carat/timelimit_rb.html +136 -0
- data/doc/files/lib/carat/timer_rb.html +153 -0
- data/doc/files/lib/carat/tracepoint_rb.html +160 -0
- data/doc/files/lib/carat/tuple_rb.html +123 -0
- data/doc/files/lib/carat/uninheritable_rb.html +101 -0
- data/doc/files/lib/carat/version_rb.html +141 -0
- data/doc/fr_class_index.html +159 -0
- data/doc/fr_file_index.html +78 -0
- data/doc/fr_method_index.html +663 -0
- data/doc/index.html +24 -0
- data/doc/rdoc-style.css +208 -0
- data/lib/carat-dev/README +11 -0
- data/lib/carat-dev/access-blocks/access_blocks.rb +42 -0
- data/lib/carat-dev/association/association.rb +70 -0
- data/lib/carat-dev/blankslate/blankslate.rb +51 -0
- data/lib/carat-dev/breakpoint.rb +518 -0
- data/lib/carat-dev/class-constructor/constructor_methods.rb +78 -0
- data/lib/carat-dev/class-constructor/tc_constructor.rb +35 -0
- data/lib/carat-dev/closecall/closecall-test.rb +39 -0
- data/lib/carat-dev/closecall/closecall.rb +101 -0
- data/lib/carat-dev/commandrunner/commandrunner.rb +100 -0
- data/lib/carat-dev/conditional/conditionals.rb +106 -0
- data/lib/carat-dev/daemon/daemon.rb +70 -0
- data/lib/carat-dev/detach/detach.rb +363 -0
- data/lib/carat-dev/detach/tc_detach.rb +57 -0
- data/lib/carat-dev/import-module/import-module-0.81.tar.gz +0 -0
- data/lib/carat-dev/import-module/import-module-0.81/LICENSE +1 -0
- data/lib/carat-dev/import-module/import-module-0.81/Makefile +11 -0
- data/lib/carat-dev/import-module/import-module-0.81/README +4 -0
- data/lib/carat-dev/import-module/import-module-0.81/dev-lib/import-module-hash.rb +49 -0
- data/lib/carat-dev/import-module/import-module-0.81/dev-lib/import-module-pip.rb +71 -0
- data/lib/carat-dev/import-module/import-module-0.81/dev-lib/import-module-unbound-method.rb +36 -0
- data/lib/carat-dev/import-module/import-module-0.81/doc/README-ja.html +293 -0
- data/lib/carat-dev/import-module/import-module-0.81/doc/README-ja.rd +306 -0
- data/lib/carat-dev/import-module/import-module-0.81/doc/README.html +290 -0
- data/lib/carat-dev/import-module/import-module-0.81/doc/README.rd +303 -0
- data/lib/carat-dev/import-module/import-module-0.81/doc/style.css +85 -0
- data/lib/carat-dev/import-module/import-module-0.81/install.rb +99 -0
- data/lib/carat-dev/import-module/import-module-0.81/lib/import-module-single-thread.rb +84 -0
- data/lib/carat-dev/import-module/import-module-0.81/lib/import-module.rb +493 -0
- data/lib/carat-dev/import-module/import-module-0.81/test/Makefile +2 -0
- data/lib/carat-dev/import-module/import-module-0.81/test/test +91 -0
- data/lib/carat-dev/import-module/import-module-0.81/test/test-import-module.rb +936 -0
- data/lib/carat-dev/import-module/import-module-0.81/test/test-import_scope.rb +33 -0
- data/lib/carat-dev/import-module/import-module-0.81/test/test-scope_import.rb +33 -0
- data/lib/carat-dev/import-module/import-module-0.81/test/test-time.rb +184 -0
- data/lib/carat-dev/import-module/import-module-0.81/test/test.sh +91 -0
- data/lib/carat-dev/import-module/import-module-0.81/test/time.rb +135 -0
- data/lib/carat-dev/import-module/import-module-0.81/test/times-do.sh +10 -0
- data/lib/carat-dev/interface_work/SCRAP/i-contracts.rb +37 -0
- data/lib/carat-dev/interface_work/SCRAP/interface.rb +105 -0
- data/lib/carat-dev/interface_work/SCRAP/j-interface/interface-0.1.0.zip +0 -0
- data/lib/carat-dev/interface_work/SCRAP/j-interface/interface-0.1.0/CHANGES +3 -0
- data/lib/carat-dev/interface_work/SCRAP/j-interface/interface-0.1.0/MANIFEST +15 -0
- data/lib/carat-dev/interface_work/SCRAP/j-interface/interface-0.1.0/README +32 -0
- data/lib/carat-dev/interface_work/SCRAP/j-interface/interface-0.1.0/doc/interface.rd +73 -0
- data/lib/carat-dev/interface_work/SCRAP/j-interface/interface-0.1.0/doc/interface.txt +94 -0
- data/lib/carat-dev/interface_work/SCRAP/j-interface/interface-0.1.0/install.rb +16 -0
- data/lib/carat-dev/interface_work/SCRAP/j-interface/interface-0.1.0/lib/interface.rb +50 -0
- data/lib/carat-dev/interface_work/SCRAP/j-interface/interface-0.1.0/test/tc_interface.rb +51 -0
- data/lib/carat-dev/interface_work/SCRAP/j-interface/interface-0.1.0/test/test.rb +29 -0
- data/lib/carat-dev/interface_work/SCRAP/j-interface/interface-0.1.0/test/test_instance.rb +24 -0
- data/lib/carat-dev/interface_work/SCRAP/j-interface/interface-0.1.0/test/test_sub.rb +29 -0
- data/lib/carat-dev/interface_work/SCRAP/j-interface/interface-0.1.0/test/test_unrequire.rb +28 -0
- data/lib/carat-dev/interface_work/contracts/contract.zip +0 -0
- data/lib/carat-dev/interface_work/contracts/contract/doc/classes/Contract.html +376 -0
- data/lib/carat-dev/interface_work/contracts/contract/doc/classes/Contract.src/M000001.html +23 -0
- data/lib/carat-dev/interface_work/contracts/contract/doc/classes/Contract.src/M000002.html +18 -0
- data/lib/carat-dev/interface_work/contracts/contract/doc/classes/Contract.src/M000003.html +19 -0
- data/lib/carat-dev/interface_work/contracts/contract/doc/classes/Contract.src/M000004.html +29 -0
- data/lib/carat-dev/interface_work/contracts/contract/doc/classes/Contract.src/M000005.html +18 -0
- data/lib/carat-dev/interface_work/contracts/contract/doc/classes/Contract.src/M000006.html +18 -0
- data/lib/carat-dev/interface_work/contracts/contract/doc/classes/Contract/ContractError.html +142 -0
- data/lib/carat-dev/interface_work/contracts/contract/doc/classes/Contract/ContractException.html +153 -0
- data/lib/carat-dev/interface_work/contracts/contract/doc/classes/Contract/ContractMismatch.html +125 -0
- data/lib/carat-dev/interface_work/contracts/contract/doc/classes/Module.html +157 -0
- data/lib/carat-dev/interface_work/contracts/contract/doc/classes/Module.src/M000007.html +112 -0
- data/lib/carat-dev/interface_work/contracts/contract/doc/created.rid +1 -0
- data/lib/carat-dev/interface_work/contracts/contract/doc/files/lib/contract/assertions_rb.html +109 -0
- data/lib/carat-dev/interface_work/contracts/contract/doc/files/lib/contract/exception_rb.html +108 -0
- data/lib/carat-dev/interface_work/contracts/contract/doc/files/lib/contract/integration_rb.html +108 -0
- data/lib/carat-dev/interface_work/contracts/contract/doc/files/lib/contract/overrides_rb.html +109 -0
- data/lib/carat-dev/interface_work/contracts/contract/doc/files/lib/contract_rb.html +114 -0
- data/lib/carat-dev/interface_work/contracts/contract/doc/fr_class_index.html +31 -0
- data/lib/carat-dev/interface_work/contracts/contract/doc/fr_file_index.html +31 -0
- data/lib/carat-dev/interface_work/contracts/contract/doc/fr_method_index.html +33 -0
- data/lib/carat-dev/interface_work/contracts/contract/doc/index.html +24 -0
- data/lib/carat-dev/interface_work/contracts/contract/doc/rdoc-style.css +208 -0
- data/lib/carat-dev/interface_work/contracts/contract/lib/contract.rb +88 -0
- data/lib/carat-dev/interface_work/contracts/contract/lib/contract/assertions.rb +37 -0
- data/lib/carat-dev/interface_work/contracts/contract/lib/contract/exception.rb +92 -0
- data/lib/carat-dev/interface_work/contracts/contract/lib/contract/integration.rb +132 -0
- data/lib/carat-dev/interface_work/contracts/contract/lib/contract/overrides.rb +32 -0
- data/lib/carat-dev/interface_work/must.rb +37 -0
- data/lib/carat-dev/interface_work/type.rb +232 -0
- data/lib/carat-dev/main/tc_toplevel.rb +23 -0
- data/lib/carat-dev/main/toplevel.rb +33 -0
- data/lib/carat-dev/main/toplevel_test.rb +24 -0
- data/lib/carat-dev/misc/1.rb +40 -0
- data/lib/carat-dev/misc/misc.rb +44 -0
- data/lib/carat-dev/misc/sys.rb +186 -0
- data/lib/carat-dev/misc/temp.rb +1 -0
- data/lib/carat-dev/misc/utils.rb +518 -0
- data/lib/carat-dev/predicate/predicate.rb +109 -0
- data/lib/carat-dev/predicate/predicate_test.rb +67 -0
- data/lib/carat-dev/premshree.rb +40 -0
- data/lib/carat-dev/priority-queue/pqueue.rb +183 -0
- data/lib/carat-dev/priority-queue/priorityqueue.rb +84 -0
- data/lib/carat-dev/quaternion/quaternion.rb +529 -0
- data/lib/carat-dev/range.rb +259 -0
- data/lib/carat-dev/system/rubyinfo.rb +75 -0
- data/lib/carat-dev/system/system.rb +105 -0
- data/lib/carat-dev/tc_range.rb +118 -0
- data/lib/carat-dev/timer/timer-doc/classes/Timer.html +291 -0
- data/lib/carat-dev/timer/timer-doc/classes/Timer.src/M000001.html +26 -0
- data/lib/carat-dev/timer/timer-doc/classes/Timer.src/M000002.html +19 -0
- data/lib/carat-dev/timer/timer-doc/classes/Timer.src/M000003.html +18 -0
- data/lib/carat-dev/timer/timer-doc/classes/Timer.src/M000004.html +18 -0
- data/lib/carat-dev/timer/timer-doc/classes/Timer.src/M000005.html +21 -0
- data/lib/carat-dev/timer/timer-doc/classes/Timer.src/M000006.html +23 -0
- data/lib/carat-dev/timer/timer-doc/created.rid +1 -0
- data/lib/carat-dev/timer/timer-doc/files/timer_rb.html +144 -0
- data/lib/carat-dev/timer/timer-doc/fr_class_index.html +27 -0
- data/lib/carat-dev/timer/timer-doc/fr_file_index.html +27 -0
- data/lib/carat-dev/timer/timer-doc/fr_method_index.html +32 -0
- data/lib/carat-dev/timer/timer-doc/index.html +24 -0
- data/lib/carat-dev/timer/timer-doc/rdoc-style.css +208 -0
- data/lib/carat-dev/timer/timer.rb +160 -0
- data/lib/carat-dev/vars/vars.rb +62 -0
- data/lib/carat/1st.rb +58 -0
- data/lib/carat/ansicolor.rb +122 -0
- data/lib/carat/attr.rb +342 -0
- data/lib/carat/bbcode.rb +352 -0
- data/lib/carat/binaryreader.rb +170 -0
- data/lib/carat/binding-of-caller.rb +83 -0
- data/lib/carat/byteorder.rb +34 -0
- data/lib/carat/constant.rb +287 -0
- data/lib/carat/coroutine.rb +102 -0
- data/lib/carat/crosscase.rb +309 -0
- data/lib/carat/duckhunter.rb +158 -0
- data/lib/carat/dynamic-mixin.rb +71 -0
- data/lib/carat/enumerable-args.rb +125 -0
- data/lib/carat/expect.rb +192 -0
- data/lib/carat/filelist.rb +277 -0
- data/lib/carat/floatstring.rb +153 -0
- data/lib/carat/functor.rb +41 -0
- data/lib/carat/harray.rb +507 -0
- data/lib/carat/heap.rb +193 -0
- data/lib/carat/html-helpers.rb +82 -0
- data/lib/carat/infinity.rb +61 -0
- data/lib/carat/init.rb +33 -0
- data/lib/carat/interval.rb +248 -0
- data/lib/carat/io-reactor.rb +657 -0
- data/lib/carat/io-redirect.rb +99 -0
- data/lib/carat/lisp-format.rb +1832 -0
- data/lib/carat/lisp.rb +336 -0
- data/lib/carat/macro.rb +68 -0
- data/lib/carat/multiton.rb +153 -0
- data/lib/carat/nack.rb +115 -0
- data/lib/carat/nil-comparable.rb +67 -0
- data/lib/carat/nil-missing.rb +12 -0
- data/lib/carat/notcopyable.rb +68 -0
- data/lib/carat/orderedhash.rb +249 -0
- data/lib/carat/ostructable.rb +138 -0
- data/lib/carat/parser-old.rb +350 -0
- data/lib/carat/parser.rb +393 -0
- data/lib/carat/ref.rb +31 -0
- data/lib/carat/semaphore.rb +69 -0
- data/lib/carat/snapshot.rb +94 -0
- data/lib/carat/soundex.rb +104 -0
- data/lib/carat/sstruct.rb +223 -0
- data/lib/carat/statichash.rb +49 -0
- data/lib/carat/tagiter.rb +345 -0
- data/lib/carat/timelimit.rb +114 -0
- data/lib/carat/timer.rb +99 -0
- data/lib/carat/tracepoint.rb +154 -0
- data/lib/carat/tuple.rb +31 -0
- data/lib/carat/uninheritable.rb +68 -0
- data/lib/carat/version.rb +147 -0
- data/pub/doc/sstruct.txt +204 -0
- data/pub/doc/tagiter.html +145 -0
- data/setup.rb +1361 -0
- data/test/fixtures/filelist/testfile.txt +1 -0
- data/test/fixtures/filelist/testfile2.txt +1 -0
- data/test/tc_1st.rb +16 -0
- data/test/tc_ansicolor.rb +23 -0
- data/test/tc_attr.rb +46 -0
- data/test/tc_bbcode.rb +20 -0
- data/test/tc_binaryreader.rb +14 -0
- data/test/tc_binding_of_caller.rb +2 -0
- data/test/tc_byteorder.rb +41 -0
- data/test/tc_constant.rb +12 -0
- data/test/tc_coroutine.rb +50 -0
- data/test/tc_crosscase.rb +33 -0
- data/test/tc_duckhunter.rb +37 -0
- data/test/tc_dynamic-mixin.rb +66 -0
- data/test/tc_enumerable-args.rb +66 -0
- data/test/tc_expect.rb +83 -0
- data/test/tc_filelist.rb +17 -0
- data/test/tc_floatstring.rb +22 -0
- data/test/tc_functor.rb +18 -0
- data/test/tc_harray.rb +280 -0
- data/test/tc_heap.rb +6 -0
- data/test/tc_infinity.rb +23 -0
- data/test/tc_init.rb +29 -0
- data/test/tc_interval.rb +153 -0
- data/test/tc_io-reactor.rb +5 -0
- data/test/tc_io-redirect.rb +5 -0
- data/test/tc_lisp-format.rb +24 -0
- data/test/tc_lisp.rb +32 -0
- data/test/tc_macro.rb +48 -0
- data/test/tc_multiton.rb +188 -0
- data/test/tc_nack.rb +31 -0
- data/test/tc_nil-as-emptiness.rb +19 -0
- data/test/tc_nil-comparable.rb +29 -0
- data/test/tc_nil-missing.rb +0 -0
- data/test/tc_notcopyable.rb +64 -0
- data/test/tc_orderedhash.rb +36 -0
- data/test/tc_ostructable.rb +31 -0
- data/test/tc_semaphore.rb +5 -0
- data/test/tc_snapshot.rb +20 -0
- data/test/tc_soundex.rb +19 -0
- data/test/tc_sstruct.rb +313 -0
- data/test/tc_statichash.rb +24 -0
- data/test/tc_tagiter.rb +80 -0
- data/test/tc_timelimit.rb +47 -0
- data/test/tc_timer.rb +35 -0
- data/test/tc_tracepoint.rb +10 -0
- data/test/tc_tuple.rb +25 -0
- data/test/tc_uninheritable.rb +33 -0
- data/test/tc_version.rb +90 -0
- metadata +531 -0
@@ -0,0 +1,70 @@
|
|
1
|
+
#
|
2
|
+
# daemon.rb
|
3
|
+
#
|
4
|
+
# Copyright (c) 1999-2002 Minero Aoki <aamine@loveruby.net>
|
5
|
+
#
|
6
|
+
# This program is free software.
|
7
|
+
# You can distribute/modify this program under the terms of
|
8
|
+
# the GNU Lesser General Public License version 2 or later.
|
9
|
+
#
|
10
|
+
# $Id: daemon.rb,v 1.2 2002/01/05 06:19:34 aamine Exp $
|
11
|
+
#
|
12
|
+
|
13
|
+
require 'socket'
|
14
|
+
|
15
|
+
|
16
|
+
class Daemon
|
17
|
+
|
18
|
+
def self.exec( port, dir, debug = $DEBUG )
|
19
|
+
new(debug).exec port, dir
|
20
|
+
end
|
21
|
+
|
22
|
+
def initialize( debug = $DEBUG )
|
23
|
+
@debug = $DEBUG
|
24
|
+
end
|
25
|
+
|
26
|
+
def exec( port, dir )
|
27
|
+
if @debug then
|
28
|
+
Dir.chdir dir
|
29
|
+
wait
|
30
|
+
return
|
31
|
+
end
|
32
|
+
|
33
|
+
fork do
|
34
|
+
Process.setsid
|
35
|
+
fork do
|
36
|
+
Dir.chdir dir
|
37
|
+
$stdin.close
|
38
|
+
$stdout.close
|
39
|
+
$stderr.close
|
40
|
+
|
41
|
+
wait
|
42
|
+
end
|
43
|
+
|
44
|
+
exit!
|
45
|
+
end
|
46
|
+
exit!
|
47
|
+
end
|
48
|
+
|
49
|
+
def wait
|
50
|
+
s = TCPServer.new( 10070 )
|
51
|
+
|
52
|
+
unless @debug then
|
53
|
+
trap( 'SIGINT' ) { exit! }
|
54
|
+
trap( 'SIGHUP' ) { exit! }
|
55
|
+
trap( 'SIGTERM' ) { exit! }
|
56
|
+
end
|
57
|
+
|
58
|
+
while true do
|
59
|
+
@sock = s.accept
|
60
|
+
begin
|
61
|
+
session
|
62
|
+
ensure
|
63
|
+
@sock.close
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
# abstract session
|
69
|
+
|
70
|
+
end
|
@@ -0,0 +1,363 @@
|
|
1
|
+
=begin rdoc
|
2
|
+
|
3
|
+
= Object#detach
|
4
|
+
|
5
|
+
Written by Evan Webb <evan@fallingsnow.net>
|
6
|
+
|
7
|
+
Detach an object into a seperate process.
|
8
|
+
|
9
|
+
Simplest example expands to all objects.
|
10
|
+
|
11
|
+
require 'detach'
|
12
|
+
|
13
|
+
s = "blah"
|
14
|
+
s2 = s.detach
|
15
|
+
s2.size # 4
|
16
|
+
s2.to_s # blah
|
17
|
+
|
18
|
+
|
19
|
+
This basic example is true for all objects. All methods
|
20
|
+
are passed to the object running in the other process and
|
21
|
+
the return of #detach can be used in exactly the same way
|
22
|
+
as the original object.
|
23
|
+
|
24
|
+
Useful in splitting of sections of a application that can
|
25
|
+
then use their own thread table and will have better performance
|
26
|
+
then running all parts of a large application under one ruby thread
|
27
|
+
scheduler.
|
28
|
+
|
29
|
+
=end
|
30
|
+
|
31
|
+
require 'drb'
|
32
|
+
|
33
|
+
|
34
|
+
module Dispatch
|
35
|
+
|
36
|
+
# These are created for each background work unit (method call)
|
37
|
+
# that is created. They keep stats and allow for indexing
|
38
|
+
# when the value is ready.
|
39
|
+
class BackgroundUnit
|
40
|
+
attr_accessor :unit_id, :start, :stop
|
41
|
+
attr_reader :value, :thread
|
42
|
+
|
43
|
+
def initialize(id)
|
44
|
+
@unit_id = id
|
45
|
+
@thread = nil
|
46
|
+
@start = nil
|
47
|
+
@stop = nil
|
48
|
+
end
|
49
|
+
|
50
|
+
# Sets the thread of the unit
|
51
|
+
def thread=(th)
|
52
|
+
@thread = th
|
53
|
+
@start = Time.now
|
54
|
+
end
|
55
|
+
|
56
|
+
# Sets the value of the unit
|
57
|
+
def value=(v)
|
58
|
+
@stop = Time.now
|
59
|
+
@value = v
|
60
|
+
end
|
61
|
+
|
62
|
+
# Indicates the elapse time spent on the unit
|
63
|
+
def elapse
|
64
|
+
@stop - @start
|
65
|
+
end
|
66
|
+
|
67
|
+
# Indicates if the unit has finished processing
|
68
|
+
def ready?
|
69
|
+
!@thread.alive?
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
# Attached as the front object to a DRb, and given it's own
|
74
|
+
# front object, method calls on this object spin a new thread
|
75
|
+
# to handle the method and returns a BackgroundObject right
|
76
|
+
# away. Future usage of said BackgroundObject causes it to
|
77
|
+
# request the real object from the Dispatch (via DRb), at
|
78
|
+
# which time operations may block. This allows for the time
|
79
|
+
# between object creation and object usage for the real remote
|
80
|
+
# object to do it's working, not blocking the local objects.
|
81
|
+
class BackgroundDispatch
|
82
|
+
|
83
|
+
undef :to_s
|
84
|
+
undef :to_a
|
85
|
+
undef :respond_to?
|
86
|
+
|
87
|
+
def initialize(front,drb=false)
|
88
|
+
@front = front
|
89
|
+
@units = Hash.new
|
90
|
+
@drb = drb
|
91
|
+
end
|
92
|
+
|
93
|
+
# This is defined to keep DRb and such from trying
|
94
|
+
# to move a the Dispatcher, which must remain in the same
|
95
|
+
# context as the called method. Though, having Thread
|
96
|
+
# objects referenced with @units makes that true as well.
|
97
|
+
def _dump(d)
|
98
|
+
raise TypeError, "can't be moved"
|
99
|
+
end
|
100
|
+
|
101
|
+
# Someone has requested an operation on
|
102
|
+
# this front object to be performed. Ok, lets spin
|
103
|
+
# of the method to do it's working and return a
|
104
|
+
# BackgroundObject as a stand in.
|
105
|
+
def method_missing(msg_id, *a, &b)
|
106
|
+
# puts "Calling #{msg_id}..."
|
107
|
+
if @drb
|
108
|
+
obj = BackgroundObject.new(DRbObject.new(self))
|
109
|
+
else
|
110
|
+
obj = BackgroundObject.new(self)
|
111
|
+
end
|
112
|
+
|
113
|
+
unit = BackgroundUnit.new(obj.index)
|
114
|
+
unit.thread = Thread.new(unit) { |u|
|
115
|
+
# puts " >> In thread, sending method to real object (#{obj.index})"
|
116
|
+
u.value = @front.__send__(msg_id, *a, &b)
|
117
|
+
# puts " >> Finished operation (#{obj.index})"
|
118
|
+
}
|
119
|
+
@units[obj.index] = unit
|
120
|
+
# puts "Returning a BO for #{obj.index}"
|
121
|
+
return obj
|
122
|
+
end
|
123
|
+
|
124
|
+
# Used fetch the value of the work unit associated with
|
125
|
+
# the BackgroundObject at index. This method blocks,
|
126
|
+
# waiting until the value is ready before returning it.
|
127
|
+
def _get_obj(index)
|
128
|
+
# puts "Fetching object #{index} in #{Process.pid}"
|
129
|
+
# puts "Unit is #{@units[index].inspect}"
|
130
|
+
if not @units[index].ready?
|
131
|
+
@units[index].thread.join
|
132
|
+
end
|
133
|
+
# puts "Returning value.."
|
134
|
+
return @units[index].value
|
135
|
+
end
|
136
|
+
|
137
|
+
# Used to check if the work unit is ready.
|
138
|
+
def _obj_ready?(uid)
|
139
|
+
# puts "Checking for readiness in #{Process.pid}"
|
140
|
+
@units[uid].ready?
|
141
|
+
end
|
142
|
+
|
143
|
+
# Used for stats transparent back to the caller.
|
144
|
+
# This is done in seperate struct rather then just
|
145
|
+
# returning the unit object because it can easily be
|
146
|
+
# seralized and used on the local side of a DRb session
|
147
|
+
Stats = Struct.new(:start, :stop, :running)
|
148
|
+
|
149
|
+
# Returns the stats for a work unit.
|
150
|
+
def _obj_stats(uid)
|
151
|
+
unit = @units[uid]
|
152
|
+
if unit.nil?
|
153
|
+
return Stats.new
|
154
|
+
end
|
155
|
+
return Stats.new(unit.start,unit.stop,unit.thread.alive?)
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
# Used to create non-blocking remote method calls. Has an
|
160
|
+
# index of a work unit and a dispatch object to call on
|
161
|
+
# to do all the work.
|
162
|
+
class BackgroundObject
|
163
|
+
|
164
|
+
attr_reader :index
|
165
|
+
|
166
|
+
def initialize(dispatch)
|
167
|
+
@dispatch = dispatch
|
168
|
+
@index = self.object_id()
|
169
|
+
end
|
170
|
+
|
171
|
+
undef :to_s
|
172
|
+
undef :to_a
|
173
|
+
undef :respond_to?
|
174
|
+
|
175
|
+
# Passes all unknown method calls back to the
|
176
|
+
# original object by way of the dispatch.
|
177
|
+
def method_missing(msg_id, *a, &b)
|
178
|
+
# puts "in #{Process.pid}, asking for #{msg_id} from a #{@dispatch.class}"
|
179
|
+
obj = @dispatch._get_obj(@index)
|
180
|
+
# puts "Ret is a #{obj.class}"
|
181
|
+
obj.__send__(msg_id,*a,&b)
|
182
|
+
end
|
183
|
+
|
184
|
+
# Returns true if the real object is ready.
|
185
|
+
def ready?
|
186
|
+
# puts "Checking for readiness from #{Process.pid}"
|
187
|
+
@dispatch._obj_ready?(@index)
|
188
|
+
end
|
189
|
+
alias :done? :ready?
|
190
|
+
|
191
|
+
# Returns stats for the backgrouded call.
|
192
|
+
def stats
|
193
|
+
@dispatch._obj_stats(@index)
|
194
|
+
end
|
195
|
+
|
196
|
+
# I added when it choked needing this
|
197
|
+
def self._load(d)
|
198
|
+
end
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
|
203
|
+
|
204
|
+
class Object
|
205
|
+
# Accepts a hash of options to use when detaching.
|
206
|
+
#
|
207
|
+
# :ps - Controls if the title of the new process is changed
|
208
|
+
# to reflect it being a detached object.
|
209
|
+
#
|
210
|
+
# Values:
|
211
|
+
# * :append - Append information to the current process title
|
212
|
+
# * :replace - Replace the current process title all together
|
213
|
+
# * :none - Don't change the process title at all
|
214
|
+
#
|
215
|
+
#
|
216
|
+
# :name - Sets what the name of the process actually is.
|
217
|
+
#
|
218
|
+
# Values:
|
219
|
+
# * :parent - Uses the current process title as the name of the
|
220
|
+
# detached process (ie, $0 of the parent)
|
221
|
+
# * String - Any String value is used as the name
|
222
|
+
#
|
223
|
+
#
|
224
|
+
# :id - Sets what the id of the process will be in the new
|
225
|
+
# process title.
|
226
|
+
#
|
227
|
+
# Values:
|
228
|
+
# * :object Uses a default id, looks like the default Object#to_s
|
229
|
+
# * String Any String value is used as the id
|
230
|
+
#
|
231
|
+
#
|
232
|
+
# :die - Controls if the child process will be killed if the
|
233
|
+
# parent exits.
|
234
|
+
#
|
235
|
+
# Values:
|
236
|
+
# * :parent Detached object process follows the course of
|
237
|
+
# the parent process
|
238
|
+
# * :none The detached object process will continue running
|
239
|
+
# inspite of the fate of the parent process
|
240
|
+
#
|
241
|
+
# :path - The template of the location of the pipe used for
|
242
|
+
# communication between the parent and the detached process.
|
243
|
+
#
|
244
|
+
# Defaults to: '/tmp/drb_detach.#{pid}'
|
245
|
+
#
|
246
|
+
# Use single quotes to embed variables to be filled in later.
|
247
|
+
#
|
248
|
+
# Available variables:
|
249
|
+
# * pid The process id of the detached process
|
250
|
+
#
|
251
|
+
#
|
252
|
+
# :allrefs - Controls how objects are passed to and from the
|
253
|
+
# detached process. If :allrefs is set to true, all objects
|
254
|
+
# passed back and forth from the remote object are only
|
255
|
+
# passed as references, so that the original executing context
|
256
|
+
# (ie. process) is always used. This option defaults to true
|
257
|
+
# because it is the expect operating procedure.
|
258
|
+
#
|
259
|
+
# The use of this option takes pains to allow objects you would
|
260
|
+
# always expect to be Marshalled to still be Marshalled, such as
|
261
|
+
# Symbol, String, Fixnum, Bignum, Array, etc.
|
262
|
+
#
|
263
|
+
# NOTE: if you have problems with objects passed to detached
|
264
|
+
# objects executing there methods in the detached process, and
|
265
|
+
# you want them executed in the original context, try including
|
266
|
+
# Drb::Undumped in your object rather then using this.
|
267
|
+
#
|
268
|
+
# :background - Controls how methods are dispatch on the detached
|
269
|
+
# object. If :background is true, then all method calls are done
|
270
|
+
# non-blocking, and a place holder object is returned. When
|
271
|
+
# that place holder object has it's methods called, it blocks,
|
272
|
+
# waiting for the real method operation to finish.
|
273
|
+
def detach(cfg={})
|
274
|
+
cfg = {
|
275
|
+
:ps => :append,
|
276
|
+
:die => :parent,
|
277
|
+
:name => :parent,
|
278
|
+
:id => :object,
|
279
|
+
:path => '/tmp/drb_detach.#{pid}',
|
280
|
+
:allref => true,
|
281
|
+
:background => true
|
282
|
+
}.merge(cfg)
|
283
|
+
|
284
|
+
if cfg[:name] == :parent
|
285
|
+
name = $0
|
286
|
+
else
|
287
|
+
name = cfg[:name].to_s
|
288
|
+
end
|
289
|
+
|
290
|
+
if cfg[:id] == :object
|
291
|
+
id = "#<#{self.class}:0x#{self.object_id.to_s(16)}>"
|
292
|
+
else
|
293
|
+
id = cfg[:id]
|
294
|
+
end
|
295
|
+
|
296
|
+
pid = fork {
|
297
|
+
# A nice little trick
|
298
|
+
case cfg[:ps]
|
299
|
+
when :append
|
300
|
+
$0 = name + " - #{id}"
|
301
|
+
when :replace
|
302
|
+
$0 = id
|
303
|
+
when :none
|
304
|
+
break
|
305
|
+
end
|
306
|
+
|
307
|
+
if cfg[:ps].kind_of? String
|
308
|
+
$0 = cfg[:ps]
|
309
|
+
end
|
310
|
+
|
311
|
+
trap("INT") {
|
312
|
+
exit
|
313
|
+
}
|
314
|
+
|
315
|
+
pid = Process.pid
|
316
|
+
|
317
|
+
obj = nil
|
318
|
+
if cfg[:background] == true
|
319
|
+
obj = Dispatch::BackgroundDispatch.new(self,true)
|
320
|
+
else
|
321
|
+
obj = self
|
322
|
+
end
|
323
|
+
|
324
|
+
DRb.start_service("drbunix://"+eval(%!"#{cfg[:path]}"!),obj)
|
325
|
+
DRb.thread.join
|
326
|
+
exit
|
327
|
+
}
|
328
|
+
|
329
|
+
# Mom always said I should clean up after myself
|
330
|
+
|
331
|
+
if cfg[:die] == :parent
|
332
|
+
at_exit {
|
333
|
+
Process.kill("INT", pid)
|
334
|
+
}
|
335
|
+
end
|
336
|
+
|
337
|
+
sleep 0.3
|
338
|
+
DRb.start_service
|
339
|
+
remote = DRbObject.new(nil,"drbunix://"+eval(%!"#{cfg[:path]}"!))
|
340
|
+
if cfg[:allref] == true
|
341
|
+
remote.instance_eval "alias :real_method_missing :method_missing"
|
342
|
+
|
343
|
+
def remote.method_missing(msg_id, *a, &b)
|
344
|
+
a.each do |i|
|
345
|
+
allow = true
|
346
|
+
[Symbol, String, Fixnum, Bignum, Array, Regexp].each do |t|
|
347
|
+
if i.kind_of? t
|
348
|
+
allow = false
|
349
|
+
break
|
350
|
+
end
|
351
|
+
end
|
352
|
+
next if not allow
|
353
|
+
def i._dump(d)
|
354
|
+
raise TypeError, 'can\'t dump'
|
355
|
+
end
|
356
|
+
end
|
357
|
+
return real_method_missing(msg_id, *a)
|
358
|
+
end
|
359
|
+
end
|
360
|
+
|
361
|
+
return remote
|
362
|
+
end
|
363
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
|
2
|
+
require 'test/unit'
|
3
|
+
require 'carat/detach.rb'
|
4
|
+
|
5
|
+
|
6
|
+
# fixture
|
7
|
+
|
8
|
+
class Logger
|
9
|
+
def log(str)
|
10
|
+
puts "From #{Process.pid}: #{str.to_s}"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class Person
|
15
|
+
attr_accessor :log
|
16
|
+
def say(msg)
|
17
|
+
puts "Detached #{Process.pid}"
|
18
|
+
@log.log("hello, i said #{msg}")
|
19
|
+
end
|
20
|
+
def wait
|
21
|
+
sleep 10
|
22
|
+
"hi"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
class TC_Detach < Test::Unit::TestCase
|
28
|
+
|
29
|
+
puts "Parent is #{Process.pid}"
|
30
|
+
|
31
|
+
log = Logger.new
|
32
|
+
p = Person.new
|
33
|
+
p = p.detach(:allref => true)
|
34
|
+
puts "p is a #{p.class}"
|
35
|
+
p.log = log
|
36
|
+
p.say("I won!")
|
37
|
+
|
38
|
+
s = p.wait
|
39
|
+
|
40
|
+
puts "s is a #{s.class}"
|
41
|
+
|
42
|
+
puts "While i'm here, the other process should be doing it's thing."
|
43
|
+
puts "It's waiting for 10 seconds, so if i wait for 5, it should only be another 5 after i ask for the method that it returns"
|
44
|
+
sleep 5
|
45
|
+
|
46
|
+
puts "Lets try something..."
|
47
|
+
while not s.ready?
|
48
|
+
puts "Is the method ready? (#{s.ready?})"
|
49
|
+
sleep 2
|
50
|
+
end
|
51
|
+
p s.to_s
|
52
|
+
|
53
|
+
puts "Stats:"
|
54
|
+
p s.stats
|
55
|
+
|
56
|
+
end
|
57
|
+
|