genie 0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/genie-0.1.gem +0 -0
- data/genie-0.1/docs/classes/BasicCommand.html +249 -0
- data/genie-0.1/docs/classes/BasicCommand.src/M000070.html +18 -0
- data/genie-0.1/docs/classes/BasicCommand.src/M000071.html +18 -0
- data/genie-0.1/docs/classes/BasicCommand.src/M000072.html +18 -0
- data/genie-0.1/docs/classes/BasicCommand.src/M000073.html +18 -0
- data/genie-0.1/docs/classes/BasicCommand.src/M000074.html +16 -0
- data/genie-0.1/docs/classes/Command.html +277 -0
- data/genie-0.1/docs/classes/Command.src/M000052.html +20 -0
- data/genie-0.1/docs/classes/Command.src/M000053.html +18 -0
- data/genie-0.1/docs/classes/Command.src/M000054.html +20 -0
- data/genie-0.1/docs/classes/Command.src/M000055.html +20 -0
- data/genie-0.1/docs/classes/Command.src/M000056.html +18 -0
- data/genie-0.1/docs/classes/Command.src/M000057.html +18 -0
- data/genie-0.1/docs/classes/Command.src/M000058.html +23 -0
- data/genie-0.1/docs/classes/CommandMetainfo.html +362 -0
- data/genie-0.1/docs/classes/CommandMetainfo.src/M000042.html +18 -0
- data/genie-0.1/docs/classes/CommandMetainfo.src/M000043.html +18 -0
- data/genie-0.1/docs/classes/CommandMetainfo.src/M000044.html +19 -0
- data/genie-0.1/docs/classes/CommandMetainfo.src/M000045.html +25 -0
- data/genie-0.1/docs/classes/CommandMetainfo.src/M000046.html +21 -0
- data/genie-0.1/docs/classes/CommandMetainfo.src/M000047.html +21 -0
- data/genie-0.1/docs/classes/CompoundResult.html +359 -0
- data/genie-0.1/docs/classes/CompoundResult.src/M000075.html +18 -0
- data/genie-0.1/docs/classes/CompoundResult.src/M000076.html +18 -0
- data/genie-0.1/docs/classes/CompoundResult.src/M000078.html +18 -0
- data/genie-0.1/docs/classes/CompoundResult.src/M000079.html +18 -0
- data/genie-0.1/docs/classes/CompoundResult.src/M000080.html +18 -0
- data/genie-0.1/docs/classes/CompoundResult.src/M000082.html +18 -0
- data/genie-0.1/docs/classes/CompoundResult.src/M000084.html +20 -0
- data/genie-0.1/docs/classes/CompoundResult.src/M000085.html +18 -0
- data/genie-0.1/docs/classes/CompoundResult.src/M000086.html +18 -0
- data/genie-0.1/docs/classes/CompoundResult.src/M000087.html +20 -0
- data/genie-0.1/docs/classes/EntryProcessor.html +223 -0
- data/genie-0.1/docs/classes/EntryProcessor.src/M000008.html +18 -0
- data/genie-0.1/docs/classes/EntryProcessor.src/M000009.html +20 -0
- data/genie-0.1/docs/classes/EntryProcessor.src/M000010.html +18 -0
- data/genie-0.1/docs/classes/EntryProcessor.src/M000011.html +23 -0
- data/genie-0.1/docs/classes/Log4r.html +114 -0
- data/genie-0.1/docs/classes/Log4r/LogEvent.html +153 -0
- data/genie-0.1/docs/classes/Log4r/LogEvent.src/M000123.html +16 -0
- data/genie-0.1/docs/classes/NotifiedProcessor.html +155 -0
- data/genie-0.1/docs/classes/NotifiedProcessor.src/M000094.html +22 -0
- data/genie-0.1/docs/classes/NullTransactionController.html +191 -0
- data/genie-0.1/docs/classes/NullTransactionController.src/M000030.html +16 -0
- data/genie-0.1/docs/classes/NullTransactionController.src/M000031.html +16 -0
- data/genie-0.1/docs/classes/Object.html +154 -0
- data/genie-0.1/docs/classes/Object.src/M000103.html +16 -0
- data/genie-0.1/docs/classes/Periodic.html +564 -0
- data/genie-0.1/docs/classes/Periodic.src/M000124.html +26 -0
- data/genie-0.1/docs/classes/Periodic.src/M000125.html +21 -0
- data/genie-0.1/docs/classes/Periodic.src/M000126.html +18 -0
- data/genie-0.1/docs/classes/Periodic.src/M000127.html +18 -0
- data/genie-0.1/docs/classes/Periodic.src/M000128.html +31 -0
- data/genie-0.1/docs/classes/Periodic.src/M000129.html +30 -0
- data/genie-0.1/docs/classes/Periodic.src/M000130.html +18 -0
- data/genie-0.1/docs/classes/Periodic.src/M000131.html +18 -0
- data/genie-0.1/docs/classes/Periodic.src/M000132.html +16 -0
- data/genie-0.1/docs/classes/PollingProcessor.html +303 -0
- data/genie-0.1/docs/classes/PollingProcessor.src/M000088.html +23 -0
- data/genie-0.1/docs/classes/PollingProcessor.src/M000089.html +19 -0
- data/genie-0.1/docs/classes/PollingProcessor.src/M000091.html +22 -0
- data/genie-0.1/docs/classes/PollingProcessor.src/M000092.html +18 -0
- data/genie-0.1/docs/classes/PollingProcessor.src/M000093.html +18 -0
- data/genie-0.1/docs/classes/Queue.html +562 -0
- data/genie-0.1/docs/classes/Queue.src/M000104.html +22 -0
- data/genie-0.1/docs/classes/Queue.src/M000105.html +18 -0
- data/genie-0.1/docs/classes/Queue.src/M000106.html +18 -0
- data/genie-0.1/docs/classes/Queue.src/M000107.html +18 -0
- data/genie-0.1/docs/classes/Queue.src/M000108.html +21 -0
- data/genie-0.1/docs/classes/Queue.src/M000109.html +21 -0
- data/genie-0.1/docs/classes/Queue.src/M000110.html +22 -0
- data/genie-0.1/docs/classes/Queue.src/M000111.html +16 -0
- data/genie-0.1/docs/classes/Queue.src/M000112.html +18 -0
- data/genie-0.1/docs/classes/Queue.src/M000113.html +19 -0
- data/genie-0.1/docs/classes/Queue.src/M000114.html +23 -0
- data/genie-0.1/docs/classes/Queue.src/M000115.html +21 -0
- data/genie-0.1/docs/classes/Queue.src/M000116.html +19 -0
- data/genie-0.1/docs/classes/Queue.src/M000117.html +20 -0
- data/genie-0.1/docs/classes/Queue.src/M000118.html +25 -0
- data/genie-0.1/docs/classes/Queue.src/M000119.html +18 -0
- data/genie-0.1/docs/classes/Queue.src/M000120.html +22 -0
- data/genie-0.1/docs/classes/Queue.src/M000121.html +22 -0
- data/genie-0.1/docs/classes/Queue.src/M000122.html +20 -0
- data/genie-0.1/docs/classes/QueueDispatcher.html +247 -0
- data/genie-0.1/docs/classes/QueueDispatcher.src/M000048.html +18 -0
- data/genie-0.1/docs/classes/QueueDispatcher.src/M000049.html +21 -0
- data/genie-0.1/docs/classes/QueueDispatcher.src/M000050.html +18 -0
- data/genie-0.1/docs/classes/QueueDispatcher.src/M000051.html +32 -0
- data/genie-0.1/docs/classes/QueueEntry.html +522 -0
- data/genie-0.1/docs/classes/QueueEntry.src/M000012.html +21 -0
- data/genie-0.1/docs/classes/QueueEntry.src/M000013.html +18 -0
- data/genie-0.1/docs/classes/QueueEntry.src/M000014.html +18 -0
- data/genie-0.1/docs/classes/QueueEntry.src/M000015.html +18 -0
- data/genie-0.1/docs/classes/QueueEntry.src/M000017.html +16 -0
- data/genie-0.1/docs/classes/QueueEntry.src/M000018.html +19 -0
- data/genie-0.1/docs/classes/QueueEntry.src/M000020.html +19 -0
- data/genie-0.1/docs/classes/QueueEntry.src/M000022.html +19 -0
- data/genie-0.1/docs/classes/QueueEntry.src/M000023.html +21 -0
- data/genie-0.1/docs/classes/QueueEntry.src/M000024.html +19 -0
- data/genie-0.1/docs/classes/QueueEntry.src/M000025.html +18 -0
- data/genie-0.1/docs/classes/QueueEntry.src/M000026.html +18 -0
- data/genie-0.1/docs/classes/QueueEntry.src/M000028.html +18 -0
- data/genie-0.1/docs/classes/Result.html +289 -0
- data/genie-0.1/docs/classes/Result.src/M000063.html +20 -0
- data/genie-0.1/docs/classes/Result.src/M000064.html +18 -0
- data/genie-0.1/docs/classes/Result.src/M000066.html +18 -0
- data/genie-0.1/docs/classes/Result.src/M000068.html +18 -0
- data/genie-0.1/docs/classes/Result.src/M000069.html +19 -0
- data/genie-0.1/docs/classes/SemanticCommand.html +229 -0
- data/genie-0.1/docs/classes/SemanticCommand.src/M000059.html +19 -0
- data/genie-0.1/docs/classes/SemanticCommand.src/M000060.html +18 -0
- data/genie-0.1/docs/classes/SemanticCommand.src/M000061.html +18 -0
- data/genie-0.1/docs/classes/TransactionBundle.html +260 -0
- data/genie-0.1/docs/classes/TransactionBundle.src/M000001.html +18 -0
- data/genie-0.1/docs/classes/TransactionBundle.src/M000002.html +20 -0
- data/genie-0.1/docs/classes/TransactionBundle.src/M000003.html +20 -0
- data/genie-0.1/docs/classes/TransactionBundle.src/M000004.html +18 -0
- data/genie-0.1/docs/classes/TransactionBundle.src/M000005.html +18 -0
- data/genie-0.1/docs/classes/TransactionBundle.src/M000007.html +19 -0
- data/genie-0.1/docs/classes/UndoRedoCommand.html +308 -0
- data/genie-0.1/docs/classes/UndoRedoCommand.src/M000095.html +19 -0
- data/genie-0.1/docs/classes/UndoRedoCommand.src/M000096.html +16 -0
- data/genie-0.1/docs/classes/UndoRedoCommand.src/M000097.html +16 -0
- data/genie-0.1/docs/classes/UndoRedoCommand.src/M000098.html +16 -0
- data/genie-0.1/docs/classes/UndoRedoCommand.src/M000099.html +18 -0
- data/genie-0.1/docs/classes/UndoRedoCommand.src/M000101.html +18 -0
- data/genie-0.1/docs/classes/UndoRedoCommand.src/M000102.html +18 -0
- data/genie-0.1/docs/classes/UnitOfWork.html +322 -0
- data/genie-0.1/docs/classes/UnitOfWork.src/M000032.html +19 -0
- data/genie-0.1/docs/classes/UnitOfWork.src/M000033.html +18 -0
- data/genie-0.1/docs/classes/UnitOfWork.src/M000034.html +18 -0
- data/genie-0.1/docs/classes/UnitOfWork.src/M000035.html +18 -0
- data/genie-0.1/docs/classes/UnitOfWork.src/M000036.html +18 -0
- data/genie-0.1/docs/classes/UnitOfWork.src/M000037.html +18 -0
- data/genie-0.1/docs/classes/UnitOfWork.src/M000038.html +18 -0
- data/genie-0.1/docs/classes/UnitOfWork.src/M000039.html +18 -0
- data/genie-0.1/docs/classes/UnitOfWork.src/M000040.html +18 -0
- data/genie-0.1/docs/created.rid +1 -0
- data/genie-0.1/docs/dot/f_0.dot +14 -0
- data/genie-0.1/docs/dot/f_0.png +0 -0
- data/genie-0.1/docs/dot/f_1.dot +14 -0
- data/genie-0.1/docs/dot/f_1.png +0 -0
- data/genie-0.1/docs/dot/f_2.dot +14 -0
- data/genie-0.1/docs/dot/f_2.png +0 -0
- data/genie-0.1/docs/dot/f_3.dot +84 -0
- data/genie-0.1/docs/dot/f_3.png +0 -0
- data/genie-0.1/docs/dot/f_4.dot +14 -0
- data/genie-0.1/docs/dot/f_4.png +0 -0
- data/genie-0.1/docs/dot/f_5.dot +78 -0
- data/genie-0.1/docs/dot/f_5.png +0 -0
- data/genie-0.1/docs/dot/f_6.dot +50 -0
- data/genie-0.1/docs/dot/f_6.png +0 -0
- data/genie-0.1/docs/dot/f_7.dot +57 -0
- data/genie-0.1/docs/dot/f_7.png +0 -0
- data/genie-0.1/docs/dot/m_5_0.dot +30 -0
- data/genie-0.1/docs/dot/m_5_0.png +0 -0
- data/genie-0.1/docs/dot/m_7_0.dot +39 -0
- data/genie-0.1/docs/dot/m_7_0.png +0 -0
- data/genie-0.1/docs/files/License_txt.html +161 -0
- data/genie-0.1/docs/files/ReadMe_Amber_txt.html +491 -0
- data/genie-0.1/docs/files/ReadMe_txt.html +444 -0
- data/genie-0.1/docs/files/nist/genie/commands_rb.html +121 -0
- data/genie-0.1/docs/files/nist/genie/genie_rb.html +116 -0
- data/genie-0.1/docs/files/nist/genie/processors_rb.html +111 -0
- data/genie-0.1/docs/files/nist/genie/queues_rb.html +118 -0
- data/genie-0.1/docs/files/nist/genie/results_rb.html +117 -0
- data/genie-0.1/docs/fr_class_index.html +46 -0
- data/genie-0.1/docs/fr_file_index.html +34 -0
- data/genie-0.1/docs/fr_method_index.html +160 -0
- data/genie-0.1/docs/images/overview.jpg +0 -0
- data/genie-0.1/docs/index.html +24 -0
- data/genie-0.1/docs/rdoc-style.css +208 -0
- data/genie-0.1/lib/nist/genie/commands.rb +413 -0
- data/genie-0.1/lib/nist/genie/genie.rb +4 -0
- data/genie-0.1/lib/nist/genie/processors.rb +382 -0
- data/genie-0.1/lib/nist/genie/queues.rb +435 -0
- data/genie-0.1/lib/nist/genie/results.rb +113 -0
- data/genie-0.1/tests/helpers.rb +45 -0
- data/genie-0.1/tests/test_commands.rb +338 -0
- data/genie-0.1/tests/test_processors.rb +17 -0
- data/genie-0.1/tests/test_queues.rb +288 -0
- data/genie-0.1/tests/test_results.rb +37 -0
- data/trimurti-0.1.gem +0 -0
- data/trimurti-0.1/docs/classes/Array.html +176 -0
- data/trimurti-0.1/docs/classes/Array.src/M000005.html +19 -0
- data/trimurti-0.1/docs/classes/Array.src/M000006.html +19 -0
- data/trimurti-0.1/docs/classes/Asserter.html +136 -0
- data/trimurti-0.1/docs/classes/Brahma.html +360 -0
- data/trimurti-0.1/docs/classes/Brahma.src/M000029.html +21 -0
- data/trimurti-0.1/docs/classes/Brahma.src/M000030.html +20 -0
- data/trimurti-0.1/docs/classes/Brahma.src/M000031.html +36 -0
- data/trimurti-0.1/docs/classes/Brahma.src/M000032.html +18 -0
- data/trimurti-0.1/docs/classes/Brahma.src/M000033.html +20 -0
- data/trimurti-0.1/docs/classes/Brahma.src/M000034.html +21 -0
- data/trimurti-0.1/docs/classes/Brahma.src/M000035.html +25 -0
- data/trimurti-0.1/docs/classes/Brahma.src/M000036.html +22 -0
- data/trimurti-0.1/docs/classes/Brahma.src/M000037.html +22 -0
- data/trimurti-0.1/docs/classes/ComponentSpec.html +275 -0
- data/trimurti-0.1/docs/classes/ComponentSpec.src/M000001.html +21 -0
- data/trimurti-0.1/docs/classes/ComponentSpec.src/M000002.html +18 -0
- data/trimurti-0.1/docs/classes/DRb.html +165 -0
- data/trimurti-0.1/docs/classes/DRb.src/M000062.html +18 -0
- data/trimurti-0.1/docs/classes/DRb.src/M000063.html +18 -0
- data/trimurti-0.1/docs/classes/GUID.html +129 -0
- data/trimurti-0.1/docs/classes/Linda.html +444 -0
- data/trimurti-0.1/docs/classes/Linda.src/M000007.html +16 -0
- data/trimurti-0.1/docs/classes/Linda.src/M000008.html +16 -0
- data/trimurti-0.1/docs/classes/Linda.src/M000009.html +20 -0
- data/trimurti-0.1/docs/classes/Linda.src/M000010.html +16 -0
- data/trimurti-0.1/docs/classes/Linda.src/M000011.html +18 -0
- data/trimurti-0.1/docs/classes/Linda.src/M000012.html +21 -0
- data/trimurti-0.1/docs/classes/Linda.src/M000013.html +18 -0
- data/trimurti-0.1/docs/classes/Linda.src/M000014.html +18 -0
- data/trimurti-0.1/docs/classes/Linda.src/M000015.html +18 -0
- data/trimurti-0.1/docs/classes/Linda.src/M000016.html +18 -0
- data/trimurti-0.1/docs/classes/Linda.src/M000017.html +20 -0
- data/trimurti-0.1/docs/classes/Linda.src/M000018.html +20 -0
- data/trimurti-0.1/docs/classes/Object.html +153 -0
- data/trimurti-0.1/docs/classes/Object.src/M000021.html +18 -0
- data/trimurti-0.1/docs/classes/Plugins.html +174 -0
- data/trimurti-0.1/docs/classes/Plugins.src/M000024.html +32 -0
- data/trimurti-0.1/docs/classes/Plugins.src/M000025.html +32 -0
- data/trimurti-0.1/docs/classes/Plugins/Spec.html +267 -0
- data/trimurti-0.1/docs/classes/Plugins/Spec.src/M000026.html +22 -0
- data/trimurti-0.1/docs/classes/Plugins/Spec.src/M000027.html +18 -0
- data/trimurti-0.1/docs/classes/Plugins/Spec.src/M000028.html +20 -0
- data/trimurti-0.1/docs/classes/QBE_ID.html +147 -0
- data/trimurti-0.1/docs/classes/QBE_ID.src/M000059.html +18 -0
- data/trimurti-0.1/docs/classes/QueryByExample.html +270 -0
- data/trimurti-0.1/docs/classes/QueryByExample.src/M000054.html +17 -0
- data/trimurti-0.1/docs/classes/QueryByExample.src/M000055.html +17 -0
- data/trimurti-0.1/docs/classes/QueryByExample.src/M000056.html +17 -0
- data/trimurti-0.1/docs/classes/QueryByExample.src/M000057.html +17 -0
- data/trimurti-0.1/docs/classes/QueryByExample.src/M000058.html +17 -0
- data/trimurti-0.1/docs/classes/Shiva.html +159 -0
- data/trimurti-0.1/docs/classes/Shiva.src/M000060.html +18 -0
- data/trimurti-0.1/docs/classes/Shiva.src/M000061.html +19 -0
- data/trimurti-0.1/docs/classes/String.html +176 -0
- data/trimurti-0.1/docs/classes/String.src/M000022.html +16 -0
- data/trimurti-0.1/docs/classes/String.src/M000023.html +16 -0
- data/trimurti-0.1/docs/classes/Symbol.html +176 -0
- data/trimurti-0.1/docs/classes/Symbol.src/M000003.html +16 -0
- data/trimurti-0.1/docs/classes/Symbol.src/M000004.html +16 -0
- data/trimurti-0.1/docs/classes/Trimurti.html +189 -0
- data/trimurti-0.1/docs/classes/Trimurti.src/M000019.html +16 -0
- data/trimurti-0.1/docs/classes/Trimurti.src/M000020.html +16 -0
- data/trimurti-0.1/docs/classes/Vishnu.html +563 -0
- data/trimurti-0.1/docs/classes/Vishnu.src/M000038.html +18 -0
- data/trimurti-0.1/docs/classes/Vishnu.src/M000039.html +18 -0
- data/trimurti-0.1/docs/classes/Vishnu.src/M000040.html +18 -0
- data/trimurti-0.1/docs/classes/Vishnu.src/M000041.html +22 -0
- data/trimurti-0.1/docs/classes/Vishnu.src/M000042.html +23 -0
- data/trimurti-0.1/docs/classes/Vishnu.src/M000043.html +24 -0
- data/trimurti-0.1/docs/classes/Vishnu.src/M000044.html +24 -0
- data/trimurti-0.1/docs/classes/Vishnu.src/M000045.html +18 -0
- data/trimurti-0.1/docs/classes/Vishnu.src/M000046.html +22 -0
- data/trimurti-0.1/docs/classes/Vishnu.src/M000047.html +20 -0
- data/trimurti-0.1/docs/classes/Vishnu.src/M000048.html +18 -0
- data/trimurti-0.1/docs/classes/Vishnu.src/M000049.html +22 -0
- data/trimurti-0.1/docs/classes/Vishnu.src/M000050.html +20 -0
- data/trimurti-0.1/docs/classes/Vishnu.src/M000051.html +19 -0
- data/trimurti-0.1/docs/classes/Vishnu.src/M000052.html +30 -0
- data/trimurti-0.1/docs/classes/Vishnu.src/M000053.html +21 -0
- data/trimurti-0.1/docs/created.rid +1 -0
- data/trimurti-0.1/docs/dot/f_0.dot +14 -0
- data/trimurti-0.1/docs/dot/f_0.png +0 -0
- data/trimurti-0.1/docs/dot/f_1.dot +14 -0
- data/trimurti-0.1/docs/dot/f_1.png +0 -0
- data/trimurti-0.1/docs/dot/f_2.dot +14 -0
- data/trimurti-0.1/docs/dot/f_2.png +0 -0
- data/trimurti-0.1/docs/dot/f_3.dot +39 -0
- data/trimurti-0.1/docs/dot/f_3.png +0 -0
- data/trimurti-0.1/docs/dot/f_4.dot +39 -0
- data/trimurti-0.1/docs/dot/f_4.png +0 -0
- data/trimurti-0.1/docs/dot/f_5.dot +69 -0
- data/trimurti-0.1/docs/dot/f_5.png +0 -0
- data/trimurti-0.1/docs/dot/f_6.dot +149 -0
- data/trimurti-0.1/docs/dot/f_6.png +0 -0
- data/trimurti-0.1/docs/dot/m_3_0.dot +30 -0
- data/trimurti-0.1/docs/dot/m_3_0.png +0 -0
- data/trimurti-0.1/docs/dot/m_4_0.dot +39 -0
- data/trimurti-0.1/docs/dot/m_4_0.png +0 -0
- data/trimurti-0.1/docs/dot/m_5_0.dot +40 -0
- data/trimurti-0.1/docs/dot/m_5_0.png +0 -0
- data/trimurti-0.1/docs/dot/m_5_1.dot +30 -0
- data/trimurti-0.1/docs/dot/m_5_1.png +0 -0
- data/trimurti-0.1/docs/dot/m_6_0.dot +40 -0
- data/trimurti-0.1/docs/dot/m_6_0.png +0 -0
- data/trimurti-0.1/docs/dot/m_6_1.dot +30 -0
- data/trimurti-0.1/docs/dot/m_6_1.png +0 -0
- data/trimurti-0.1/docs/dot/m_6_2.dot +30 -0
- data/trimurti-0.1/docs/dot/m_6_2.png +0 -0
- data/trimurti-0.1/docs/files/License_txt.html +132 -0
- data/trimurti-0.1/docs/files/ReadMe_Amber_txt.html +491 -0
- data/trimurti-0.1/docs/files/ReadMe_txt.html +694 -0
- data/trimurti-0.1/docs/files/nist/trimurti/linda_rb.html +129 -0
- data/trimurti-0.1/docs/files/nist/trimurti/plugins_rb.html +129 -0
- data/trimurti-0.1/docs/files/nist/trimurti/queryByExample_rb.html +128 -0
- data/trimurti-0.1/docs/files/nist/trimurti/trimurti_rb.html +151 -0
- data/trimurti-0.1/docs/fr_class_index.html +43 -0
- data/trimurti-0.1/docs/fr_file_index.html +33 -0
- data/trimurti-0.1/docs/fr_method_index.html +89 -0
- data/trimurti-0.1/docs/images/overview.jpg +0 -0
- data/trimurti-0.1/docs/index.html +24 -0
- data/trimurti-0.1/docs/rdoc-style.css +208 -0
- data/trimurti-0.1/lib/nist/trimurti/linda.rb +163 -0
- data/trimurti-0.1/lib/nist/trimurti/plugins.rb +107 -0
- data/trimurti-0.1/lib/nist/trimurti/queryByExample.rb +81 -0
- data/trimurti-0.1/lib/nist/trimurti/trimurti.rb +433 -0
- data/trimurti-0.1/tests/test_linda.rb +111 -0
- data/trimurti-0.1/tests/test_trimurti.rb +247 -0
- metadata +467 -0
@@ -0,0 +1,435 @@
|
|
1
|
+
|
2
|
+
require 'nist/common/rubyToolsDay'
|
3
|
+
require 'nist/common/singletonReflection'
|
4
|
+
|
5
|
+
class QueueDispatcher
|
6
|
+
|
7
|
+
# An array of queues
|
8
|
+
attr_accessor :child_queues
|
9
|
+
|
10
|
+
# A two-argument Proc that determines which queue(s) should
|
11
|
+
# be sent #enqueue and #do messages. The arguments are:
|
12
|
+
# * The queue under evaluation
|
13
|
+
# * The Command to be distributed
|
14
|
+
# The result is treated as a Boolean.
|
15
|
+
# When the selection_proc is nil (as it is by default)
|
16
|
+
# all child_queues are selected.
|
17
|
+
attr_accessor :selection_proc
|
18
|
+
|
19
|
+
def initialize(*child_queues)
|
20
|
+
self.child_queues = child_queues
|
21
|
+
end
|
22
|
+
|
23
|
+
# Returns an Array of queues that the argument (a command)
|
24
|
+
# should be distributed to.
|
25
|
+
def select_queues(cmnd)
|
26
|
+
return child_queues unless selection_proc
|
27
|
+
child_queues.select {|queue|
|
28
|
+
selection_proc.call(queue, cmnd)
|
29
|
+
}
|
30
|
+
end
|
31
|
+
|
32
|
+
# Ask each of the child_queues selected by selection_proc
|
33
|
+
# to enqueue the argument. Unlike Queue#enquue (which returns
|
34
|
+
# a QueueEntry), this returns an Array of QueueEntries.
|
35
|
+
def enqueue(cmnd)
|
36
|
+
select_queues(cmnd).collect {|queue| queue.enqueue(cmmnd) }
|
37
|
+
end
|
38
|
+
|
39
|
+
# Ask each of the child_queues selected by selection_proc
|
40
|
+
# to enqueue the argument.
|
41
|
+
def do(cmnd)
|
42
|
+
selected = select_queues(cmnd)
|
43
|
+
# Avoid the assembly of a composite result if only one queue is selected
|
44
|
+
return selected[0].do(cmnd) if selected.size == 1
|
45
|
+
# Since #do sleeps until the command has been processed, we need to
|
46
|
+
# spawn a thread for each queue. If we did not do that, the #do would
|
47
|
+
# be issued sequentially.
|
48
|
+
answer = Result.new
|
49
|
+
threads = Array.new
|
50
|
+
selected.each {|queue|
|
51
|
+
threads << Thread.new(answer) {|result| result.add(true, queue.do(cmnd)) }
|
52
|
+
}
|
53
|
+
# Wait for all threads to finish
|
54
|
+
threads.each {|thread| thread.join }
|
55
|
+
# Finally done!
|
56
|
+
answer
|
57
|
+
end
|
58
|
+
|
59
|
+
end # QueueDispatcher
|
60
|
+
|
61
|
+
# ======================================
|
62
|
+
|
63
|
+
class Queue
|
64
|
+
|
65
|
+
# If strict_bundle_handling is true, all the commands in
|
66
|
+
# a TransactionBundle must be redone if any command fails.
|
67
|
+
# Otherwise, the commands that failed are asked if they
|
68
|
+
# may_have_side_effects: if any of the failures might have
|
69
|
+
# side effects, the entire TransactionBundle must be redone.
|
70
|
+
# If, however, all the failed commands respond that they can
|
71
|
+
# not contain side effects, only the failures are redone.
|
72
|
+
# strict_bundle_handling is cautious, but not necessary
|
73
|
+
# (provided the side effect query is accuate): after all,
|
74
|
+
# the bundle is not a UnitOfWork.
|
75
|
+
attr_accessor :strict_bundle_handling
|
76
|
+
|
77
|
+
# An Array of available QueueEntries.
|
78
|
+
# The oldest entries have the lowest indices.
|
79
|
+
attr_accessor :available
|
80
|
+
|
81
|
+
# QueueEntries that are currently being processed.
|
82
|
+
attr_accessor :claimed
|
83
|
+
|
84
|
+
# QueueEntries that have been fully processed (not necessarily
|
85
|
+
# successfully).
|
86
|
+
attr_accessor :history
|
87
|
+
|
88
|
+
# An Array of objcts that respond to
|
89
|
+
# command_added(aCommand, aQue)
|
90
|
+
# This method returns a Boolean, true if the
|
91
|
+
# reciever wishes to handle the command.
|
92
|
+
# When a command is enqueued, watchers are
|
93
|
+
# notified until either one of the watchers
|
94
|
+
# accepts the command, or all of the watchers
|
95
|
+
# have been informed of the command.
|
96
|
+
# The order of watchers in this array changes
|
97
|
+
# with every send of notify_watchers. This
|
98
|
+
# rotation distributes the load among watchers.
|
99
|
+
attr_accessor :watchers
|
100
|
+
|
101
|
+
def initialize
|
102
|
+
self.strict_bundle_handling=true
|
103
|
+
self.available=Array.new
|
104
|
+
self.claimed=Array.new
|
105
|
+
self.history=Array.new
|
106
|
+
self.watchers=Array.new
|
107
|
+
end
|
108
|
+
|
109
|
+
def add_processor(processor)
|
110
|
+
processor.queue = self
|
111
|
+
end
|
112
|
+
|
113
|
+
# Register a watcher to recieve entry_added messages.
|
114
|
+
def add_watcher(watcher)
|
115
|
+
watchers << watcher
|
116
|
+
end
|
117
|
+
|
118
|
+
# Deregister a watcher, so that it no longer
|
119
|
+
# recieves entry_added messages.
|
120
|
+
# Returns the removed watcher (nil if it was not present)
|
121
|
+
def remove_watcher(watcher)
|
122
|
+
watchers.delete(watcher)
|
123
|
+
end
|
124
|
+
|
125
|
+
# Add to the receiver a command which will be executed
|
126
|
+
# asynchronously.
|
127
|
+
def enqueue(cmnd)
|
128
|
+
entry = cmnd.to_entry
|
129
|
+
available << entry
|
130
|
+
Thread.new(entry) { |e| notify_watchers(e) }
|
131
|
+
entry
|
132
|
+
end
|
133
|
+
|
134
|
+
def do(cmnd)
|
135
|
+
entry = enqueue(cmnd)
|
136
|
+
entry.thread = Thread.current
|
137
|
+
Thread.stop
|
138
|
+
entry.result
|
139
|
+
end
|
140
|
+
|
141
|
+
def notify_watchers(queueEntry)
|
142
|
+
watchers.size.times {
|
143
|
+
w = watchers.shift
|
144
|
+
watchers.push(w)
|
145
|
+
return if w.entry_added(queueEntry)
|
146
|
+
}
|
147
|
+
end
|
148
|
+
|
149
|
+
# Number of entries available for execution.
|
150
|
+
def num_available; available.size; end
|
151
|
+
|
152
|
+
# Total estimated time of all entries available for execution
|
153
|
+
def estimated_seconds
|
154
|
+
available.inject(0.0) {|sum, entry| sum + entry.estimated_seconds }
|
155
|
+
end
|
156
|
+
|
157
|
+
# Returns the age of the oldest QueueEntry.
|
158
|
+
# Returns 0.0 if none are available
|
159
|
+
def age_oldest_available
|
160
|
+
return 0.0 if available.empty?
|
161
|
+
available[0].age
|
162
|
+
end
|
163
|
+
|
164
|
+
# Acts like claim_one if num is less than two.
|
165
|
+
# Otherwise builds a TransactionBundle from
|
166
|
+
# the specified number of QueueEntries (or num_available
|
167
|
+
# if that is smaller). Adds the TransactionBundle
|
168
|
+
# to claimed, and returns the TransactionBundle.
|
169
|
+
def claim_num(num)
|
170
|
+
return claim_one if num<2
|
171
|
+
# Ruby actually uses num.min(available.size)
|
172
|
+
kids = available.slice!(0, num)
|
173
|
+
answer = TransactionBundle.new(kids)
|
174
|
+
claimed << answer
|
175
|
+
answer
|
176
|
+
end
|
177
|
+
|
178
|
+
# Remove the oldest QueueEntrhy from available.
|
179
|
+
# Add this oldest entry to claimed.
|
180
|
+
# Return the entry.
|
181
|
+
def claim_one
|
182
|
+
return nil if available.empty?
|
183
|
+
answer = available.shift
|
184
|
+
claimed << answer
|
185
|
+
answer
|
186
|
+
end
|
187
|
+
|
188
|
+
# Returns a QueueEntry or TransactionBundle
|
189
|
+
# that should approach as closely
|
190
|
+
# as possible the requested execution time
|
191
|
+
# (limited to the specified number of entries).
|
192
|
+
# maxNum can be nil if an upper limit on the
|
193
|
+
# number of commands is not desired.
|
194
|
+
def claim_seconds(sec, maxNum=nil)
|
195
|
+
num = num_for_estimated_seconds(sec, maxNum)
|
196
|
+
claim_num(num)
|
197
|
+
end
|
198
|
+
|
199
|
+
# Transfer the specified entry from available
|
200
|
+
# to claimed, and return the entry (nil if
|
201
|
+
# the entry is not present).
|
202
|
+
def claim_entry(entry)
|
203
|
+
answer = available.delete(entry)
|
204
|
+
claimed << answer if answer
|
205
|
+
answer
|
206
|
+
end
|
207
|
+
|
208
|
+
# Computes how many of the oldest available commands
|
209
|
+
# are necessary to approach (but not exceed) an estimated
|
210
|
+
# execution time of sec seconds. An upper limit can be
|
211
|
+
# specified: use nil if the upper limit is not desired.
|
212
|
+
def num_for_estimated_seconds(sec, maxNum=nil)
|
213
|
+
answer = 0
|
214
|
+
time = 0.0
|
215
|
+
available.each {|entry|
|
216
|
+
time+=entry.estimated_seconds
|
217
|
+
return answer if time > sec || (maxNum && answer>=maxNum)
|
218
|
+
answer+=1
|
219
|
+
}
|
220
|
+
answer
|
221
|
+
end
|
222
|
+
|
223
|
+
# Remove the argument from the claimed collection
|
224
|
+
def _relinquish(entry)
|
225
|
+
claimed.delete(entry)
|
226
|
+
end
|
227
|
+
|
228
|
+
# Return the entries to the beginning of the #available
|
229
|
+
# collection. The arguments are intended
|
230
|
+
# to be QueueEntries, not TransactionBundles
|
231
|
+
# (which are decomposed by #partition inside #processed).
|
232
|
+
def _reschedule(*entries)
|
233
|
+
entries.reverse.each {|entry|
|
234
|
+
available.unshift(entry)
|
235
|
+
_relinquish(entry)
|
236
|
+
}
|
237
|
+
entries
|
238
|
+
end
|
239
|
+
|
240
|
+
|
241
|
+
# The entries have either completed successfully,
|
242
|
+
# or we've given up on them. Either way, add them
|
243
|
+
# to the history. The arguments are intended
|
244
|
+
# to be QueueEntries, not TransactionBundles
|
245
|
+
# (which are decomposed by #partition inside #processed).
|
246
|
+
def _finish(*entries)
|
247
|
+
entries.each {|entry|
|
248
|
+
entry.finish
|
249
|
+
history << entry
|
250
|
+
_relinquish(entry)
|
251
|
+
}
|
252
|
+
end
|
253
|
+
|
254
|
+
# The entry has been processed (not necessarily to completion).
|
255
|
+
# Remove the receiver from #claimed, and add the entry or its children
|
256
|
+
# to either #history or #available.
|
257
|
+
# Return an (ideally empty) Array of those entries that have been
|
258
|
+
# rescheduled.
|
259
|
+
def processed(entry)
|
260
|
+
not_done, done = entry.partition(strict_bundle_handling)
|
261
|
+
_finish(*done)
|
262
|
+
_reschedule( *not_done )
|
263
|
+
end
|
264
|
+
|
265
|
+
end # Queue
|
266
|
+
|
267
|
+
|
268
|
+
# #############################################################
|
269
|
+
|
270
|
+
# Represents an entry in a queue
|
271
|
+
class QueueEntry
|
272
|
+
|
273
|
+
# The command executed by the entry.
|
274
|
+
attr_accessor :command
|
275
|
+
|
276
|
+
# An instance of Time representing the
|
277
|
+
# moment when the entry was added to the queue
|
278
|
+
attr_accessor :when_added
|
279
|
+
|
280
|
+
# An instance of Time representing the
|
281
|
+
# moment when processor finished working with the entry.
|
282
|
+
attr_accessor :when_finished
|
283
|
+
|
284
|
+
# The Thread that will be awakended once the
|
285
|
+
# entry has been fully processed.
|
286
|
+
# Nil if the entry was directly added by #enque.
|
287
|
+
# Not nil if the entry was added by #do.
|
288
|
+
attr_accessor :thread
|
289
|
+
|
290
|
+
# An Integer, originally zero, specifying how many times the
|
291
|
+
# command has been attempted.
|
292
|
+
attr_accessor :num_attempts
|
293
|
+
|
294
|
+
# An array of Results
|
295
|
+
attr_accessor :results
|
296
|
+
|
297
|
+
# A Symbol that specifies the state of the entry.
|
298
|
+
# This is currently not used: it can be used
|
299
|
+
# by other components.
|
300
|
+
attr_accessor :status
|
301
|
+
|
302
|
+
def initialize(command)
|
303
|
+
self.command=command
|
304
|
+
self.num_attempts=0
|
305
|
+
self.when_added=Time.now
|
306
|
+
self.results=Array.new
|
307
|
+
end
|
308
|
+
|
309
|
+
# Returns the time in seconds since
|
310
|
+
# the creation of the entry.
|
311
|
+
def age
|
312
|
+
Time.now - when_added
|
313
|
+
end
|
314
|
+
|
315
|
+
forward(:command, nil, :may_update, :may_have_side_effects, :estimated_seconds, :description)
|
316
|
+
|
317
|
+
# Retruns an Integer, the number of times
|
318
|
+
# the system can currently attempt the command
|
319
|
+
def remaining_attempts
|
320
|
+
command.max_attempts - num_attempts
|
321
|
+
end
|
322
|
+
|
323
|
+
# Returns a Boolean, true if the system has
|
324
|
+
# not exhausted its maximum number of attempts.
|
325
|
+
def remaining_attempts?
|
326
|
+
remaining_attempts > 0
|
327
|
+
end
|
328
|
+
alias has_remaining_attempts remaining_attempts?
|
329
|
+
|
330
|
+
|
331
|
+
# Return the most recent result. Returns nil if
|
332
|
+
# the command has not yet been attempted.
|
333
|
+
def result; results[-1]; end
|
334
|
+
|
335
|
+
# Returns a Boolean, true if the most recent Result
|
336
|
+
# has an error.
|
337
|
+
def error?
|
338
|
+
r = result
|
339
|
+
r && r.error?
|
340
|
+
end
|
341
|
+
alias has_error error?
|
342
|
+
|
343
|
+
# Returns a Boolean, true if the most recent Result
|
344
|
+
# has an error that might not occur if the command was
|
345
|
+
# attempted another time.
|
346
|
+
def retryable_error?
|
347
|
+
r = result
|
348
|
+
r && r.retryable_error?
|
349
|
+
end
|
350
|
+
alias has_retryable_error retryable_error?
|
351
|
+
|
352
|
+
# The queue is done with the entry.
|
353
|
+
# Wakes up the thread that submitted the entry to the queue
|
354
|
+
# (via #do). Should not be called until the que is done with
|
355
|
+
# the entry, and a result (sccessfull or not) is available.
|
356
|
+
def finish
|
357
|
+
self.when_finished = Time.now
|
358
|
+
thread.run if thread
|
359
|
+
end
|
360
|
+
|
361
|
+
# Ask the command to #do. Caches the Result.
|
362
|
+
def do
|
363
|
+
r = command.do
|
364
|
+
self.num_attempts+= 1
|
365
|
+
results << r
|
366
|
+
r
|
367
|
+
end
|
368
|
+
|
369
|
+
# returns an array composed of two arrays:
|
370
|
+
# entries that need to be rescheduled for another try
|
371
|
+
# entries that that are finished, and should not be tried again.
|
372
|
+
def partition(strict)
|
373
|
+
return [[self],[]] if retry?
|
374
|
+
[[],[self]]
|
375
|
+
end
|
376
|
+
|
377
|
+
def retry?
|
378
|
+
retryable_error? && remaining_attempts?
|
379
|
+
end
|
380
|
+
|
381
|
+
def undo?
|
382
|
+
command.undoable? && :undo!=command.type
|
383
|
+
end
|
384
|
+
alias can_undo undo?
|
385
|
+
|
386
|
+
def redo?
|
387
|
+
command.undoable? && :undo==command.type
|
388
|
+
end
|
389
|
+
alias can_redo redo?
|
390
|
+
|
391
|
+
end # QueueEntry
|
392
|
+
|
393
|
+
|
394
|
+
class TransactionBundle
|
395
|
+
|
396
|
+
attr_accessor :children
|
397
|
+
|
398
|
+
def initialize(children)
|
399
|
+
self.children=children
|
400
|
+
end
|
401
|
+
|
402
|
+
def do
|
403
|
+
answer = CompoundResult.new
|
404
|
+
children.each {|kid| answer.add(kid.do) }
|
405
|
+
answer
|
406
|
+
end
|
407
|
+
|
408
|
+
# returns an array composed of two arrays:
|
409
|
+
# entries that need to be rescheduled for another try
|
410
|
+
# entries that that are finished, and should not be tried again.
|
411
|
+
def partition(strict)
|
412
|
+
return children.partition {|kid| kid.retry? } if retry_individually(strict)
|
413
|
+
return [children,[]] if retry?
|
414
|
+
[[],children]
|
415
|
+
end
|
416
|
+
|
417
|
+
def may_update
|
418
|
+
children.any? {|kid| kid.may_update }
|
419
|
+
end
|
420
|
+
|
421
|
+
def retry?
|
422
|
+
children.any? {|kid| kid.retry? }
|
423
|
+
end
|
424
|
+
alias should_retry retry?
|
425
|
+
|
426
|
+
def retry_individually(strict)
|
427
|
+
return false if strict
|
428
|
+
! children.any? {|kid| kid.error? && kid.may_have_side_effects }
|
429
|
+
end
|
430
|
+
|
431
|
+
|
432
|
+
end # TransactionBundle
|
433
|
+
|
434
|
+
|
435
|
+
|
@@ -0,0 +1,113 @@
|
|
1
|
+
require 'nist/common/log'
|
2
|
+
|
3
|
+
class Log4r::LogEvent
|
4
|
+
# Applications that casn have recoverable errors
|
5
|
+
# need to define Log4r::LogEvent#retryable_error?
|
6
|
+
# This framework does not currently define what is
|
7
|
+
# retryable, so we define here a retryable_error?
|
8
|
+
# that always returns false.
|
9
|
+
def retryable_error?; false; end
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
# Represents the result of an attempt to execute a command
|
14
|
+
class Result
|
15
|
+
|
16
|
+
# A resolvable referring to the result of the execution
|
17
|
+
attr_accessor :result
|
18
|
+
|
19
|
+
# An Array of Log4r::LogEvents (both fatal and non fatal)
|
20
|
+
# resulting from exection.
|
21
|
+
attr_accessor :notices
|
22
|
+
|
23
|
+
# A Float containing the wall clock time in seconds required to execute the command
|
24
|
+
attr_accessor :execution_seconds
|
25
|
+
|
26
|
+
# A hash of additional data not present in the command's args,
|
27
|
+
# but necessary to undo the operation.
|
28
|
+
attr_accessor :undo_data
|
29
|
+
|
30
|
+
def initialize(result=nil)
|
31
|
+
self.result=result
|
32
|
+
self.notices=Array.new
|
33
|
+
self.undo_data=Hash.new
|
34
|
+
end
|
35
|
+
|
36
|
+
def error?
|
37
|
+
notices.any? {|notice| notice.error? }
|
38
|
+
end
|
39
|
+
alias has_error error?
|
40
|
+
|
41
|
+
def retryable_error?
|
42
|
+
notices.any? {|notice| notice.retryable_error? }
|
43
|
+
end
|
44
|
+
alias has_retryable_error retryable_error?
|
45
|
+
|
46
|
+
def add_notices(anArray)
|
47
|
+
notices.concat(anArray)
|
48
|
+
end
|
49
|
+
|
50
|
+
def add_error(description, levelString='ERROR', trace=caller)
|
51
|
+
levelNum = Log4r.level_name_to_index(levelString)
|
52
|
+
notices << Log4r::LogEvent.new(levelNum, logger, trace, description)
|
53
|
+
end
|
54
|
+
|
55
|
+
end # Result
|
56
|
+
|
57
|
+
# #############################################################
|
58
|
+
|
59
|
+
class CompoundResult
|
60
|
+
|
61
|
+
attr_accessor :children
|
62
|
+
|
63
|
+
def initialize(*kids)
|
64
|
+
self.children=kids
|
65
|
+
end
|
66
|
+
|
67
|
+
def add(aResult)
|
68
|
+
children << aResult
|
69
|
+
end
|
70
|
+
alias << add
|
71
|
+
|
72
|
+
def size
|
73
|
+
children.size
|
74
|
+
end
|
75
|
+
|
76
|
+
def [](idx)
|
77
|
+
children[idx]
|
78
|
+
end
|
79
|
+
|
80
|
+
def error?
|
81
|
+
children.any? {|kid| kid.error? }
|
82
|
+
end
|
83
|
+
alias has_error error?
|
84
|
+
|
85
|
+
def retryable_error?
|
86
|
+
children.any? {|kid| kid.retryable_error? }
|
87
|
+
end
|
88
|
+
alias has_retryable_error retryable_error?
|
89
|
+
|
90
|
+
def notices
|
91
|
+
answer = Array.new
|
92
|
+
children.each {|kid| answer.concat(kid.notices) }
|
93
|
+
answer
|
94
|
+
end
|
95
|
+
|
96
|
+
# Returns an Array of child Result#result values.
|
97
|
+
def result
|
98
|
+
children.collect {|kid| kid.result }
|
99
|
+
end
|
100
|
+
|
101
|
+
# Returns the sum of the execution times, as seconds.
|
102
|
+
def execution_seconds
|
103
|
+
children.inject(0.0) {|sum, kid| sum + kid.execution_seconds }
|
104
|
+
end
|
105
|
+
|
106
|
+
# Returns the union of all the child result undo_data hashes.
|
107
|
+
def undo_data
|
108
|
+
answer = Hash.new
|
109
|
+
children.each {|kid| answer.merge!(kid.undo_data) }
|
110
|
+
answer
|
111
|
+
end
|
112
|
+
|
113
|
+
end # CompoundResult
|