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,71 @@
|
|
|
1
|
+
=begin :rdoc:
|
|
2
|
+
|
|
3
|
+
= DynamicMixin
|
|
4
|
+
|
|
5
|
+
== Example
|
|
6
|
+
|
|
7
|
+
module Mixin
|
|
8
|
+
extend DynamicMixin
|
|
9
|
+
def self.default_options
|
|
10
|
+
{ :name => "Buffalo" }
|
|
11
|
+
end
|
|
12
|
+
def hello
|
|
13
|
+
puts "Hello from #{dynamic_options[:name]}!"
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
class T
|
|
18
|
+
include Mixin[ :name => "Test" ]
|
|
19
|
+
end
|
|
20
|
+
t = T.new
|
|
21
|
+
t.hello
|
|
22
|
+
|
|
23
|
+
class S
|
|
24
|
+
include Mixin[ :name => "Sister" ]
|
|
25
|
+
end
|
|
26
|
+
s = S.new
|
|
27
|
+
s.hello
|
|
28
|
+
|
|
29
|
+
module Mixin2
|
|
30
|
+
extend DynamicMixin
|
|
31
|
+
include Mixin[ :name => "Flo"]
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
class R
|
|
35
|
+
include Mixin2[ :name => "Bruce"]
|
|
36
|
+
end
|
|
37
|
+
r = R.new
|
|
38
|
+
r.hello
|
|
39
|
+
|
|
40
|
+
=end
|
|
41
|
+
|
|
42
|
+
module DynamicMixin
|
|
43
|
+
|
|
44
|
+
def self.extended( mod )
|
|
45
|
+
mod.class_eval do
|
|
46
|
+
define_method(:dynamic_options) {
|
|
47
|
+
mod.respond_to?(:default_options) ? mod.default_options : {}
|
|
48
|
+
}
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def [](options = {})
|
|
53
|
+
@cache ||= {} # Not really needed, but not much work either
|
|
54
|
+
|
|
55
|
+
defaults = self.respond_to?( :default_options ) ? self.default_options : {}
|
|
56
|
+
options = defaults.merge(options)
|
|
57
|
+
|
|
58
|
+
mod = self.name
|
|
59
|
+
opt_str = options.map { |pair| pair.join(" => ") }.join(", ")
|
|
60
|
+
name = "#{self.name}[#{opt_str}]"
|
|
61
|
+
|
|
62
|
+
@cache[options] ||= self.dup
|
|
63
|
+
@cache[options].class_eval {
|
|
64
|
+
meta = class << self; self; end
|
|
65
|
+
meta.send(:define_method, :name) { name }
|
|
66
|
+
define_method(:dynamic_options) { options }
|
|
67
|
+
}
|
|
68
|
+
return @cache[options]
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
end
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
=begin rdoc
|
|
2
|
+
|
|
3
|
+
= EnumerableWithArgs
|
|
4
|
+
|
|
5
|
+
This is a simple reimplementation of the core Enumerable module
|
|
6
|
+
to allow the methods to take and pass-on arbitrary arguments to the
|
|
7
|
+
underlying #each call.
|
|
8
|
+
|
|
9
|
+
== Synopsis
|
|
10
|
+
|
|
11
|
+
require 'carat/enumerable-args'
|
|
12
|
+
|
|
13
|
+
class T
|
|
14
|
+
include Enumerable
|
|
15
|
+
def initialize(arr)
|
|
16
|
+
@arr = arr
|
|
17
|
+
end
|
|
18
|
+
def each(n)
|
|
19
|
+
arr.each{ |e| yield(e+n) }
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
t = T.new([1,2,3])
|
|
24
|
+
t.collect(4)
|
|
25
|
+
#=> [5,6,7]
|
|
26
|
+
|
|
27
|
+
== Note
|
|
28
|
+
|
|
29
|
+
The #sort method still needs to be done.
|
|
30
|
+
|
|
31
|
+
== Legal
|
|
32
|
+
|
|
33
|
+
Copyright (c) 2004 Thomas Sawyer, Pancakes License
|
|
34
|
+
|
|
35
|
+
== History
|
|
36
|
+
|
|
37
|
+
$Id: enumerable.rb,v 1.0 2004/11/30 transami Exp $
|
|
38
|
+
|
|
39
|
+
=end
|
|
40
|
+
|
|
41
|
+
module EnumerableWithArgs
|
|
42
|
+
|
|
43
|
+
def collect(*args) # :yield:
|
|
44
|
+
a = []
|
|
45
|
+
each(*args){ |n| a << yield(n) }
|
|
46
|
+
a
|
|
47
|
+
end
|
|
48
|
+
alias_method( :map, :collect )
|
|
49
|
+
|
|
50
|
+
def detect(*args) # :yield:
|
|
51
|
+
each(*args){ |n| return n if yield(n) }
|
|
52
|
+
nil
|
|
53
|
+
end
|
|
54
|
+
alias_method( :find, :detect )
|
|
55
|
+
|
|
56
|
+
# problematic for multiple arity on block
|
|
57
|
+
#def each_with_index(*args)
|
|
58
|
+
# i=0
|
|
59
|
+
# each(*args){ |n,i| yield(n); i+=1 }
|
|
60
|
+
# self
|
|
61
|
+
#end
|
|
62
|
+
|
|
63
|
+
def to_a(*args)
|
|
64
|
+
a = []
|
|
65
|
+
each(*args){ |n| a << n }
|
|
66
|
+
a
|
|
67
|
+
end
|
|
68
|
+
alias_method( :entries, :to_a )
|
|
69
|
+
|
|
70
|
+
# An additional method not part of standard Enumerable.
|
|
71
|
+
# The regular version of this method can be found in Facets,
|
|
72
|
+
# but it is a bit more advanced then this one.
|
|
73
|
+
# At some point they need to be put into sync.
|
|
74
|
+
def each_slice(*args, &yld)
|
|
75
|
+
a = []; s = []
|
|
76
|
+
ar = yld.arity.abs
|
|
77
|
+
each(*args){ |n|
|
|
78
|
+
s << n
|
|
79
|
+
if s.length >= ar
|
|
80
|
+
yld.call(*s)
|
|
81
|
+
s = []
|
|
82
|
+
end
|
|
83
|
+
}
|
|
84
|
+
a
|
|
85
|
+
end
|
|
86
|
+
alias_method( :each_by, :each_slice )
|
|
87
|
+
|
|
88
|
+
def select(*args) # :yield:
|
|
89
|
+
a = []
|
|
90
|
+
each(*args){ |n| a << n if yield(n) }
|
|
91
|
+
a
|
|
92
|
+
end
|
|
93
|
+
alias_method( :find_all, :select )
|
|
94
|
+
|
|
95
|
+
def grep(pattern, *args)
|
|
96
|
+
a = []
|
|
97
|
+
each(*args){ |n| a << (block_given? ? yield(n) : n) if pattern === n }
|
|
98
|
+
a
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def include?(anObj, *args)
|
|
102
|
+
each(*args){ |n| return true if anObj == n }
|
|
103
|
+
false
|
|
104
|
+
end
|
|
105
|
+
alias_method( :member?, :include? )
|
|
106
|
+
|
|
107
|
+
def max(*args)
|
|
108
|
+
to_a(*args).max
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def min(*args)
|
|
112
|
+
to_a(*args).min
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def reject(*args)
|
|
116
|
+
a = []
|
|
117
|
+
each(*args){ |n| a << n if ! yield(n) }
|
|
118
|
+
a
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def sort(*args)
|
|
122
|
+
# TODO
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
end
|
data/lib/carat/expect.rb
ADDED
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
=begin rdoc
|
|
2
|
+
|
|
3
|
+
= Expect
|
|
4
|
+
|
|
5
|
+
Given an IO object, read data from that object and expect certain data.
|
|
6
|
+
|
|
7
|
+
All expected data is expected in 'chains'. When a message is received, it
|
|
8
|
+
is compared to the pattern at the top of each chain. If it matches one of
|
|
9
|
+
the patterns, then all is well, but an error message is printed otherwise.
|
|
10
|
+
|
|
11
|
+
A message can match patterns in more than one chain.
|
|
12
|
+
|
|
13
|
+
== Synopsis
|
|
14
|
+
|
|
15
|
+
require 'carat/expect'
|
|
16
|
+
|
|
17
|
+
# to do
|
|
18
|
+
|
|
19
|
+
== Legal
|
|
20
|
+
|
|
21
|
+
Adopted from Ruby Treasures 0.4
|
|
22
|
+
Copyright (C) 2002 Paul Brannan <paul@atdesk.com>
|
|
23
|
+
|
|
24
|
+
You may distribute this software under the same terms as Ruby (see the file
|
|
25
|
+
COPYING that was distributed with this library).
|
|
26
|
+
|
|
27
|
+
== History
|
|
28
|
+
|
|
29
|
+
$Id: expect.rb, v0.4 2004/11/30 transami Exp $
|
|
30
|
+
|
|
31
|
+
=end
|
|
32
|
+
|
|
33
|
+
class Expect
|
|
34
|
+
public
|
|
35
|
+
|
|
36
|
+
VERSION = "0.4"
|
|
37
|
+
|
|
38
|
+
class UnmatchedMessage < Exception
|
|
39
|
+
attr_reader :msg
|
|
40
|
+
|
|
41
|
+
def initialize(msg)
|
|
42
|
+
@msg = msg
|
|
43
|
+
super("Message not matched: `#{msg}'")
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
class Timeout < Exception
|
|
48
|
+
attr_reader :chain
|
|
49
|
+
attr_reader :pattern
|
|
50
|
+
|
|
51
|
+
def initialize(chain, pattern)
|
|
52
|
+
@chain = chain
|
|
53
|
+
@pattern = pattern
|
|
54
|
+
|
|
55
|
+
super("Timed out waiting for #{pattern.inspect} in chain #{chain.inspect}")
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
##
|
|
60
|
+
# A special type of pattern that matches a list of patterns, separated
|
|
61
|
+
# by a given separator, in any order.
|
|
62
|
+
#
|
|
63
|
+
# Example:
|
|
64
|
+
# <pre>
|
|
65
|
+
# # matches 'foo,bar' and 'bar,foo'
|
|
66
|
+
# p = Expect::SeparatedPattern.new(['foo', 'bar'])
|
|
67
|
+
#
|
|
68
|
+
# e = Expect.new(nil, nil)
|
|
69
|
+
# e.expect(p)
|
|
70
|
+
# </pre>
|
|
71
|
+
#
|
|
72
|
+
class SeparatedPattern
|
|
73
|
+
attr_accessor :separator
|
|
74
|
+
|
|
75
|
+
def initialize(message, separator = ',')
|
|
76
|
+
@message = message
|
|
77
|
+
@separator = separator
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def ===(line)
|
|
81
|
+
message = @message.dup
|
|
82
|
+
|
|
83
|
+
# Iterate through each field to make sure it matches. When
|
|
84
|
+
# we find a match, delete that field so we never check it
|
|
85
|
+
# again.
|
|
86
|
+
for field in fields do
|
|
87
|
+
message.each_index do |index|
|
|
88
|
+
if message[index] === field then
|
|
89
|
+
message.delete_at(index)
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# If there are no more fields, then we deleted all of them,
|
|
95
|
+
# and we got a match
|
|
96
|
+
return message.length == 0
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
class DefaultChain
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
##
|
|
104
|
+
# It is highly recommended that this be an immutable object.
|
|
105
|
+
#
|
|
106
|
+
attr_accessor :timeout
|
|
107
|
+
|
|
108
|
+
##
|
|
109
|
+
# Create a new Expect_Test object.
|
|
110
|
+
#
|
|
111
|
+
# @param io_object an IO object to read from.
|
|
112
|
+
# @param reactor a reactor to use
|
|
113
|
+
#
|
|
114
|
+
def initialize(io_object, reactor)
|
|
115
|
+
@io_object = io_object
|
|
116
|
+
@reactor = reactor
|
|
117
|
+
@reactor.register_read(@io_object, method(:handle_event))
|
|
118
|
+
reset()
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
##
|
|
122
|
+
# Reset the the ignore chain and all expect chains.
|
|
123
|
+
#
|
|
124
|
+
def reset()
|
|
125
|
+
@expect_chain = Hash.new
|
|
126
|
+
@ignore_chain = Array.new
|
|
127
|
+
@expects_left = 0
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
##
|
|
131
|
+
# Expect a message matching pattern in a certain chain.
|
|
132
|
+
#
|
|
133
|
+
# @param pattern the pattern to expect.
|
|
134
|
+
# @param chain the chain in which to expect the message.
|
|
135
|
+
#
|
|
136
|
+
def expect(pattern, chain=DefaultChain)
|
|
137
|
+
@expect_chain[chain] ||= Array.new
|
|
138
|
+
@expect_chain[chain].push(pattern)
|
|
139
|
+
@expects_left += 1
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
##
|
|
143
|
+
# Ignore a pattern in all chains.
|
|
144
|
+
#
|
|
145
|
+
# @param pattern the pattern to ignore.
|
|
146
|
+
#
|
|
147
|
+
def ignore(pattern)
|
|
148
|
+
@ignore_chain.push(pattern)
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def run(timeout = nil)
|
|
152
|
+
return if @expects_left == 0
|
|
153
|
+
catch :expect_loop_done do
|
|
154
|
+
@reactor.run_event_loop(timeout)
|
|
155
|
+
for key, chain in @expect_chain do
|
|
156
|
+
next if chain.length == 0
|
|
157
|
+
raise Timeout.new(key, chain.first)
|
|
158
|
+
end
|
|
159
|
+
# TODO: What does it mean if we got here?
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
def handle_event(io_object)
|
|
164
|
+
handle_line(io_object.gets())
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
def handle_line(line)
|
|
168
|
+
line.chomp!()
|
|
169
|
+
|
|
170
|
+
# Check each element in the ignore chain
|
|
171
|
+
for pattern in @ignore_chain do
|
|
172
|
+
return if pattern === line
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
# Check the first element of each expect chain to see if
|
|
176
|
+
# the message matches
|
|
177
|
+
match = false
|
|
178
|
+
for key, chain in @expect_chain do
|
|
179
|
+
next if chain.length == 0
|
|
180
|
+
if chain.first() === line then
|
|
181
|
+
chain.shift()
|
|
182
|
+
@expects_left -= 1
|
|
183
|
+
match = true
|
|
184
|
+
end
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
throw :expect_loop_done if @expects_left == 0
|
|
188
|
+
|
|
189
|
+
raise UnmatchedMessage.new(line) if match == false
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
=begin rdoc
|
|
2
|
+
|
|
3
|
+
= FileList
|
|
4
|
+
|
|
5
|
+
A FileList is essentially an array with a few helper methods
|
|
6
|
+
defined to make file manipulation a bit easier. It works in
|
|
7
|
+
a fashion similar to Dir.glob.
|
|
8
|
+
|
|
9
|
+
== Synopsis
|
|
10
|
+
|
|
11
|
+
require 'trix/filelist'
|
|
12
|
+
|
|
13
|
+
fl = FileList.new
|
|
14
|
+
fl.include('./**/*')
|
|
15
|
+
fl.exclude('./*~')
|
|
16
|
+
|
|
17
|
+
== Legal
|
|
18
|
+
|
|
19
|
+
Ported from Rake
|
|
20
|
+
Copyright (C) 2002 Jim Welch
|
|
21
|
+
|
|
22
|
+
You may distribute this software under the same terms as Ruby (see the file
|
|
23
|
+
COPYING that was distributed with this library).
|
|
24
|
+
|
|
25
|
+
== History
|
|
26
|
+
|
|
27
|
+
$id: filelist.rb 2004/11/27 10:00:01 transami Exp $
|
|
28
|
+
|
|
29
|
+
=end
|
|
30
|
+
|
|
31
|
+
class FileList < Array
|
|
32
|
+
|
|
33
|
+
# Rewrite all array methods (and to_s) to resolve the list before
|
|
34
|
+
# running.
|
|
35
|
+
methods = Array.instance_methods - Object.instance_methods
|
|
36
|
+
methods << "to_a"
|
|
37
|
+
methods.each_with_index do |sym, i|
|
|
38
|
+
alias_method "array_#{i}", sym
|
|
39
|
+
class_eval %{
|
|
40
|
+
def #{sym}(*args, &block)
|
|
41
|
+
resolve if @pending
|
|
42
|
+
array_#{i}(*args, &block)
|
|
43
|
+
end
|
|
44
|
+
}
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Create a file list from the globbable patterns given. If you
|
|
48
|
+
# wish to perform multiple includes or excludes at object build
|
|
49
|
+
# time, use the "yield self" pattern.
|
|
50
|
+
#
|
|
51
|
+
# Example:
|
|
52
|
+
# file_list = FileList.new['lib/**/*.rb', 'test/test*.rb']
|
|
53
|
+
#
|
|
54
|
+
# pkg_files = FileList.new['lib/**/*'] do |fl|
|
|
55
|
+
# fl.exclude(/\bCVS\b/)
|
|
56
|
+
# end
|
|
57
|
+
#
|
|
58
|
+
def initialize(*patterns)
|
|
59
|
+
@pending_add = []
|
|
60
|
+
@pending = false
|
|
61
|
+
@exclude_patterns = DEFAULT_IGNORE_PATTERNS.dup
|
|
62
|
+
@exclude_re = nil
|
|
63
|
+
# @extent_only = false
|
|
64
|
+
patterns.each { |pattern| include(pattern) }
|
|
65
|
+
yield self if block_given?
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Add file names defined by glob patterns to the file list. If an
|
|
69
|
+
# array is given, add each element of the array.
|
|
70
|
+
#
|
|
71
|
+
# Example:
|
|
72
|
+
# file_list.include("*.java", "*.cfg")
|
|
73
|
+
# file_list.include %w( math.c lib.h *.o )
|
|
74
|
+
#
|
|
75
|
+
def include(*filenames)
|
|
76
|
+
# TODO: check for pending
|
|
77
|
+
filenames.each do |fn| @pending_add << fn end
|
|
78
|
+
@pending = true
|
|
79
|
+
self
|
|
80
|
+
end
|
|
81
|
+
alias :add :include
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
# def extent_only?
|
|
85
|
+
# @extent_only
|
|
86
|
+
# end
|
|
87
|
+
#
|
|
88
|
+
# def extent_only=(x)
|
|
89
|
+
# @extent_only = x ? true : false
|
|
90
|
+
# end
|
|
91
|
+
|
|
92
|
+
# Register a list of file name patterns that should be excluded
|
|
93
|
+
# from the list. Patterns may be regular expressions, glob
|
|
94
|
+
# patterns or regular strings.
|
|
95
|
+
#
|
|
96
|
+
# Note that glob patterns are expanded against the file system.
|
|
97
|
+
# If a file is explicitly added to a file list, but does not exist
|
|
98
|
+
# in the file system, then an glob pattern in the exclude list
|
|
99
|
+
# will not exclude the file.
|
|
100
|
+
#
|
|
101
|
+
# Examples:
|
|
102
|
+
# FileList['a.c', 'b.c'].exclude("a.c") => ['b.c']
|
|
103
|
+
# FileList['a.c', 'b.c'].exclude(/^a/) => ['b.c']
|
|
104
|
+
#
|
|
105
|
+
# If "a.c" is a file, then ...
|
|
106
|
+
# FileList['a.c', 'b.c'].exclude("a.*") => ['b.c']
|
|
107
|
+
#
|
|
108
|
+
# If "a.c" is not a file, then ...
|
|
109
|
+
# FileList['a.c', 'b.c'].exclude("a.*") => ['a.c', 'b.c']
|
|
110
|
+
#
|
|
111
|
+
def exclude(*patterns)
|
|
112
|
+
# TODO: check for pending
|
|
113
|
+
patterns.each do |pat| @exclude_patterns << pat end
|
|
114
|
+
if ! @pending
|
|
115
|
+
calculate_exclude_regexp
|
|
116
|
+
reject! { |fn| fn =~ @exclude_re }
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def clear_exclude
|
|
122
|
+
@exclude_patterns = []
|
|
123
|
+
calculate_exclude_regexp if ! @pending
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
# Resolve all the pending adds now.
|
|
127
|
+
def resolve
|
|
128
|
+
@pending = false
|
|
129
|
+
@pending_add.each do |fn| resolve_add(fn) end
|
|
130
|
+
@pending_add = []
|
|
131
|
+
resolve_exclude
|
|
132
|
+
self
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def calculate_exclude_regexp
|
|
136
|
+
ignores = []
|
|
137
|
+
@exclude_patterns.each do |pat|
|
|
138
|
+
case pat
|
|
139
|
+
when Regexp
|
|
140
|
+
ignores << pat
|
|
141
|
+
when /[*.]/
|
|
142
|
+
Dir[pat].each do |p| ignores << p end
|
|
143
|
+
else
|
|
144
|
+
ignores << Regexp.quote(pat)
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
if ignores.empty?
|
|
148
|
+
@exclude_re = /^$/
|
|
149
|
+
else
|
|
150
|
+
re_str = ignores.collect { |p| "(" + p.to_s + ")" }.join("|")
|
|
151
|
+
@exclude_re = Regexp.new(re_str)
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
def resolve_add(fn)
|
|
156
|
+
case fn
|
|
157
|
+
when NilClass
|
|
158
|
+
# ignore
|
|
159
|
+
when Array
|
|
160
|
+
fn.each { |f| self.resolve_add(f) }
|
|
161
|
+
when %r{[*?]}
|
|
162
|
+
add_matching(fn)
|
|
163
|
+
else
|
|
164
|
+
self << fn if FileTest.exists?( fn )
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
def resolve_exclude
|
|
169
|
+
@exclude_patterns.each do |pat|
|
|
170
|
+
case pat
|
|
171
|
+
when Regexp
|
|
172
|
+
reject! { |fn| fn =~ pat }
|
|
173
|
+
when /[*.]/
|
|
174
|
+
reject_list = Dir[pat]
|
|
175
|
+
reject! { |fn| reject_list.include?(fn) }
|
|
176
|
+
else
|
|
177
|
+
reject! { |fn| fn == pat }
|
|
178
|
+
end
|
|
179
|
+
end
|
|
180
|
+
self
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
# Return a new FileList with the results of running +sub+ against
|
|
184
|
+
# each element of the oringal list.
|
|
185
|
+
#
|
|
186
|
+
# Example:
|
|
187
|
+
# FileList['a.c', 'b.c'].sub(/\.c$/, '.o') => ['a.o', 'b.o']
|
|
188
|
+
#
|
|
189
|
+
def sub(pat, rep)
|
|
190
|
+
inject(FileList.new) { |res, fn| res << fn.sub(pat,rep) }
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
# Return a new FileList with the results of running +gsub+ against
|
|
194
|
+
# each element of the original list.
|
|
195
|
+
#
|
|
196
|
+
# Example:
|
|
197
|
+
# FileList['lib/test/file', 'x/y'].gsub(/\//, "\\")
|
|
198
|
+
# => ['lib\\test\\file', 'x\\y']
|
|
199
|
+
#
|
|
200
|
+
def gsub(pat, rep)
|
|
201
|
+
inject(FileList.new) { |res, fn| res << fn.gsub(pat,rep) }
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
# Same as +sub+ except that the oringal file list is modified.
|
|
205
|
+
def sub!(pat, rep)
|
|
206
|
+
each_with_index { |fn, i| self[i] = fn.sub(pat,rep) }
|
|
207
|
+
self
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
# Same as +gsub+ except that the original file list is modified.
|
|
211
|
+
def gsub!(pat, rep)
|
|
212
|
+
each_with_index { |fn, i| self[i] = fn.gsub(pat,rep) }
|
|
213
|
+
self
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
# Convert a FileList to a string by joining all elements with a space.
|
|
217
|
+
def to_s
|
|
218
|
+
resolve
|
|
219
|
+
self.join(' ')
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
# Convert a FileList to a string prior to resolving.
|
|
223
|
+
def to_str
|
|
224
|
+
self.join(' ')
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
# Add matching glob patterns.
|
|
228
|
+
def add_matching(pattern)
|
|
229
|
+
Dir[pattern].each do |fn|
|
|
230
|
+
self << fn unless exclude?(fn)
|
|
231
|
+
end
|
|
232
|
+
end
|
|
233
|
+
private :add_matching
|
|
234
|
+
|
|
235
|
+
# Should the given file name be excluded?
|
|
236
|
+
def exclude?(fn)
|
|
237
|
+
calculate_exclude_regexp unless @exclude_re
|
|
238
|
+
fn =~ @exclude_re
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
DEFAULT_IGNORE_PATTERNS = [
|
|
242
|
+
/(^|[\/\\])CVS([\/\\]|$)/,
|
|
243
|
+
/\.bak$/,
|
|
244
|
+
/~$/,
|
|
245
|
+
/(^|[\/\\])core$/
|
|
246
|
+
]
|
|
247
|
+
@exclude_patterns = DEFAULT_IGNORE_PATTERNS.dup
|
|
248
|
+
|
|
249
|
+
class << self
|
|
250
|
+
# Create a new file list including the files listed. Similar to:
|
|
251
|
+
#
|
|
252
|
+
# FileList.new(*args)
|
|
253
|
+
def [](*args)
|
|
254
|
+
new(*args)
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
# Set the ignore patterns back to the default value. The
|
|
258
|
+
# default patterns will ignore files
|
|
259
|
+
# * containing "CVS" in the file path
|
|
260
|
+
# * ending with ".bak"
|
|
261
|
+
# * ending with "~"
|
|
262
|
+
# * named "core"
|
|
263
|
+
#
|
|
264
|
+
# Note that file names beginning with "." are automatically
|
|
265
|
+
# ignored by Ruby's glob patterns and are not specifically
|
|
266
|
+
# listed in the ignore patterns.
|
|
267
|
+
def select_default_ignore_patterns
|
|
268
|
+
@exclude_patterns = DEFAULT_IGNORE_PATTERNS.dup
|
|
269
|
+
end
|
|
270
|
+
|
|
271
|
+
# Clear the ignore patterns.
|
|
272
|
+
def clear_ignore_patterns
|
|
273
|
+
@exclude_patterns = [ /^$/ ]
|
|
274
|
+
end
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
end # class FileList
|