genie 0.1
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/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
|