roby 0.8.0 → 3.0.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.
Files changed (644) hide show
  1. checksums.yaml +7 -0
  2. data/.deep-cover.rb +3 -0
  3. data/.gitattributes +1 -0
  4. data/.gitignore +24 -0
  5. data/.simplecov +10 -0
  6. data/.travis.yml +17 -0
  7. data/.yardopts +4 -0
  8. data/Gemfile +15 -0
  9. data/README.md +11 -0
  10. data/Rakefile +47 -177
  11. data/benchmark/{alloc_misc.rb → attic/alloc_misc.rb} +2 -2
  12. data/benchmark/{discovery_latency.rb → attic/discovery_latency.rb} +19 -19
  13. data/benchmark/{garbage_collection.rb → attic/garbage_collection.rb} +9 -9
  14. data/benchmark/{genom.rb → attic/genom.rb} +0 -0
  15. data/benchmark/attic/transactions.rb +62 -0
  16. data/benchmark/plan_basic_operations.rb +28 -0
  17. data/benchmark/relations/graph.rb +63 -0
  18. data/benchmark/ruby/identity.rb +18 -0
  19. data/benchmark/ruby/set_intersect_vs_hash_merge.rb +39 -0
  20. data/benchmark/ruby/yield_vs_block.rb +35 -0
  21. data/benchmark/run +5 -0
  22. data/benchmark/synthetic_plan_modifications_with_transactions.rb +79 -0
  23. data/benchmark/transactions.rb +99 -51
  24. data/bin/roby +38 -197
  25. data/bin/roby-display +14 -0
  26. data/bin/roby-log +3 -176
  27. data/doc/guide/{src → attic}/abstraction/achieve_with.page +1 -1
  28. data/doc/guide/{src → attic}/abstraction/forwarding.page +1 -1
  29. data/doc/guide/{src → attic}/abstraction/hierarchy.page +1 -1
  30. data/doc/guide/{src → attic}/abstraction/index.page +1 -1
  31. data/doc/guide/{src → attic}/abstraction/task_models.page +1 -1
  32. data/doc/guide/{overview.rdoc → attic/cycle/api_overview.rdoc} +6 -1
  33. data/doc/guide/{src → attic}/cycle/cycle-overview.png +0 -0
  34. data/doc/guide/{src → attic}/cycle/cycle-overview.svg +0 -0
  35. data/doc/guide/attic/cycle/error_handling.page +98 -0
  36. data/doc/guide/{src → attic}/cycle/error_instantaneous_repair.png +0 -0
  37. data/doc/guide/{src → attic}/cycle/error_instantaneous_repair.svg +0 -0
  38. data/doc/guide/{src/cycle/error_handling.page → attic/cycle/error_sources.page} +46 -89
  39. data/doc/guide/{src → attic}/cycle/garbage_collection.page +1 -1
  40. data/doc/guide/{src → attic}/cycle/index.page +1 -1
  41. data/doc/guide/{src → attic}/cycle/propagation.page +11 -1
  42. data/doc/guide/{src → attic}/cycle/propagation_diamond.png +0 -0
  43. data/doc/guide/{src → attic}/cycle/propagation_diamond.svg +0 -0
  44. data/doc/guide/attic/plans/building_plans.page +89 -0
  45. data/doc/guide/attic/plans/code.page +192 -0
  46. data/doc/guide/{src/basics → attic/plans}/events.page +3 -4
  47. data/doc/guide/attic/plans/index.page +7 -0
  48. data/doc/guide/{plan_modifications.rdoc → attic/plans/plan_modifications.rdoc} +5 -3
  49. data/doc/guide/{src/basics → attic/plans}/plan_objects.page +2 -1
  50. data/doc/guide/attic/plans/querying_plans.page +5 -0
  51. data/doc/guide/{src/basics → attic/plans}/tasks.page +20 -20
  52. data/doc/guide/config.yaml +7 -4
  53. data/doc/guide/ext/extended_menu.rb +29 -0
  54. data/doc/guide/ext/init.rb +6 -0
  55. data/doc/guide/ext/rdoc_links.rb +7 -6
  56. data/doc/guide/src/advanced_concepts/history.page +5 -0
  57. data/doc/guide/src/advanced_concepts/index.page +11 -0
  58. data/doc/guide/src/advanced_concepts/recognizing_patterns.page +83 -0
  59. data/doc/guide/src/advanced_concepts/scheduling.page +87 -0
  60. data/doc/guide/src/advanced_concepts/transactions.page +5 -0
  61. data/doc/guide/src/advanced_concepts/unreachability.page +42 -0
  62. data/doc/guide/src/base.template +96 -0
  63. data/doc/guide/src/basics_shell_header.txt +5 -7
  64. data/doc/guide/src/building/action_coordination.page +96 -0
  65. data/doc/guide/src/building/actions.page +124 -0
  66. data/doc/guide/src/building/file_layout.page +71 -0
  67. data/doc/guide/src/building/index.page +50 -0
  68. data/doc/guide/src/building/patterns.page +86 -0
  69. data/doc/guide/src/building/patterns_forwarding.png +0 -0
  70. data/doc/guide/src/building/patterns_forwarding.svg +277 -0
  71. data/doc/guide/src/building/runtime.page +95 -0
  72. data/doc/guide/src/building/task_models.page +94 -0
  73. data/doc/guide/src/building/tasks.page +284 -0
  74. data/doc/guide/src/concepts/error_handling.page +100 -0
  75. data/doc/guide/src/concepts/exception_propagation.png +0 -0
  76. data/doc/guide/src/concepts/exception_propagation.svg +445 -0
  77. data/doc/guide/src/concepts/execution.page +85 -0
  78. data/doc/guide/src/concepts/execution.png +0 -0
  79. data/doc/guide/src/concepts/execution.svg +573 -0
  80. data/doc/guide/src/concepts/execution_cycle.png +0 -0
  81. data/doc/guide/src/concepts/garbage_collection.page +57 -0
  82. data/doc/guide/src/concepts/index.page +27 -0
  83. data/doc/guide/src/concepts/plans.page +101 -0
  84. data/doc/guide/src/concepts/policy.page +31 -0
  85. data/doc/guide/src/concepts/reactor.page +61 -0
  86. data/doc/guide/src/concepts/simple_plan_example.png +0 -0
  87. data/doc/guide/src/concepts/simple_plan_example.svg +376 -0
  88. data/doc/guide/src/default.template +9 -74
  89. data/doc/guide/src/event_relations/forward.page +71 -0
  90. data/doc/guide/src/event_relations/index.page +12 -0
  91. data/doc/guide/src/event_relations/scheduling_constraints.page +43 -0
  92. data/doc/guide/src/event_relations/signal.page +55 -0
  93. data/doc/guide/src/event_relations/temporal_constraints.page +77 -0
  94. data/doc/guide/src/htmldoc.metainfo +21 -8
  95. data/doc/guide/src/index.page +8 -3
  96. data/doc/guide/src/{introduction/install.page → installation/index.page} +37 -25
  97. data/doc/guide/src/installation/publications.page +14 -0
  98. data/doc/guide/src/{introduction → installation}/videos.page +14 -7
  99. data/doc/guide/src/interacting/index.page +16 -0
  100. data/doc/guide/src/interacting/run.page +33 -0
  101. data/doc/guide/src/interacting/shell.page +95 -0
  102. data/doc/guide/src/plugins/creating_plugins.page +72 -0
  103. data/doc/guide/src/plugins/index.page +27 -5
  104. data/doc/guide/src/plugins/{fault_tolerance.page → standard_plugins/fault_tolerance.page} +2 -2
  105. data/doc/guide/src/plugins/standard_plugins/index.page +11 -0
  106. data/doc/guide/src/plugins/{subsystems.page → standard_plugins/subsystems.page} +2 -2
  107. data/doc/guide/src/style_screen.css +687 -0
  108. data/doc/guide/src/task_relations/dependency.page +107 -0
  109. data/doc/guide/src/task_relations/executed_by.page +77 -0
  110. data/doc/guide/src/task_relations/index.page +12 -0
  111. data/doc/guide/src/task_relations/new_relations.page +119 -0
  112. data/doc/guide/src/task_relations/planned_by.page +46 -0
  113. data/doc/guide/src/tutorial/app.page +117 -0
  114. data/doc/guide/src/{basics → tutorial}/code_examples.page +6 -5
  115. data/doc/guide/src/{basics → tutorial}/dry.page +15 -15
  116. data/doc/guide/src/{basics → tutorial}/errors.page +43 -68
  117. data/doc/guide/src/tutorial/events.page +195 -0
  118. data/doc/guide/src/{basics → tutorial}/hierarchy.page +53 -52
  119. data/doc/guide/src/tutorial/index.page +13 -0
  120. data/doc/guide/src/tutorial/log_replay/goForward_1.png +0 -0
  121. data/doc/guide/src/tutorial/log_replay/goForward_2.png +0 -0
  122. data/doc/guide/src/tutorial/log_replay/goForward_3.png +0 -0
  123. data/doc/guide/src/{basics → tutorial}/log_replay/goForward_4.png +0 -0
  124. data/doc/guide/src/tutorial/log_replay/goForward_5.png +0 -0
  125. data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_1.png +0 -0
  126. data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_2.png +0 -0
  127. data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_3.png +0 -0
  128. data/doc/guide/src/tutorial/log_replay/moveto_code_error.png +0 -0
  129. data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_1.png +0 -0
  130. data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_2.png +0 -0
  131. data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_3.png +0 -0
  132. data/doc/guide/src/tutorial/log_replay/plan_repair_4.png +0 -0
  133. data/doc/guide/src/tutorial/log_replay/roby_log_main_window.png +0 -0
  134. data/doc/guide/src/{basics → tutorial}/log_replay/roby_log_relation_window.png +0 -0
  135. data/doc/guide/src/{basics → tutorial}/log_replay/roby_replay_event_representation.png +0 -0
  136. data/doc/guide/src/tutorial/relations_display.page +153 -0
  137. data/doc/guide/src/{basics → tutorial}/roby_cycle_overview.png +0 -0
  138. data/doc/guide/src/tutorial/shell.page +121 -0
  139. data/doc/guide/src/{basics → tutorial}/summary.page +1 -1
  140. data/doc/guide/src/tutorial/tasks.page +374 -0
  141. data/lib/roby.rb +102 -47
  142. data/lib/roby/actions.rb +17 -0
  143. data/lib/roby/actions/action.rb +80 -0
  144. data/lib/roby/actions/interface.rb +45 -0
  145. data/lib/roby/actions/library.rb +23 -0
  146. data/lib/roby/actions/models/action.rb +224 -0
  147. data/lib/roby/actions/models/coordination_action.rb +58 -0
  148. data/lib/roby/actions/models/interface.rb +22 -0
  149. data/lib/roby/actions/models/interface_base.rb +294 -0
  150. data/lib/roby/actions/models/library.rb +12 -0
  151. data/lib/roby/actions/models/method_action.rb +90 -0
  152. data/lib/roby/actions/task.rb +114 -0
  153. data/lib/roby/and_generator.rb +125 -0
  154. data/lib/roby/app.rb +2795 -829
  155. data/lib/roby/app/autotest_console_reporter.rb +138 -0
  156. data/lib/roby/app/base.rb +21 -0
  157. data/lib/roby/app/cucumber.rb +2 -0
  158. data/lib/roby/app/cucumber/controller.rb +439 -0
  159. data/lib/roby/app/cucumber/helpers.rb +280 -0
  160. data/lib/roby/app/cucumber/world.rb +32 -0
  161. data/lib/roby/app/debug.rb +136 -0
  162. data/lib/roby/app/gen.rb +2 -0
  163. data/lib/roby/app/rake.rb +178 -38
  164. data/lib/roby/app/robot_config.rb +9 -0
  165. data/lib/roby/app/robot_names.rb +115 -0
  166. data/lib/roby/app/run.rb +3 -2
  167. data/lib/roby/app/scripts.rb +72 -0
  168. data/lib/roby/app/scripts/autotest.rb +173 -0
  169. data/lib/roby/app/scripts/display.rb +2 -0
  170. data/lib/roby/app/scripts/restart.rb +52 -0
  171. data/lib/roby/app/scripts/results.rb +17 -8
  172. data/lib/roby/app/scripts/run.rb +155 -24
  173. data/lib/roby/app/scripts/shell.rb +147 -62
  174. data/lib/roby/app/scripts/test.rb +107 -22
  175. data/lib/roby/app/test_reporter.rb +74 -0
  176. data/lib/roby/app/test_server.rb +159 -0
  177. data/lib/roby/app/vagrant.rb +47 -0
  178. data/lib/roby/backports.rb +16 -0
  179. data/lib/roby/cli/display.rb +190 -0
  180. data/lib/roby/cli/exceptions.rb +17 -0
  181. data/lib/roby/cli/gen/actions/class.rb +5 -0
  182. data/lib/roby/cli/gen/actions/test.rb +6 -0
  183. data/lib/roby/cli/gen/app/.yardopts +6 -0
  184. data/lib/roby/cli/gen/app/README.md +28 -0
  185. data/lib/roby/cli/gen/app/Rakefile +15 -0
  186. data/{app → lib/roby/cli/gen/app}/config/app.yml +29 -39
  187. data/lib/roby/cli/gen/app/models/.gitattributes +1 -0
  188. data/{app → lib/roby/cli/gen/app/scripts}/controllers/.gitattributes +0 -0
  189. data/{app/data/.gitattributes → lib/roby/cli/gen/app/test/.gitignore} +0 -0
  190. data/lib/roby/cli/gen/class/class.rb +6 -0
  191. data/lib/roby/cli/gen/class/test.rb +7 -0
  192. data/lib/roby/cli/gen/helpers.rb +203 -0
  193. data/lib/roby/cli/gen/module/module.rb +5 -0
  194. data/lib/roby/cli/gen/module/test.rb +6 -0
  195. data/lib/roby/cli/gen/roby_app/config/init.rb +17 -0
  196. data/lib/roby/cli/gen/roby_app/config/robots/robot.rb +40 -0
  197. data/lib/roby/cli/gen/task/class.rb +44 -0
  198. data/lib/roby/cli/gen/task/test.rb +6 -0
  199. data/lib/roby/cli/gen_main.rb +120 -0
  200. data/lib/roby/cli/log.rb +276 -0
  201. data/lib/roby/cli/log/flamegraph.html +499 -0
  202. data/lib/roby/cli/log/flamegraph_renderer.rb +88 -0
  203. data/lib/roby/cli/main.rb +153 -0
  204. data/lib/roby/coordination.rb +60 -0
  205. data/lib/roby/coordination/action_script.rb +25 -0
  206. data/lib/roby/coordination/action_state_machine.rb +125 -0
  207. data/lib/roby/coordination/actions.rb +106 -0
  208. data/lib/roby/coordination/base.rb +145 -0
  209. data/lib/roby/coordination/calculus.rb +40 -0
  210. data/lib/roby/coordination/child.rb +28 -0
  211. data/lib/roby/coordination/event.rb +29 -0
  212. data/lib/roby/coordination/fault_handler.rb +25 -0
  213. data/lib/roby/coordination/fault_handling_task.rb +13 -0
  214. data/lib/roby/coordination/fault_response_table.rb +110 -0
  215. data/lib/roby/coordination/models/action_script.rb +64 -0
  216. data/lib/roby/coordination/models/action_state_machine.rb +224 -0
  217. data/lib/roby/coordination/models/actions.rb +191 -0
  218. data/lib/roby/coordination/models/arguments.rb +55 -0
  219. data/lib/roby/coordination/models/base.rb +176 -0
  220. data/lib/roby/coordination/models/capture.rb +86 -0
  221. data/lib/roby/coordination/models/child.rb +35 -0
  222. data/lib/roby/coordination/models/event.rb +41 -0
  223. data/lib/roby/coordination/models/exceptions.rb +42 -0
  224. data/lib/roby/coordination/models/fault_handler.rb +219 -0
  225. data/lib/roby/coordination/models/fault_response_table.rb +77 -0
  226. data/lib/roby/coordination/models/root.rb +22 -0
  227. data/lib/roby/coordination/models/script.rb +283 -0
  228. data/lib/roby/coordination/models/task.rb +184 -0
  229. data/lib/roby/coordination/models/task_from_action.rb +50 -0
  230. data/lib/roby/coordination/models/task_from_as_plan.rb +33 -0
  231. data/lib/roby/coordination/models/task_from_instanciation_object.rb +31 -0
  232. data/lib/roby/coordination/models/task_from_variable.rb +27 -0
  233. data/lib/roby/coordination/models/task_with_dependencies.rb +48 -0
  234. data/lib/roby/coordination/models/variable.rb +32 -0
  235. data/lib/roby/coordination/script.rb +200 -0
  236. data/lib/roby/coordination/script_instruction.rb +12 -0
  237. data/lib/roby/coordination/task.rb +45 -0
  238. data/lib/roby/coordination/task_base.rb +69 -0
  239. data/lib/roby/coordination/task_script.rb +293 -0
  240. data/lib/roby/coordination/task_state_machine.rb +308 -0
  241. data/lib/roby/decision_control.rb +33 -21
  242. data/lib/roby/distributed_object.rb +76 -0
  243. data/lib/roby/droby.rb +17 -0
  244. data/lib/roby/droby/droby_id.rb +6 -0
  245. data/lib/roby/droby/enable.rb +153 -0
  246. data/lib/roby/droby/event_logger.rb +189 -0
  247. data/lib/roby/droby/event_logging.rb +57 -0
  248. data/lib/roby/droby/exceptions.rb +14 -0
  249. data/lib/roby/droby/identifiable.rb +22 -0
  250. data/lib/roby/droby/logfile.rb +141 -0
  251. data/lib/roby/droby/logfile/client.rb +176 -0
  252. data/lib/roby/droby/logfile/file_format.md +97 -0
  253. data/lib/roby/droby/logfile/index.rb +117 -0
  254. data/lib/roby/droby/logfile/reader.rb +139 -0
  255. data/lib/roby/droby/logfile/server.rb +199 -0
  256. data/lib/roby/droby/logfile/writer.rb +114 -0
  257. data/lib/roby/droby/marshal.rb +264 -0
  258. data/lib/roby/droby/marshallable.rb +12 -0
  259. data/lib/roby/droby/null_event_logger.rb +25 -0
  260. data/lib/roby/droby/object_manager.rb +205 -0
  261. data/lib/roby/droby/peer_id.rb +6 -0
  262. data/lib/roby/droby/plan_rebuilder.rb +373 -0
  263. data/lib/roby/droby/rebuilt_plan.rb +160 -0
  264. data/lib/roby/droby/remote_droby_id.rb +6 -0
  265. data/lib/roby/droby/timepoints.rb +205 -0
  266. data/lib/roby/droby/timepoints_ctf.metadata.erb +101 -0
  267. data/lib/roby/droby/timepoints_ctf.rb +125 -0
  268. data/lib/roby/droby/v5.rb +14 -0
  269. data/lib/roby/droby/v5/builtin.rb +120 -0
  270. data/lib/roby/droby/v5/droby_class.rb +45 -0
  271. data/lib/roby/droby/v5/droby_constant.rb +81 -0
  272. data/lib/roby/droby/v5/droby_dump.rb +1026 -0
  273. data/lib/roby/droby/v5/droby_id.rb +44 -0
  274. data/lib/roby/droby/v5/droby_model.rb +82 -0
  275. data/lib/roby/droby/v5/peer_id.rb +10 -0
  276. data/lib/roby/droby/v5/remote_droby_id.rb +42 -0
  277. data/lib/roby/event.rb +79 -957
  278. data/lib/roby/event_constraints.rb +835 -0
  279. data/lib/roby/event_generator.rb +1047 -0
  280. data/lib/roby/event_structure/causal_link.rb +6 -0
  281. data/lib/roby/event_structure/forwarding.rb +6 -0
  282. data/lib/roby/event_structure/precedence.rb +7 -0
  283. data/lib/roby/event_structure/signal.rb +8 -0
  284. data/lib/roby/event_structure/temporal_constraints.rb +640 -0
  285. data/lib/roby/exceptions.rb +446 -152
  286. data/lib/roby/executable_plan.rb +549 -0
  287. data/lib/roby/execution_engine.rb +1997 -950
  288. data/lib/roby/filter_generator.rb +26 -0
  289. data/lib/roby/gui/chronicle_view.rb +225 -0
  290. data/lib/roby/gui/chronicle_widget.rb +925 -0
  291. data/lib/roby/gui/dot_id.rb +11 -0
  292. data/lib/roby/gui/exception_view.rb +44 -0
  293. data/lib/roby/gui/log_display.rb +273 -0
  294. data/lib/roby/gui/model_views.rb +2 -0
  295. data/lib/roby/gui/model_views/action_interface.rb +53 -0
  296. data/lib/roby/gui/model_views/task.rb +47 -0
  297. data/lib/roby/gui/model_views/task.rhtml +41 -0
  298. data/lib/roby/gui/object_info_view.rb +89 -0
  299. data/lib/roby/gui/plan_dot_layout.rb +427 -0
  300. data/lib/roby/gui/plan_rebuilder_widget.rb +357 -0
  301. data/lib/roby/gui/qt4_toMSecsSinceEpoch.rb +8 -0
  302. data/lib/roby/gui/relations_view.rb +278 -0
  303. data/lib/roby/gui/relations_view/relations.ui +139 -0
  304. data/lib/roby/gui/relations_view/relations_canvas.rb +1088 -0
  305. data/lib/roby/gui/relations_view/relations_config.rb +292 -0
  306. data/lib/roby/gui/relations_view/relations_view.ui +53 -0
  307. data/lib/roby/gui/scheduler_view.css +24 -0
  308. data/lib/roby/gui/scheduler_view.rb +46 -0
  309. data/lib/roby/gui/scheduler_view.rhtml +53 -0
  310. data/lib/roby/gui/stepping.rb +93 -0
  311. data/lib/roby/gui/stepping.ui +181 -0
  312. data/lib/roby/gui/styles.rb +81 -0
  313. data/lib/roby/gui/task_display_configuration.rb +42 -0
  314. data/lib/roby/gui/task_state_at.rb +38 -0
  315. data/lib/roby/hooks.rb +26 -0
  316. data/lib/roby/interface.rb +136 -469
  317. data/lib/roby/interface/async.rb +20 -0
  318. data/lib/roby/interface/async/action_monitor.rb +188 -0
  319. data/lib/roby/interface/async/interface.rb +498 -0
  320. data/lib/roby/interface/async/job_monitor.rb +213 -0
  321. data/lib/roby/interface/async/log.rb +238 -0
  322. data/lib/roby/interface/async/new_job_listener.rb +79 -0
  323. data/lib/roby/interface/async/ui_connector.rb +183 -0
  324. data/lib/roby/interface/client.rb +553 -0
  325. data/lib/roby/interface/command.rb +24 -0
  326. data/lib/roby/interface/command_argument.rb +16 -0
  327. data/lib/roby/interface/command_library.rb +92 -0
  328. data/lib/roby/interface/droby_channel.rb +174 -0
  329. data/lib/roby/interface/exceptions.rb +22 -0
  330. data/lib/roby/interface/interface.rb +655 -0
  331. data/lib/roby/interface/job.rb +47 -0
  332. data/lib/roby/interface/rest.rb +10 -0
  333. data/lib/roby/interface/rest/api.rb +29 -0
  334. data/lib/roby/interface/rest/helpers.rb +24 -0
  335. data/lib/roby/interface/rest/server.rb +212 -0
  336. data/lib/roby/interface/server.rb +154 -0
  337. data/lib/roby/interface/shell_client.rb +468 -0
  338. data/lib/roby/interface/shell_subcommand.rb +24 -0
  339. data/lib/roby/interface/subcommand_client.rb +35 -0
  340. data/lib/roby/interface/tcp.rb +168 -0
  341. data/lib/roby/models/arguments.rb +112 -0
  342. data/lib/roby/models/plan_object.rb +83 -0
  343. data/lib/roby/models/task.rb +835 -0
  344. data/lib/roby/models/task_event.rb +62 -0
  345. data/lib/roby/models/task_service.rb +78 -0
  346. data/lib/roby/or_generator.rb +88 -0
  347. data/lib/roby/plan.rb +1751 -864
  348. data/lib/roby/plan_object.rb +611 -0
  349. data/lib/roby/plan_service.rb +200 -0
  350. data/lib/roby/promise.rb +332 -0
  351. data/lib/roby/queries.rb +23 -0
  352. data/lib/roby/queries/and_matcher.rb +32 -0
  353. data/lib/roby/queries/any.rb +27 -0
  354. data/lib/roby/queries/code_error_matcher.rb +58 -0
  355. data/lib/roby/queries/event_generator_matcher.rb +9 -0
  356. data/lib/roby/queries/execution_exception_matcher.rb +165 -0
  357. data/lib/roby/queries/index.rb +165 -0
  358. data/lib/roby/queries/localized_error_matcher.rb +149 -0
  359. data/lib/roby/queries/matcher_base.rb +107 -0
  360. data/lib/roby/queries/none.rb +27 -0
  361. data/lib/roby/queries/not_matcher.rb +30 -0
  362. data/lib/roby/queries/op_matcher.rb +8 -0
  363. data/lib/roby/queries/or_matcher.rb +30 -0
  364. data/lib/roby/queries/plan_object_matcher.rb +363 -0
  365. data/lib/roby/queries/query.rb +188 -0
  366. data/lib/roby/queries/task_event_generator_matcher.rb +86 -0
  367. data/lib/roby/queries/task_matcher.rb +344 -0
  368. data/lib/roby/relations.rb +42 -678
  369. data/lib/roby/relations/bidirectional_directed_adjacency_graph.rb +492 -0
  370. data/lib/roby/relations/directed_relation_support.rb +268 -0
  371. data/lib/roby/relations/event_relation_graph.rb +19 -0
  372. data/lib/roby/relations/fork_merge_visitor.rb +154 -0
  373. data/lib/roby/relations/graph.rb +533 -0
  374. data/lib/roby/relations/models/directed_relation_support.rb +11 -0
  375. data/lib/roby/relations/models/graph.rb +75 -0
  376. data/lib/roby/relations/models/task_relation_graph.rb +18 -0
  377. data/lib/roby/relations/space.rb +380 -0
  378. data/lib/roby/relations/task_relation_graph.rb +20 -0
  379. data/lib/roby/robot.rb +85 -38
  380. data/lib/roby/schedulers/basic.rb +155 -25
  381. data/lib/roby/schedulers/null.rb +20 -0
  382. data/lib/roby/schedulers/reporting.rb +31 -0
  383. data/lib/roby/schedulers/state.rb +129 -0
  384. data/lib/roby/schedulers/temporal.rb +91 -0
  385. data/lib/roby/singletons.rb +87 -0
  386. data/lib/roby/standalone.rb +4 -2
  387. data/lib/roby/standard_errors.rb +405 -82
  388. data/lib/roby/state.rb +6 -3
  389. data/lib/roby/state/conf_model.rb +5 -0
  390. data/lib/roby/state/events.rb +181 -95
  391. data/lib/roby/state/goal_model.rb +77 -0
  392. data/lib/roby/state/open_struct.rb +591 -0
  393. data/lib/roby/state/open_struct_model.rb +68 -0
  394. data/lib/roby/state/pos.rb +45 -45
  395. data/lib/roby/state/shapes.rb +11 -11
  396. data/lib/roby/state/state_model.rb +303 -0
  397. data/lib/roby/state/task.rb +43 -0
  398. data/lib/roby/support.rb +88 -148
  399. data/lib/roby/task.rb +1361 -1750
  400. data/lib/roby/task_arguments.rb +428 -0
  401. data/lib/roby/task_event.rb +127 -0
  402. data/lib/roby/task_event_generator.rb +337 -0
  403. data/lib/roby/task_service.rb +6 -0
  404. data/lib/roby/task_structure/conflicts.rb +104 -0
  405. data/lib/roby/task_structure/dependency.rb +932 -0
  406. data/lib/roby/task_structure/error_handling.rb +118 -0
  407. data/lib/roby/task_structure/executed_by.rb +234 -0
  408. data/lib/roby/task_structure/planned_by.rb +90 -0
  409. data/lib/roby/tasks/aggregator.rb +37 -0
  410. data/lib/roby/tasks/external_process.rb +275 -0
  411. data/lib/roby/tasks/group.rb +27 -0
  412. data/lib/roby/tasks/null.rb +19 -0
  413. data/lib/roby/tasks/parallel.rb +43 -0
  414. data/lib/roby/tasks/sequence.rb +88 -0
  415. data/lib/roby/tasks/simple.rb +21 -0
  416. data/lib/roby/{thread_task.rb → tasks/thread.rb} +50 -24
  417. data/lib/roby/tasks/timeout.rb +17 -0
  418. data/lib/roby/tasks/virtual.rb +55 -0
  419. data/lib/roby/template_plan.rb +7 -0
  420. data/lib/roby/test/aruba_minitest.rb +74 -0
  421. data/lib/roby/test/assertion.rb +16 -0
  422. data/lib/roby/test/assertions.rb +490 -0
  423. data/lib/roby/test/common.rb +368 -591
  424. data/lib/roby/test/dsl.rb +149 -0
  425. data/lib/roby/test/error.rb +18 -0
  426. data/lib/roby/test/event_reporter.rb +83 -0
  427. data/lib/roby/test/execution_expectations.rb +1134 -0
  428. data/lib/roby/test/expect_execution.rb +151 -0
  429. data/lib/roby/test/minitest_helpers.rb +166 -0
  430. data/lib/roby/test/roby_app_helpers.rb +200 -0
  431. data/lib/roby/test/run_planners.rb +155 -0
  432. data/lib/roby/test/self.rb +112 -0
  433. data/lib/roby/test/spec.rb +198 -0
  434. data/lib/roby/test/tasks/empty_task.rb +4 -4
  435. data/lib/roby/test/tasks/goto.rb +28 -27
  436. data/lib/roby/test/teardown_plans.rb +100 -0
  437. data/lib/roby/test/testcase.rb +239 -307
  438. data/lib/roby/test/tools.rb +159 -155
  439. data/lib/roby/test/validate_state_machine.rb +75 -0
  440. data/lib/roby/transaction.rb +1125 -0
  441. data/lib/roby/transaction/event_generator_proxy.rb +63 -0
  442. data/lib/roby/transaction/plan_object_proxy.rb +99 -0
  443. data/lib/roby/transaction/plan_service_proxy.rb +43 -0
  444. data/lib/roby/transaction/proxying.rb +120 -0
  445. data/lib/roby/transaction/task_event_generator_proxy.rb +19 -0
  446. data/lib/roby/transaction/task_proxy.rb +135 -0
  447. data/lib/roby/until_generator.rb +30 -0
  448. data/lib/roby/version.rb +5 -0
  449. data/lib/roby/yard.rb +169 -0
  450. data/lib/yard-roby.rb +1 -0
  451. data/manifest.xml +32 -6
  452. data/roby.gemspec +59 -0
  453. metadata +788 -587
  454. data/Manifest.txt +0 -321
  455. data/NOTES +0 -4
  456. data/README.txt +0 -166
  457. data/TODO.txt +0 -146
  458. data/app/README.txt +0 -24
  459. data/app/Rakefile +0 -8
  460. data/app/config/ROBOT.rb +0 -5
  461. data/app/config/init.rb +0 -33
  462. data/app/config/roby.yml +0 -3
  463. data/app/controllers/ROBOT.rb +0 -2
  464. data/app/planners/ROBOT/main.rb +0 -6
  465. data/app/planners/main.rb +0 -5
  466. data/app/scripts/distributed +0 -3
  467. data/app/scripts/generate/bookmarks +0 -3
  468. data/app/scripts/replay +0 -3
  469. data/app/scripts/results +0 -3
  470. data/app/scripts/run +0 -3
  471. data/app/scripts/server +0 -3
  472. data/app/scripts/shell +0 -3
  473. data/app/scripts/test +0 -3
  474. data/app/tasks/.gitattributes +0 -0
  475. data/app/tasks/ROBOT/.gitattributes +0 -0
  476. data/bin/roby-shell +0 -25
  477. data/doc/guide/src/basics/app.page +0 -139
  478. data/doc/guide/src/basics/index.page +0 -11
  479. data/doc/guide/src/basics/log_replay/goForward_1.png +0 -0
  480. data/doc/guide/src/basics/log_replay/goForward_2.png +0 -0
  481. data/doc/guide/src/basics/log_replay/goForward_3.png +0 -0
  482. data/doc/guide/src/basics/log_replay/goForward_5.png +0 -0
  483. data/doc/guide/src/basics/log_replay/plan_repair_4.png +0 -0
  484. data/doc/guide/src/basics/log_replay/roby_log_main_window.png +0 -0
  485. data/doc/guide/src/basics/relations_display.page +0 -203
  486. data/doc/guide/src/basics/shell.page +0 -102
  487. data/doc/guide/src/default.css +0 -319
  488. data/doc/guide/src/introduction/index.page +0 -29
  489. data/doc/guide/src/introduction/publications.page +0 -14
  490. data/doc/guide/src/relations/dependency.page +0 -89
  491. data/doc/guide/src/relations/index.page +0 -12
  492. data/ext/droby/dump.cc +0 -175
  493. data/ext/droby/extconf.rb +0 -3
  494. data/ext/graph/algorithm.cc +0 -746
  495. data/ext/graph/extconf.rb +0 -7
  496. data/ext/graph/graph.cc +0 -575
  497. data/ext/graph/graph.hh +0 -183
  498. data/ext/graph/iterator_sequence.hh +0 -102
  499. data/ext/graph/undirected_dfs.hh +0 -226
  500. data/ext/graph/undirected_graph.hh +0 -421
  501. data/lib/roby/app/scripts/generate/bookmarks.rb +0 -162
  502. data/lib/roby/app/scripts/replay.rb +0 -31
  503. data/lib/roby/app/scripts/server.rb +0 -18
  504. data/lib/roby/basic_object.rb +0 -151
  505. data/lib/roby/config.rb +0 -14
  506. data/lib/roby/distributed.rb +0 -36
  507. data/lib/roby/distributed/base.rb +0 -448
  508. data/lib/roby/distributed/communication.rb +0 -875
  509. data/lib/roby/distributed/connection_space.rb +0 -616
  510. data/lib/roby/distributed/distributed_object.rb +0 -206
  511. data/lib/roby/distributed/drb.rb +0 -62
  512. data/lib/roby/distributed/notifications.rb +0 -531
  513. data/lib/roby/distributed/peer.rb +0 -555
  514. data/lib/roby/distributed/protocol.rb +0 -529
  515. data/lib/roby/distributed/proxy.rb +0 -343
  516. data/lib/roby/distributed/subscription.rb +0 -311
  517. data/lib/roby/distributed/transaction.rb +0 -498
  518. data/lib/roby/external_process_task.rb +0 -225
  519. data/lib/roby/graph.rb +0 -160
  520. data/lib/roby/log.rb +0 -3
  521. data/lib/roby/log/chronicle.rb +0 -303
  522. data/lib/roby/log/console.rb +0 -74
  523. data/lib/roby/log/data_stream.rb +0 -275
  524. data/lib/roby/log/dot.rb +0 -279
  525. data/lib/roby/log/event_stream.rb +0 -161
  526. data/lib/roby/log/file.rb +0 -396
  527. data/lib/roby/log/gui/basic_display.ui +0 -83
  528. data/lib/roby/log/gui/basic_display_ui.rb +0 -89
  529. data/lib/roby/log/gui/chronicle.rb +0 -26
  530. data/lib/roby/log/gui/chronicle_view.rb +0 -40
  531. data/lib/roby/log/gui/chronicle_view.ui +0 -70
  532. data/lib/roby/log/gui/chronicle_view_ui.rb +0 -90
  533. data/lib/roby/log/gui/data_displays.rb +0 -171
  534. data/lib/roby/log/gui/data_displays.ui +0 -155
  535. data/lib/roby/log/gui/data_displays_ui.rb +0 -146
  536. data/lib/roby/log/gui/notifications.rb +0 -26
  537. data/lib/roby/log/gui/relations.rb +0 -269
  538. data/lib/roby/log/gui/relations.ui +0 -123
  539. data/lib/roby/log/gui/relations_ui.rb +0 -120
  540. data/lib/roby/log/gui/relations_view.rb +0 -185
  541. data/lib/roby/log/gui/relations_view.ui +0 -149
  542. data/lib/roby/log/gui/relations_view_ui.rb +0 -144
  543. data/lib/roby/log/gui/replay.rb +0 -366
  544. data/lib/roby/log/gui/replay_controls.rb +0 -206
  545. data/lib/roby/log/gui/replay_controls.ui +0 -282
  546. data/lib/roby/log/gui/replay_controls_ui.rb +0 -249
  547. data/lib/roby/log/gui/runtime.rb +0 -130
  548. data/lib/roby/log/hooks.rb +0 -186
  549. data/lib/roby/log/logger.rb +0 -203
  550. data/lib/roby/log/notifications.rb +0 -244
  551. data/lib/roby/log/plan_rebuilder.rb +0 -468
  552. data/lib/roby/log/relations.rb +0 -1084
  553. data/lib/roby/log/server.rb +0 -547
  554. data/lib/roby/log/sqlite.rb +0 -47
  555. data/lib/roby/log/timings.rb +0 -233
  556. data/lib/roby/plan-object.rb +0 -371
  557. data/lib/roby/planning.rb +0 -13
  558. data/lib/roby/planning/loops.rb +0 -309
  559. data/lib/roby/planning/model.rb +0 -1012
  560. data/lib/roby/planning/task.rb +0 -180
  561. data/lib/roby/query.rb +0 -655
  562. data/lib/roby/relations/conflicts.rb +0 -67
  563. data/lib/roby/relations/dependency.rb +0 -358
  564. data/lib/roby/relations/ensured.rb +0 -19
  565. data/lib/roby/relations/error_handling.rb +0 -22
  566. data/lib/roby/relations/events.rb +0 -7
  567. data/lib/roby/relations/executed_by.rb +0 -208
  568. data/lib/roby/relations/influence.rb +0 -10
  569. data/lib/roby/relations/planned_by.rb +0 -63
  570. data/lib/roby/state/information.rb +0 -55
  571. data/lib/roby/state/state.rb +0 -367
  572. data/lib/roby/task-operations.rb +0 -186
  573. data/lib/roby/task_index.rb +0 -80
  574. data/lib/roby/test/distributed.rb +0 -230
  575. data/lib/roby/test/tasks/simple_task.rb +0 -23
  576. data/lib/roby/transactions.rb +0 -507
  577. data/lib/roby/transactions/proxy.rb +0 -325
  578. data/plugins/fault_injection/History.txt +0 -4
  579. data/plugins/fault_injection/README.txt +0 -34
  580. data/plugins/fault_injection/Rakefile +0 -12
  581. data/plugins/fault_injection/TODO.txt +0 -0
  582. data/plugins/fault_injection/app.rb +0 -52
  583. data/plugins/fault_injection/fault_injection.rb +0 -89
  584. data/plugins/fault_injection/test/test_fault_injection.rb +0 -78
  585. data/plugins/subsystems/README.txt +0 -37
  586. data/plugins/subsystems/Rakefile +0 -13
  587. data/plugins/subsystems/app.rb +0 -182
  588. data/plugins/subsystems/test/app/README +0 -24
  589. data/plugins/subsystems/test/app/Rakefile +0 -8
  590. data/plugins/subsystems/test/app/config/app.yml +0 -71
  591. data/plugins/subsystems/test/app/config/init.rb +0 -12
  592. data/plugins/subsystems/test/app/config/roby.yml +0 -3
  593. data/plugins/subsystems/test/app/planners/main.rb +0 -20
  594. data/plugins/subsystems/test/app/scripts/distributed +0 -3
  595. data/plugins/subsystems/test/app/scripts/replay +0 -3
  596. data/plugins/subsystems/test/app/scripts/results +0 -3
  597. data/plugins/subsystems/test/app/scripts/run +0 -3
  598. data/plugins/subsystems/test/app/scripts/server +0 -3
  599. data/plugins/subsystems/test/app/scripts/shell +0 -3
  600. data/plugins/subsystems/test/app/scripts/test +0 -3
  601. data/plugins/subsystems/test/app/tasks/services.rb +0 -15
  602. data/plugins/subsystems/test/test_subsystems.rb +0 -78
  603. data/test/distributed/test_communication.rb +0 -195
  604. data/test/distributed/test_connection.rb +0 -284
  605. data/test/distributed/test_execution.rb +0 -378
  606. data/test/distributed/test_mixed_plan.rb +0 -341
  607. data/test/distributed/test_plan_notifications.rb +0 -238
  608. data/test/distributed/test_protocol.rb +0 -525
  609. data/test/distributed/test_query.rb +0 -106
  610. data/test/distributed/test_remote_plan.rb +0 -491
  611. data/test/distributed/test_transaction.rb +0 -466
  612. data/test/mockups/external_process +0 -28
  613. data/test/mockups/tasks.rb +0 -27
  614. data/test/planning/test_loops.rb +0 -432
  615. data/test/planning/test_model.rb +0 -427
  616. data/test/planning/test_task.rb +0 -126
  617. data/test/relations/test_conflicts.rb +0 -42
  618. data/test/relations/test_dependency.rb +0 -324
  619. data/test/relations/test_ensured.rb +0 -38
  620. data/test/relations/test_executed_by.rb +0 -224
  621. data/test/relations/test_planned_by.rb +0 -56
  622. data/test/suite_core.rb +0 -29
  623. data/test/suite_distributed.rb +0 -10
  624. data/test/suite_planning.rb +0 -4
  625. data/test/suite_relations.rb +0 -8
  626. data/test/tasks/test_external_process.rb +0 -126
  627. data/test/tasks/test_thread_task.rb +0 -70
  628. data/test/test_bgl.rb +0 -528
  629. data/test/test_event.rb +0 -969
  630. data/test/test_exceptions.rb +0 -591
  631. data/test/test_execution_engine.rb +0 -987
  632. data/test/test_gui.rb +0 -20
  633. data/test/test_interface.rb +0 -43
  634. data/test/test_log.rb +0 -125
  635. data/test/test_log_server.rb +0 -133
  636. data/test/test_plan.rb +0 -418
  637. data/test/test_query.rb +0 -424
  638. data/test/test_relations.rb +0 -260
  639. data/test/test_state.rb +0 -432
  640. data/test/test_support.rb +0 -16
  641. data/test/test_task.rb +0 -1181
  642. data/test/test_testcase.rb +0 -138
  643. data/test/test_transactions.rb +0 -610
  644. data/test/test_transactions_proxy.rb +0 -216
@@ -1,203 +0,0 @@
1
- require 'roby/log/hooks'
2
- require 'roby/log/file'
3
-
4
- module Roby::Log
5
- @loggers = Array.new
6
- @@logging_thread = nil
7
-
8
- extend Logger::Hierarchy
9
- extend Logger::Forward
10
-
11
- class << self
12
- # Start the logging framework
13
- def logging?
14
- @@logging_thread
15
- end
16
-
17
- # Start the logging framework
18
- def start_logging # :nodoc:
19
- return if logging?
20
- logged_events.clear
21
- @@logging_thread = Thread.new(&method(:logger_loop))
22
- end
23
-
24
- # Stop the logging framework
25
- def stop_logging # :nodoc:
26
- return unless logging?
27
- logged_events.push nil
28
- flushed_logger_mutex.synchronize do
29
- while @@logging_thread
30
- flushed_logger.wait(flushed_logger_mutex)
31
- end
32
- end
33
- end
34
-
35
- # Add a logger object in the system
36
- def add_logger(logger)
37
- start_logging
38
- @loggers << logger
39
- end
40
-
41
- # Remove a logger from the list of loggers
42
- def remove_logger(logger)
43
- flush if logging?
44
- if @loggers.size == 1
45
- stop_logging
46
- end
47
- @loggers.delete logger
48
- logger.close
49
- end
50
-
51
- # Remove all loggers
52
- def clear_loggers
53
- stop_logging
54
- @loggers.clear
55
- end
56
-
57
- # Iterates on all the logger objects. If +m+ is given, yields only the loggers
58
- # which respond to this method.
59
- def each_logger(m = nil)
60
- for l in @loggers
61
- if !m || l.respond_to?(m)
62
- yield(l)
63
- end
64
- end
65
- end
66
-
67
- # Returns true if there is at least one loggr for the +m+ message
68
- def has_logger?(m)
69
- for l in @loggers
70
- return true if l.logs_message?(m)
71
- end
72
- false
73
- end
74
-
75
- attr_reader :logged_events
76
- attr_reader :flushed_logger_mutex
77
- attr_reader :flushed_logger
78
- attr_reader :known_objects
79
-
80
- def incremental_dump?(object); known_objects.include?(object) end
81
-
82
- # call-seq:
83
- # Log.log(message) { args }
84
- #
85
- # Logs +message+ with argument +args+. The block is called only once if
86
- # there is at least one logger which listens for +message+.
87
- def log(m, args = nil)
88
- if m == :added_tasks || m == :added_events
89
- Roby.synchronize do
90
- args ||= yield
91
- objects = args[1].to_value_set
92
- # Do not give a 'peer' argument at Distributed.format, to
93
- # make sure we do a full dump
94
- args = Roby::Distributed.format(args) if has_logger?(m)
95
- known_objects.merge(objects)
96
- end
97
- elsif m == :finalized_task || m == :finalized_event
98
- Roby.synchronize do
99
- args ||= yield
100
- object = args[1]
101
- args = Roby::Distributed.format(args, self) if has_logger?(m)
102
- known_objects.delete(object)
103
- end
104
- end
105
-
106
- if has_logger?(m)
107
- if !args && block_given?
108
- Roby.synchronize do
109
- args = Roby::Distributed.format(yield, self)
110
- end
111
- end
112
-
113
- logged_events << [m, Time.now, args]
114
- end
115
- end
116
-
117
- # The main logging loop. We use a separate loop to avoid having logging
118
- # have too much influence on the control thread. The Log.logged_events
119
- # attribute is a sized queue (of size LOGGED_EVENTS_QUEUE_SIZE) in
120
- # which all the events needing logging are saved
121
- def logger_loop
122
- Thread.current.priority = 2
123
- loop do
124
- m, time, args = logged_events.pop
125
- break unless m
126
-
127
- each_logger(m) do |logger|
128
- if logger.splat?
129
- logger.send(m, time, *args)
130
- else
131
- logger.send(m, time, args)
132
- end
133
- end
134
-
135
- if m == :flush && logged_events.empty?
136
- flushed_logger_mutex.synchronize do
137
- flushed_logger.broadcast
138
- end
139
- end
140
- end
141
-
142
- rescue Exception => e
143
- Roby::Log.fatal "logger thread dies with #{e.full_message}" unless e.kind_of?(Interrupt)
144
-
145
- ensure
146
- # Wake up any waiting thread
147
- flushed_logger_mutex.synchronize do
148
- @@logging_thread = nil
149
- flushed_logger.broadcast
150
- end
151
- end
152
-
153
- # Waits for all the events queued in +logged_events+ to be processed by
154
- # the logging thread. Also sends the +flush+ message to all loggers
155
- # that respond to it
156
- def flush
157
- flushed_logger_mutex.synchronize do
158
- if !logging?
159
- raise "not logging"
160
- end
161
-
162
- logged_events.push [:flush, []]
163
- flushed_logger.wait(flushed_logger_mutex)
164
- end
165
- end
166
-
167
- # Requires all displays
168
- def load_all_displays
169
- require 'roby/log/relations'
170
- require 'roby/log/execution-state'
171
- end
172
-
173
- def open(file)
174
- Logfile.open(file)
175
- end
176
-
177
- def replay(file, &block)
178
- if file =~ /\.gz$/
179
- require 'zlib'
180
- require 'roby/log/file'
181
- Zlib::GzipReader.open(file) do |io|
182
- FileLogger.replay(io, &block)
183
- end
184
- elsif file =~ /\.db$/
185
- require 'roby/log/sqlite'
186
- SQLiteLogger.replay(file, &block)
187
- else
188
- require 'roby/log/file'
189
- File.open(file) do |io|
190
- FileLogger.replay(io, &block)
191
- end
192
- end
193
- end
194
- end
195
-
196
- LOGGED_EVENTS_QUEUE_SIZE = 2000
197
- @logged_events = SizedQueue.new(LOGGED_EVENTS_QUEUE_SIZE)
198
- @flushed_logger_mutex = Mutex.new
199
- @flushed_logger = ConditionVariable.new
200
- @known_objects = ValueSet.new
201
-
202
- end
203
-
@@ -1,244 +0,0 @@
1
- require 'roby/log/data_stream'
2
-
3
- class Roby::Task::DRoby
4
- attr_accessor :mission
5
- end
6
-
7
- module Roby
8
- module Log
9
- class Notifications < Roby::Log::DataDecoder
10
- GENERATOR_CALL_LIMIT = 0.1
11
-
12
- attr_reader :tasks
13
-
14
- attr_reader :histories
15
- def initialize(name)
16
- @tasks = Hash.new
17
- @histories = Hash.new { |h, k| h[k] = Array.new }
18
- super(name)
19
- end
20
-
21
- def added_task(task)
22
- task.remote_siblings.each_value do |id|
23
- tasks[id] = task
24
- end
25
- end
26
- def removed_task(remote_id)
27
- task = tasks.delete(remote_id)
28
- task.remote_siblings.each_value do |id|
29
- tasks.delete(id)
30
- end
31
- end
32
-
33
- def clear
34
- super
35
-
36
- @tasks.clear
37
- @histories.clear
38
- end
39
-
40
-
41
- def process(data)
42
- data.each_slice(4) do |m, sec, usec, args|
43
- time = Time.at(sec, usec)
44
- case m.to_s
45
- when /added_mission/
46
- task = tasks[args[1]]
47
- task.mission = true
48
- event :added_mission, args[0], task
49
-
50
- when /unmarked_mission/
51
- task = tasks[args[1]]
52
- task.mission = false
53
- event :unmarked_mission, args[0], task
54
-
55
- when /added_tasks/
56
- args[1].each { |t| added_task(t) }
57
-
58
- when /finalized_task/
59
- id = args[1]
60
- task = tasks[id]
61
- if histories[id].empty?
62
- event :finalized_pending, time, task
63
- end
64
- histories.delete(task)
65
- removed_task(args[1])
66
-
67
- when /generator_calling/
68
- @current_call = [time, args[0]]
69
-
70
- when /generator_called/
71
- if @current_call[1] == args[0]
72
- duration = time - @current_call[0]
73
- if duration > GENERATOR_CALL_LIMIT
74
- event :overly_long_call, time, duration, tasks[args[0].task], args[0].symbol, args[1]
75
- end
76
- end
77
-
78
- when /exception/
79
- error, involved_tasks = *args
80
- involved_tasks = involved_tasks.map { |id| tasks[id] }
81
- event m, time, error, involved_tasks
82
- when /generator_fired/
83
- generator = args[0]
84
- if generator.respond_to?(:task)
85
- histories[generator.task] << args
86
- if generator.symbol == :failed
87
- event :failed_task, time, tasks[generator.task], histories[generator.task]
88
- end
89
- end
90
- end
91
- end
92
- end
93
-
94
- def event(name, *args)
95
- displays.each do |display|
96
- if display.respond_to?(name)
97
- display.send(name, *args)
98
- end
99
- end
100
- end
101
- end
102
-
103
- class NotificationsDisplay < Qt::TextBrowser
104
- include DataDisplay
105
- decoder Notifications
106
-
107
- attr_reader :document
108
- attr_reader :text
109
-
110
- STYLESHEET = <<-EOS
111
- h1 { font-size: large; }
112
- h1 { margin-bottom: 3px; }
113
- h2 { font-size: medium; }
114
- .time {
115
- margin-right: 10px;
116
- }
117
-
118
- div.info {
119
- color: black;
120
- margin-top: 20px;
121
- border-top: thin solid black;
122
- }
123
- div.info h1 { margin-top: 0; background-color: #5FB86A; }
124
- div.warn {
125
- color: black;
126
- margin-top: 20px;
127
- border-top: thin solid black;
128
- }
129
- div.warn h1 { margin-top: 0; background-color: #B8AC5F; }
130
- div.error {
131
- color: black;
132
- margin-top: 20px;
133
- border-top: thin solid black;
134
- }
135
- div.error h1 { margin-top: 0; background-color: #B8937D; }
136
- EOS
137
-
138
- def initialize
139
- super()
140
-
141
- resize(500, 600)
142
- @main = self
143
- @document = Qt::TextDocument.new
144
-
145
- self.document = document
146
- document.setDefaultStyleSheet(STYLESHEET)
147
- end
148
-
149
-
150
- def render_event(kind, time, title)
151
- @text = ""
152
- text << "\n<div class=#{kind}>\n <h1><span class=\"time\">#{time.to_hms}</span> #{title}</h1>\n "
153
- yield
154
-
155
- ensure
156
- text << "\n</div>"
157
- insertHtml(text)
158
- verticalScrollBar.value = verticalScrollBar.maximum
159
- end
160
-
161
- def render_task(task)
162
- remote_siblings = "{ " << task.remote_siblings.map { |peer, id| id.to_s(peer) }.join(", ") << " }"
163
- text << "<div class=\"task\">
164
- #{task.model.ancestors.first.first}#{remote_siblings}\n "
165
-
166
- unless task.arguments.empty?
167
- text << "<ul class=\"task-arguments\">\n "
168
- task.arguments.each do |key, value|
169
- text << " <li>#{key}: #{value}<li>\n"
170
- end
171
- text << " </ul>\n"
172
- end
173
- text << "</div>"
174
- end
175
-
176
- def render_history(history)
177
- text << "<ul class=\"history\">\n"
178
- history.each do |generator, id, time, context|
179
- text << "<li>#{time.to_hms} #{generator.symbol} [#{context}]</li>"
180
- end
181
- text << "</ul>"
182
- end
183
-
184
- def clear
185
- document.clear
186
- end
187
-
188
- def finalized_pending(time, task)
189
- render_event("warn", time, "Finalized pending task") do
190
- render_task(task)
191
- end
192
- end
193
- def added_mission(time, task)
194
- render_event("info", time, "New mission") do
195
- render_task(task)
196
- end
197
- end
198
- def removed_mission(time, task)
199
- render_event("info", time, "Removed mission") do
200
- render_task(task)
201
- end
202
- end
203
- def render_error(error, tasks)
204
- error = Qt.escape(error.to_s)
205
- error = error.split("\n").map do |line|
206
- line.gsub(/^\s+/) { "&nbsp;" * $&.size }
207
- end.join("<br>")
208
-
209
- text << error
210
- text << "<h2>Involved tasks</h2>"
211
- text << "<ul>"
212
- tasks.each do |t|
213
- text << "<li>"
214
- render_task(t)
215
- text << "</li>"
216
- end
217
- end
218
-
219
- def fatal_exception(time, error, tasks)
220
- render_event("error", time, "Fatal exception") do
221
- render_error(error, tasks)
222
- end
223
- end
224
- def handled_exception(time, error, tasks)
225
- render_event("warn", time, "Handled exception") do
226
- render_error(error, tasks)
227
- end
228
- end
229
- def failed_task(time, task, history)
230
- render_event("warn", time, "Failed task") do
231
- render_task(task)
232
- render_history(history)
233
- end
234
- end
235
- def overly_long_call(time, duration, task, event_name, context)
236
- render_event("warn", time, "Overly long call: ") do
237
- text << "Call of #{event_name}(#{context}) lasted #{Integer(duration * 1000)}ms in<br>"
238
- render_task(task)
239
- end
240
- end
241
- end
242
- end
243
- end
244
-
@@ -1,468 +0,0 @@
1
- require 'roby/distributed/protocol'
2
- require 'roby/log/data_stream'
3
- require 'stringio'
4
-
5
- module Roby
6
- class ObjectIDManager
7
- attr_reader :siblings
8
- attr_reader :objects
9
- def initialize
10
- @siblings = Hash.new
11
- @objects = Hash.new
12
- @inserted_at = Hash.new
13
- end
14
-
15
- def clear
16
- siblings.clear
17
- objects.clear
18
- end
19
-
20
- def local_object(object, allow_new = true)
21
- return unless object
22
-
23
- current_siblings = Set.new
24
- ids = Set.new
25
- if object.kind_of?(Distributed::RemoteID)
26
- ids << object
27
- if sibling = siblings[object]
28
- current_siblings << sibling
29
- end
30
- else
31
- for _, id in object.remote_siblings
32
- ids << id
33
- if sibling = siblings[id]
34
- current_siblings << sibling
35
- end
36
- end
37
- end
38
-
39
- if current_siblings.size > 1
40
- raise "more than one object matching"
41
- elsif current_siblings.empty?
42
- if object.kind_of?(Distributed::RemoteID)
43
- raise "no object for this ID"
44
- elsif !allow_new
45
- raise "new object ot type #{object.class} is not allowed here"
46
- end
47
- else
48
- obj = current_siblings.find { true }
49
- if object.kind_of?(Distributed::RemoteID)
50
- object = obj
51
- end
52
-
53
- if obj.class != object.class
54
- # Special case: +obj+ is a PlanObject and it is in no plan.
55
- #
56
- # In this case, we just replace it silently. It handles the
57
- # corner case of having a task hanging around because it is
58
- # linked to others, but has not been included in a plan.
59
- #
60
- # Note that this is a hack and should be fixed
61
- if obj.respond_to?(:plan) && !obj.plan
62
- for id in objects.delete(obj)
63
- siblings.delete(id)
64
- end
65
- else
66
- raise "class mismatch #{obj.class} != #{object.class}. Old object is #{obj}"
67
- end
68
- elsif block_given?
69
- ids.merge objects.delete(obj)
70
- object = yield(obj)
71
- else
72
- object = obj
73
- end
74
- end
75
-
76
- objects[object] ||= Set.new
77
- objects[object].merge ids
78
- for i in ids
79
- siblings[i] = object
80
- end
81
-
82
- object
83
- end
84
-
85
- def add_id(object, id)
86
- if siblings[id]
87
- raise "there is already an object for this ID"
88
- elsif !id.kind_of(Distributed::RemoteID)
89
- raise "#{id} is not a valid RemoteID"
90
- end
91
-
92
- siblings[id] = object
93
- objects[object] << id
94
- end
95
-
96
- def remove_id(id)
97
- if !(object = siblings.delete(id))
98
- raise "#{id} does not reference anything"
99
- end
100
- objects[object].delete(id)
101
- end
102
-
103
- def remove(object)
104
- object = local_object(object)
105
-
106
- ids = objects.delete(object)
107
- for i in ids
108
- siblings.delete(i)
109
- end
110
- end
111
- end
112
-
113
- class PlanObject::DRoby
114
- include DirectedRelationSupport
115
- attr_writer :plan
116
-
117
- def update_from(new)
118
- super if defined? super
119
- end
120
- end
121
- class TaskEventGenerator::DRoby
122
- include DirectedRelationSupport
123
- attr_writer :plan
124
- attr_writer :task
125
-
126
- def update_from(new)
127
- super if defined? super
128
- end
129
- end
130
- class Task::DRoby
131
- attr_writer :plan
132
- attribute(:events) { Hash.new }
133
-
134
- def update_from(new)
135
- super if defined? super
136
- self.flags.merge! new.flags
137
- self.plan = new.plan
138
- end
139
- end
140
-
141
- class Transaction::Proxy::DRoby
142
- include DirectedRelationSupport
143
- attr_writer :transaction
144
- attr_accessor :plan
145
-
146
- def events; Hash.new end
147
- def update_from(new)
148
- super if defined? super
149
- end
150
- end
151
-
152
- module LoggedPlan
153
- attribute(:missions) { ValueSet.new }
154
- attribute(:known_tasks) { ValueSet.new }
155
- attribute(:free_events) { ValueSet.new }
156
- attribute(:transactions) { ValueSet.new }
157
- attribute(:finalized_tasks) { ValueSet.new }
158
- attribute(:finalized_events) { ValueSet.new }
159
- attribute(:proxies) { ValueSet.new }
160
- attr_accessor :parent_plan
161
-
162
- def root_plan?; !parent_plan end
163
- def update_from(new); end
164
- def clear
165
- transactions.dup.each do |trsc|
166
- trsc.clear
167
- removed_transaction(trsc)
168
- end
169
- known_tasks.dup.each { |t| finalized_task(t) }
170
- free_events.dup.each { |e| finalized_event(e) }
171
- clear_finalized(finalized_tasks, finalized_events)
172
- end
173
-
174
- def finalized_task(task)
175
- missions.delete(task)
176
- known_tasks.delete(task)
177
- proxies.delete(task)
178
- finalized_tasks << task
179
- end
180
- def finalized_event(event)
181
- free_events.delete(event)
182
- proxies.delete(event)
183
- finalized_events << event unless event.respond_to?(:task)
184
- end
185
- def clear_finalized(tasks, events)
186
- tasks.each { |task| task.clear_vertex }
187
- @finalized_tasks = finalized_tasks - tasks
188
- events.each { |event| event.clear_vertex }
189
- @finalized_events = finalized_events - events
190
- end
191
- def removed_transaction(trsc)
192
- transactions.delete(trsc)
193
- end
194
- end
195
-
196
- class Plan::DRoby
197
- include LoggedPlan
198
- end
199
-
200
- class Distributed::Transaction::DRoby
201
- include LoggedPlan
202
- attr_writer :plan
203
- end
204
-
205
- module Log
206
- # This class rebuilds a plan-like structure from events saved by a
207
- # FileLogger object This is compatible with the EventStream data source
208
- class PlanRebuilder < DataDecoder
209
- attr_reader :plans
210
- attr_reader :tasks
211
- attr_reader :events
212
- attr_reader :last_finalized
213
- attr_reader :manager
214
-
215
- attr_reader :start_time
216
- attr_reader :time
217
- def initialize(name)
218
- @plans = ValueSet.new
219
- @tasks = ValueSet.new
220
- @events = ValueSet.new
221
- @manager = ObjectIDManager.new
222
- @last_finalized = Hash.new
223
- super(name)
224
- end
225
-
226
- def clear
227
- manager.clear
228
- super
229
-
230
- plans.dup.each { |p, _| p.clear if p.root_plan? }
231
- plans.clear
232
- tasks.clear
233
- events.clear
234
- @start_time = nil
235
- @time = nil
236
- end
237
-
238
- def rewind
239
- clear
240
- end
241
-
242
- # Processes one cycle worth of data coming from an EventStream, and
243
- # builds the corresponding plan representation
244
- #
245
- # It returns true if there was something noteworthy in there, and
246
- # false otherwise.
247
- def process(data)
248
- @time = data.last[0][:start]
249
- @start_time ||= @time
250
-
251
- done_something = false
252
- data.each_slice(4) do |m, sec, usec, args|
253
- time = Time.at(sec, usec)
254
- reason = catch :ignored do
255
- begin
256
- if respond_to?(m)
257
- send(m, time, *args)
258
- done_someting = true
259
- end
260
- displays.each do |d|
261
- if d.respond_to?(m)
262
- done_something = true
263
- d.send(m, time, *args)
264
- end
265
- end
266
- rescue Exception => e
267
- display_args = args.map do |obj|
268
- case obj
269
- when NilClass: 'nil'
270
- when Time: obj.to_hms
271
- when DRbObject: obj.inspect
272
- else (obj.to_s rescue "failed_to_s")
273
- end
274
- end
275
-
276
- raise e, "#{e.message} while serving #{m}(#{display_args.join(", ")})", e.backtrace
277
- end
278
- nil
279
- end
280
- if reason
281
- Roby.warn "Ignored #{m}(#{args.join(", ")}): #{reason}"
282
- end
283
- end
284
- done_something
285
- end
286
-
287
- def local_object(object)
288
- return nil unless object
289
-
290
- object = manager.local_object(object)
291
- plan = if block_given?
292
- yield
293
- elsif object.respond_to?(:transaction)
294
- local_plan(object.transaction, false)
295
- elsif object.respond_to?(:plan)
296
- local_plan(object.plan, false)
297
- end
298
-
299
- if plan
300
- object.plan = plan
301
- if object.respond_to?(:transaction)
302
- object.transaction = plan
303
- plan.proxies << object
304
- end
305
- end
306
-
307
- object
308
- end
309
-
310
- def clear_integrated
311
- updated = false
312
- plans.each do |plan|
313
- updated = !(plan.finalized_events.empty? && plan.finalized_tasks.empty?)
314
- plan.clear_finalized(plan.finalized_tasks.dup, plan.finalized_events.dup)
315
- end
316
-
317
- super_result = super
318
- super_result || updated
319
- end
320
-
321
- def local_plan(plan, allow_new = false)
322
- plan = manager.local_object(plan, plans.empty? || allow_new)
323
- plans << plan if plan
324
- plan
325
- end
326
- def local_task(task, &block)
327
- local_object(task, &block)
328
- end
329
- def local_event(event, &block)
330
- if event.respond_to?(:task)
331
- task = local_task(event.task, &block)
332
- if task.events[event.symbol]
333
- task.events[event.symbol]
334
- else
335
- event.task = task
336
- event.plan = task.plan
337
- task.events[event.symbol] = event
338
- end
339
- else
340
- local_object(event, &block)
341
- end
342
- end
343
-
344
- def inserted_tasks(time, plan, task)
345
- plan = local_plan(plan)
346
- plan.missions << task
347
- end
348
- def discarded_tasks(time, plan, task)
349
- plan = local_plan(plan)
350
- plan.missions.delete(task)
351
- end
352
- def replaced_tasks(time, plan, from, to)
353
- end
354
- def added_events(time, plan, events)
355
- plan = local_plan(plan)
356
- events.each do |ev|
357
- ev = local_event(ev) { plan }
358
- plan.free_events << ev
359
- end
360
- end
361
- def added_tasks(time, plan, tasks)
362
- plan = local_plan(plan)
363
- tasks.each do |t|
364
- t = local_task(t) { plan }
365
- plan.known_tasks << t
366
- end
367
- end
368
- def garbage_task(time, plan, task)
369
- end
370
- def finalized_event(time, plan, event)
371
- event = local_event(event)
372
- plan = local_plan(plan)
373
- unless event.respond_to?(:task)
374
- plan.finalized_event(event)
375
- manager.remove(event)
376
- end
377
- end
378
- def finalized_task(time, plan, task)
379
- task = local_task(task)
380
- plan = local_plan(plan)
381
- plan.finalized_task(task)
382
- manager.remove(task)
383
- end
384
- def added_transaction(time, plan, trsc)
385
- plan = local_plan(plan)
386
- trsc = local_plan(trsc, true)
387
- plan.transactions << trsc
388
- trsc.parent_plan = plan
389
- end
390
- def removed_transaction(time, plan, trsc)
391
- plan = local_plan(plan)
392
- trsc = local_plan(trsc)
393
-
394
- (trsc.known_tasks - plan.known_tasks).each do |obj|
395
- trsc.finalized_task(obj)
396
- manager.remove(obj)
397
- end
398
- (trsc.free_events - plan.free_events).each do |obj|
399
- trsc.finalized_event(obj)
400
- manager.remove(obj)
401
- end
402
- trsc.proxies.each do |p|
403
- manager.remove(p)
404
- end
405
-
406
- trsc.clear_finalized(trsc.finalized_tasks, trsc.finalized_events)
407
- plans.delete(trsc)
408
- manager.remove(trsc)
409
- plan.transactions.delete(trsc)
410
- end
411
-
412
- GENERATOR_TO_STATE = { :start => :started,
413
- :success => :success,
414
- :stop => :finished }
415
-
416
- def generator_fired(time, generator, id, ev_time, context)
417
- generator = local_event(generator)
418
- generator.instance_variable_set("@happened", true)
419
- if generator.respond_to?(:task) && (state = GENERATOR_TO_STATE[generator.symbol])
420
- generator.task.flags[state] = true
421
- end
422
- end
423
-
424
- def added_task_child(time, parent, rel, child, info)
425
- parent = local_task(parent)
426
- child = local_task(child)
427
- if !parent then throw :ignored, "unknown parent"
428
- elsif !child then throw :ignored, "unknown child"
429
- end
430
-
431
- rel = rel.first if rel.kind_of?(Array)
432
- rel = rel.proxy(nil)
433
- parent.add_child_object(child, rel, info)
434
- end
435
- def removed_task_child(time, parent, rel, child)
436
- parent = local_task(parent)
437
- child = local_task(child)
438
- rel = rel.first if rel.kind_of?(Array)
439
- rel = rel.proxy(nil)
440
- parent.remove_child_object(child, rel)
441
- end
442
- def added_event_child(time, parent, rel, child, info)
443
- parent = local_event(parent)
444
- child = local_event(child)
445
- rel = rel.first if rel.kind_of?(Array)
446
- rel = rel.proxy(nil)
447
- parent.add_child_object(child, rel, info)
448
- end
449
- def removed_event_child(time, parent, rel, child)
450
- parent = local_event(parent)
451
- child = local_event(child)
452
- rel = rel.first if rel.kind_of?(Array)
453
- rel = rel.proxy(nil)
454
- parent.remove_child_object(child, rel)
455
- end
456
- def added_owner(time, object, peer)
457
- object = local_object(object)
458
- object.owners << peer
459
- end
460
- def removed_owner(time, object, peer)
461
- object = local_object(object)
462
- object.owners.delete(peer)
463
- end
464
- end
465
-
466
- end
467
- end
468
-