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
@@ -0,0 +1,91 @@
1
+ require 'roby/schedulers/basic'
2
+ module Roby
3
+ module Schedulers
4
+ # The temporal scheduler adds to the decisions made by the Basic
5
+ # scheduler information given by the temporal constraint network.
6
+ #
7
+ # See the documentation of Roby::Schedulers for more information
8
+ class Temporal < Basic
9
+ # If true, the basic scheduler's constraints must be met for all
10
+ # tasks. If false, they are applied only on tasks for which no
11
+ # temporal constraints are set.
12
+ attr_predicate :basic_constraints?, true
13
+
14
+ # The proper graph object that contains the scheduling constraints
15
+ attr_reader :scheduling_constraints_graph
16
+
17
+ def initialize(with_basic = true, with_children = true, plan = nil)
18
+ super(with_children, plan)
19
+ @basic_constraints = with_basic
20
+ @scheduling_constraints_graph = self.plan.
21
+ event_relation_graph_for(EventStructure::SchedulingConstraints)
22
+ end
23
+
24
+ def can_schedule?(task, time = Time.now, stack = [])
25
+ if task.running?
26
+ return true
27
+ elsif !can_start?(task)
28
+ report_holdoff "cannot be started", task
29
+ return false
30
+ end
31
+
32
+ start_event = task.start_event
33
+
34
+ event_filter = lambda do |ev|
35
+ if ev.respond_to?(:task)
36
+ ev.task != task &&
37
+ !stack.include?(ev.task) &&
38
+ !scheduling_constraints_graph.related_tasks?(ev.task, task)
39
+ else true
40
+ end
41
+ end
42
+
43
+ meets_constraints = start_event.meets_temporal_constraints?(time, &event_filter)
44
+ if !meets_constraints
45
+ if failed_temporal = start_event.find_failed_temporal_constraint(time, &event_filter)
46
+ report_holdoff "temporal constraints not met (%2: %3)", task, failed_temporal[0], failed_temporal[1]
47
+ end
48
+ if failed_occurence = start_event.find_failed_occurence_constraint(true, &event_filter)
49
+ report_holdoff "occurence constraints not met (%2)", task, failed_occurence
50
+ end
51
+ return false
52
+ end
53
+
54
+ start_event.each_backward_scheduling_constraint do |parent|
55
+ begin
56
+ stack.push task
57
+ if !can_schedule?(parent.task, time, stack)
58
+ report_holdoff "held by a schedule_as constraint with %2", task, parent
59
+ return false
60
+ end
61
+ ensure
62
+ stack.pop
63
+ end
64
+ end
65
+
66
+ if basic_constraints?
67
+ if super
68
+ return true
69
+ else
70
+ # Special case: check in Dependency if there are some
71
+ # parents for which a forward constraint from +self+ to
72
+ # +parent.start_event+ exists. If it is the case, start
73
+ # the task
74
+ task.each_parent_task do |parent|
75
+ parent.start_event.each_backward_temporal_constraint do |constraint|
76
+ if constraint.respond_to?(:task) && constraint.task == task
77
+ Schedulers.debug { "Temporal: #{task} has no running parent, but a constraint from #{constraint} to #{parent}.start exists. Scheduling." }
78
+ return true
79
+ end
80
+ end
81
+ end
82
+ return false
83
+ end
84
+ else
85
+ return true
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
91
+
@@ -0,0 +1,87 @@
1
+ module Roby
2
+ @state = Roby::StateSpace.new
3
+ @conf = Roby::ConfModel.new
4
+
5
+ class << self
6
+ # The one and only Application object
7
+ def app
8
+ @app ||= Application.new
9
+ end
10
+
11
+ # The one and only StateSpace object
12
+ attr_reader :state
13
+
14
+ # The one and only ConfModel object
15
+ attr_reader :conf
16
+
17
+ # The main plan
18
+ #
19
+ # It is always the same as Roby.app.plan
20
+ #
21
+ # @return [Plan]
22
+ def plan; app.plan end
23
+
24
+ # The main execution engine
25
+ #
26
+ # It is always the same as Roby.plan.execution_engine
27
+ #
28
+ # Note that it is nil until the Roby application is configured
29
+ #
30
+ # @return [ExecutionEngine]
31
+ def execution_engine
32
+ app.execution_engine
33
+ end
34
+
35
+ # The main scheduler
36
+ #
37
+ # It is always the same as Roby.plan.execution_engine.scheduler
38
+ def scheduler
39
+ app.plan.execution_engine.scheduler
40
+ end
41
+
42
+ # Sets the main scheduler
43
+ #
44
+ # It is always the same as Roby.plan.execution_engine.scheduler
45
+ def scheduler=(scheduler)
46
+ app.plan.execution_engine.scheduler = scheduler
47
+ end
48
+
49
+ # The control / policy object
50
+ #
51
+ # This is the object that defines the core execution policies (e.g. what
52
+ # to do if the dependency of a non-running task stops). See
53
+ # {DecisionControl}
54
+ def control
55
+ app.plan.execution_engine.control
56
+ end
57
+
58
+ # Sets the control / policy object
59
+ #
60
+ # This is the object that defines the core execution policies (e.g. what
61
+ # to do if the dependency of a non-running task stops). See
62
+ # {DecisionControl}
63
+ def control(object)
64
+ app.plan.execution_engine.control = object
65
+ end
66
+
67
+ # @deprecated use {Roby.execution_engine} instead
68
+ def engine
69
+ Roby.warn_deprecated "Roby.engine is deprecated, use Roby.execution_engine instead"
70
+ app.execution_engine
71
+ end
72
+ end
73
+
74
+ # Defines a global exception handler on the main plan.
75
+ # See also Plan#on_exception
76
+ def self.on_exception(matcher, &handler); Roby.app.plan.on_exception(matcher, &handler) end
77
+
78
+ # The main state object
79
+ State = Roby.state
80
+ # The main configuration object
81
+ Conf = Roby.conf
82
+ end
83
+
84
+ # The main state object
85
+ State = Roby.state
86
+ # The main configuration object
87
+ Conf = Roby.conf
@@ -1,4 +1,6 @@
1
1
  require 'roby'
2
- Dir.chdir(APP_DIR)
3
- Roby.app.setup_global_singletons
2
+ if defined? APP_DIR
3
+ Dir.chdir(APP_DIR)
4
+ end
5
+ Roby.app.base_setup
4
6
 
@@ -1,49 +1,134 @@
1
+ class Exception
2
+ # Create a {Queries::CodeErrorMatcher} object that matches this exception
3
+ #
4
+ # @return [Queries::CodeErrorMatcher]
5
+ def self.match
6
+ Roby::CodeError.match.with_ruby_exception(self)
7
+ end
8
+
9
+ def self.to_execution_exception_matcher
10
+ match.to_execution_exception_matcher
11
+ end
12
+
13
+ def pretty_print(pp)
14
+ pp.text "#{message} (#{self.class.name})"
15
+ end
16
+
17
+ # True if +obj+ is involved in this error
18
+ def involved_plan_object?(obj)
19
+ false
20
+ end
21
+
22
+ def user_error?; false end
23
+ end
24
+
1
25
  module Roby
26
+ # Exception base used for all errors that show an inconsistency inside Roby
27
+ # itself
28
+ class InternalError < RuntimeError; end
29
+
30
+ # Exception raised if an object is not droby-marshallable in a place where
31
+ # one is required
32
+ class NotMarshallable < ArgumentError
33
+ end
34
+
35
+ # Module used to tag exceptions that "wrap" an original error from the user
36
+ # code
37
+ #
38
+ # All such exceptions must give access to the original error by defining an
39
+ # original_exceptions accessor
40
+ module UserExceptionWrapper; end
41
+
42
+ # Base class for all Roby exceptions
43
+ class ExceptionBase < RuntimeError
44
+ # List of Exception objects that caused this
45
+ #
46
+ # @return [Array<Exception>]
47
+ attr_accessor :original_exceptions
48
+
49
+ def initialize(exceptions = Array.new)
50
+ @original_exceptions = exceptions
51
+ end
52
+
53
+ def each_original_exception(&block)
54
+ @original_exceptions.each(&block)
55
+ end
56
+
57
+ def report_exceptions_from(object)
58
+ if object.kind_of?(Exception)
59
+ original_exceptions << object
60
+ elsif object.respond_to?(:report_exceptions_on)
61
+ object.report_exceptions_on(self)
62
+ elsif object.respond_to?(:context) && object.context
63
+ object.context.each do |c|
64
+ report_exceptions_from(c)
65
+ end
66
+ elsif object.respond_to?(:failure_reason)
67
+ report_exceptions_from(object.failure_reason)
68
+ end
69
+ end
70
+ end
71
+
2
72
  # This kind of errors are generated during the plan execution, allowing to
3
73
  # blame a fault on a plan object (#failure_point). The precise failure
4
74
  # point is categorized in the #failed_event, #failed_generator and
5
75
  # #failed_task. It is guaranteed that one of #failed_generator and
6
76
  # #failed_task is non-nil.
7
- class LocalizedError < RuntimeError
77
+ class LocalizedError < ExceptionBase
78
+ # If true, such an exception causes the execution engine to stop tasks
79
+ # in the hierarchy. Otherwise, it only causes notification(s).
80
+ def fatal?; true end
81
+ # If true, such an exception will be propagated in the plan dependency
82
+ # structure. Otherwise, it's directly reported to the plan itself (which
83
+ # can choose to handle it).
84
+ #
85
+ # This is usually set to false for exceptions that report global
86
+ # information about the plan, such as e.g. MissionFailedError
87
+ def propagated?; true end
8
88
  # The object describing the point of failure
9
- attr_reader :failure_point
89
+ attr_reader :failure_point
10
90
 
11
91
  # The objects of the given categories which are related to #failure_point
12
92
  attr_reader :failed_event, :failed_generator, :failed_task
13
93
 
14
94
  # Create a LocalizedError object with the given failure point
15
95
  def initialize(failure_point)
16
- @failure_point = failure_point
17
- if failure_point.kind_of?(Event)
18
- @failed_event = failure_point
19
- @failed_generator = failure_point.generator
20
- elsif failure_point.kind_of?(EventGenerator)
21
- @failed_generator = failure_point
22
- elsif failure_point.kind_of?(Task)
23
- @failed_task = failure_point
24
- end
25
-
26
- if !@failed_task && @failed_generator && @failed_generator.respond_to?(:task)
27
- @failed_task = failed_generator.task
28
- end
29
- if !@failed_task && !@failed_generator
30
- raise ArgumentError, "cannot deduce a task and/or a generator from #{failure_point}"
31
- end
32
-
33
- super("")
34
- end
96
+ super()
97
+ @failure_point = failure_point
98
+
99
+ @failed_task, @failed_event, @failed_generator = nil
100
+ if failure_point.kind_of?(Event)
101
+ @failed_event = failure_point
102
+ @failed_generator = failure_point.generator
103
+ elsif failure_point.kind_of?(EventGenerator)
104
+ @failed_generator = failure_point
105
+ elsif failure_point.kind_of?(Task)
106
+ @failed_task = failure_point
107
+ end
108
+
109
+ if !@failed_task && @failed_generator && @failed_generator.respond_to?(:task)
110
+ @failed_task = failed_generator.task
111
+ end
112
+ if !@failed_task && !@failed_generator
113
+ raise ArgumentError, "cannot deduce a task and/or a generator from #{failure_point}"
114
+ end
115
+
116
+ if failed_event
117
+ failed_event.protect_all_sources
118
+ end
119
+ end
120
+
121
+ def to_execution_exception
122
+ ExecutionException.new(self)
123
+ end
35
124
 
36
125
  def pretty_print(pp)
37
- pp.text "#{self.class.name}"
126
+ pp.text "#{self.class.name}"
38
127
  if !message.empty?
39
128
  pp.text ": #{message}"
40
129
  end
41
130
  pp.breakable
42
131
  failure_point.pretty_print(pp)
43
-
44
- if backtrace && !backtrace.empty?
45
- Roby.pretty_print_backtrace(pp, backtrace)
46
- end
47
132
  end
48
133
 
49
134
  # True if +obj+ is involved in this error
@@ -53,17 +138,103 @@ def involved_plan_object?(obj)
53
138
  obj == failed_generator ||
54
139
  obj == failed_task)
55
140
  end
141
+
142
+ # @return [Queries::ExecutionExceptionMatcher]
143
+ def self.to_execution_exception_matcher
144
+ Roby::Queries::ExecutionExceptionMatcher.new.with_model(self)
145
+ end
146
+
147
+ # Create a {Queries::LocalizedErrorMatcher} that matches this exception
148
+ #
149
+ # @return [Queries::LocalizedErrorMatcher]
150
+ def self.match
151
+ Roby::Queries::LocalizedErrorMatcher.new.with_model(self)
152
+ end
153
+ end
154
+
155
+ class RelationFailedError < LocalizedError
156
+ # The parent in the failed relation
157
+ attr_reader :parent
56
158
  end
57
159
 
160
+
161
+ # Exception raises when attempting to add relations to a
162
+ # garbaged-but-not-finalized task
163
+ class ReusingGarbage < RuntimeError; end
164
+ # Exception class used when trying to perform an operation on a finalized
165
+ # object and the operation requires a plan
166
+ class FinalizedPlanObject < RuntimeError; end
58
167
  # Raised during event propagation if a task event is called or emitted,
59
168
  # while this task is not executable.
60
169
  class TaskNotExecutable < LocalizedError; end
61
170
  # Raised during event propagation if an event is called or emitted,
62
171
  # while this event is not executable.
63
172
  class EventNotExecutable < LocalizedError; end
64
- # Raised during event propagation if an event is called, while this event
65
- # is not controlable.
66
- class EventNotControlable < LocalizedError; end
173
+ # Same error than EventNotExecutable, but for task events
174
+ #
175
+ # The only difference is that this method displays some task-specific
176
+ # information
177
+ class TaskEventNotExecutable < EventNotExecutable
178
+ def initialize(failure_point)
179
+ super(failure_point)
180
+ if !(@plan = failed_generator.task.plan)
181
+ @removed_at = failed_generator.task.removed_at
182
+ end
183
+ end
184
+
185
+ def plan; @plan end
186
+ def removed_at; @removed_at end
187
+
188
+ def pretty_print(pp)
189
+ pp.text "#{failed_generator.symbol} called but it is not executable on"
190
+ pp.breakable
191
+ failed_generator.task.pretty_print(pp)
192
+ pp.breakable
193
+ if plan
194
+ pp.text "the task has NOT been garbage collected"
195
+ elsif removed_at
196
+ pp.text "#{failed_generator.task} has been removed from its plan at"
197
+ removed_at.each do |line|
198
+ pp.breakable
199
+ pp.text " #{line}"
200
+ end
201
+ else
202
+ pp.text "the task has never been included in a plan"
203
+ end
204
+ end
205
+ end
206
+ # Raised when an error occurs on a task while we were terminating it
207
+ class TaskEmergencyTermination < LocalizedError
208
+ attr_reader :reason
209
+
210
+ def quarantined?
211
+ !!@quarantined
212
+ end
213
+
214
+ def initialize(task, reason, quarantined = false)
215
+ super(task)
216
+
217
+ @quarantined = quarantined
218
+ @reason = reason
219
+ report_exceptions_from(reason)
220
+ end
221
+
222
+ def pretty_print(pp)
223
+ pp.text "The following task is being terminated because of an internal error"
224
+ pp.breakable
225
+ if quarantined?
226
+ pp.text "It has been put under quarantine"
227
+ else
228
+ pp.text "It is not yet put under quarantine"
229
+ end
230
+ pp.breakable
231
+ super
232
+ pp.breakable
233
+ if !original_exceptions.include?(reason)
234
+ reason.pretty_print(pp)
235
+ end
236
+ end
237
+ end
67
238
 
68
239
  # Raised when an operation is attempted while the ownership does not allow
69
240
  # it.
@@ -89,33 +260,54 @@ class ThreadMismatch < RuntimeError; end
89
260
  # outside of Roby's plan management algorithms) has raised. This includes:
90
261
  # event commands, event handlers, task polling blocks, ...
91
262
  class CodeError < LocalizedError
263
+ include UserExceptionWrapper
264
+
92
265
  # The original exception object
93
- attr_reader :error
266
+ def original_exception; original_exceptions.first end
267
+ # @deprecated use {#original_exception} instead
268
+ def error; original_exception end
94
269
  # Create a CodeError object from the given original exception object, and
95
270
  # with the given failure point
96
- def initialize(error, *args)
97
- if error && !error.kind_of?(Exception)
98
- raise TypeError, "#{error} should be an exception"
99
- end
100
- super(*args)
101
- @error = error
102
- end
103
-
104
- def pretty_print(pp) # :nodoc:
105
- if error
106
- pp.text "#{self.class.name}: user code raised an exception "
107
- failure_point.pretty_print(pp)
108
- pp.breakable
109
- pp.breakable
110
- error.pretty_print(pp)
111
- else
112
- super
113
- end
114
- end
271
+ def initialize(error, *args)
272
+ if error && !error.kind_of?(Exception)
273
+ raise TypeError, "#{error} should be an exception"
274
+ end
275
+ super(*args)
276
+ report_exceptions_from(error)
277
+ end
278
+
279
+ def pretty_print(pp)
280
+ pp.text "#{self.class.name}: user code raised an exception "
281
+ failure_point.pretty_print(pp)
282
+ end
283
+
284
+ # Create a {Queries::CodeErrorMatcher} that matches this exception
285
+ #
286
+ # @return [Queries::CodeErrorMatcher]
287
+ def self.match
288
+ Roby::Queries::CodeErrorMatcher.new.with_model(self)
289
+ end
115
290
  end
116
291
 
292
+ # Raised when a command is being processed, but it cannot be (e.g. because
293
+ # of task state)
294
+ class CommandRejected < LocalizedError; end
295
+
296
+ # Raised when an event's emission has being requested, but it cannot be
297
+ # (e.g. because of task state)
298
+ class EmissionRejected < LocalizedError; end
299
+
117
300
  # Raised if a command block has raised an exception
118
- class CommandFailed < CodeError; end
301
+ class CommandFailed < CodeError
302
+ def pretty_print(pp)
303
+ pp.text "uncaught exception in the command of the "
304
+ failed_generator.pretty_print(pp)
305
+ pp.text " (#{self.class})"
306
+ end
307
+ end
308
+ # Raised during event propagation if an event is called, while this event
309
+ # is not controlable.
310
+ class EventNotControlable < LocalizedError; end
119
311
  # Raised when the call of an event has been canceled.
120
312
  # See EventGenerator#cancel.
121
313
  class EventCanceled < LocalizedError; end
@@ -124,17 +316,48 @@ class EventCanceled < LocalizedError; end
124
316
  class EventPreconditionFailed < LocalizedError; end
125
317
  # Raised when the emission of an event has failed.
126
318
  # See EventGenerator#emit_failed.
127
- class EmissionFailed < CodeError; end
319
+ class EmissionFailed < CodeError
320
+ def initialize(*args, &block)
321
+ super
322
+ if !failed_generator
323
+ raise ArgumentError, "creating an EmissionFailed error without a generator"
324
+ end
325
+ end
326
+
327
+ def pretty_print(pp) # :nodoc:
328
+ pp.text "failed emission of the "
329
+ failed_generator.pretty_print(pp)
330
+ pp.text " (#{self.class})"
331
+ end
332
+ end
128
333
  # Raised when an event handler has raised.
129
- class EventHandlerError < CodeError; end
334
+ class EventHandlerError < CodeError
335
+ def pretty_print(pp)
336
+ pp.text "uncaught exception in an event handler of the "
337
+ failed_generator.pretty_print(pp)
338
+ pp.text " (#{self.class})"
339
+ pp.breakable
340
+ pp.text "called during the propagation of "
341
+ failed_event.pretty_print(pp)
342
+ end
343
+ end
130
344
 
131
345
  # Raised when an exception handler has raised.
132
346
  class FailedExceptionHandler < CodeError
133
- attr_reader :handled_exception
134
- def initialize(error, object, handled_exception)
135
- super(error, object)
136
- @handled_exception = handled_exception
137
- end
347
+ attr_reader :handled_exception
348
+ attr_reader :handler
349
+
350
+ def initialize(error, object, handled_exception, handler)
351
+ super(error, object)
352
+ @handled_exception = handled_exception
353
+ @handler = handler
354
+ end
355
+
356
+ def pretty_print(pp)
357
+ pp.text "exception handler #{handler} failed while processing"
358
+ pp.breakable
359
+ handled_exception.pretty_print(pp)
360
+ end
138
361
  end
139
362
 
140
363
  # Raised when an event has become unreachable while other parts of the plan
@@ -146,38 +369,31 @@ class UnreachableEvent < LocalizedError
146
369
  # Create an UnreachableEvent error for the given +generator+. +reason+
147
370
  # is supposed to be either nil or a plan object which is the reason why
148
371
  # +generator+ has become unreachable.
149
- def initialize(generator, reason)
372
+ def initialize(generator, reason)
373
+ super(generator)
150
374
  @reason = reason
151
- super(generator)
152
- end
375
+ report_exceptions_from(reason)
376
+ end
153
377
 
154
- def pretty_print(pp) # :nodoc:
378
+ def pretty_print(pp) # :nodoc:
155
379
  pp.text "#{failed_generator} has become unreachable"
156
- if reason
380
+ if reason
157
381
  reason = [*reason]
158
382
  reason.each do |e|
159
383
  pp.breakable
160
384
  e.pretty_print(pp)
161
385
  end
162
386
  end
163
- end
387
+ end
164
388
  end
165
389
 
166
390
  # Exception raised when the event loop aborts because of an unhandled
167
391
  # exception
168
- class Aborting < RuntimeError
169
- attr_reader :all_exceptions
170
- def initialize(exceptions)
171
- @all_exceptions = exceptions
172
- super("")
173
- end
392
+ class Aborting < ExceptionBase
174
393
  def pretty_print(pp) # :nodoc:
175
394
  pp.text "control loop aborting because of unhandled exceptions"
176
- pp.seplist(",") do
177
- all_exceptions.pretty_print(pp)
178
- end
179
395
  end
180
- def backtrace # :nodoc:
396
+ def backtrace # :nodoc:
181
397
  []
182
398
  end
183
399
  end
@@ -185,14 +401,14 @@ def backtrace # :nodoc:
185
401
  # Raised by Plan#replace when the new task cannot replace the older one.
186
402
  class InvalidReplace < RuntimeError
187
403
  # The task being replaced
188
- attr_reader :from
404
+ attr_reader :from
189
405
  # The task which should have replaced #from
190
406
  attr_reader :to
191
407
 
192
408
  # Create a new InvalidReplace object
193
- def initialize(from, to)
194
- @from, @to = from, to
195
- end
409
+ def initialize(from, to)
410
+ @from, @to = from, to
411
+ end
196
412
  def pretty_print(pp) # :nodoc:
197
413
  pp.text "invalid replacement: #{message}"
198
414
  pp.breakable
@@ -205,20 +421,127 @@ def pretty_print(pp) # :nodoc:
205
421
  end
206
422
 
207
423
  # Exception raised when a mission has failed
208
- class MissionFailedError < LocalizedError
424
+ class ToplevelTaskError < LocalizedError
425
+ include UserExceptionWrapper
426
+
427
+ attr_reader :reason
428
+
429
+ def propagated?; false end
430
+
209
431
  # Create a new MissionFailedError for the given mission
210
- def initialize(task)
211
- super(task.failure_event || task)
212
- end
432
+ def initialize(task, reason = nil)
433
+ super(task.failure_event || task)
434
+ @reason = reason || task.failure_reason
435
+ report_exceptions_from(@reason)
436
+ end
437
+
438
+ def pretty_print(pp)
439
+ if reason
440
+ reason.pretty_print(pp)
441
+ elsif failed_event
442
+ failed_event.pretty_print(pp)
443
+ else
444
+ explanation = :success.to_unbound_task_predicate.explain_static(failed_task)
445
+ explanation.pretty_print(pp)
446
+ end
447
+ end
448
+ end
213
449
 
450
+ # Exception raised when a mission has failed
451
+ class MissionFailedError < ToplevelTaskError
214
452
  def pretty_print(pp)
215
453
  pp.text "mission failed: "
216
- super
454
+ failed_task.pretty_print(pp)
455
+ pp.breakable
456
+ super(pp)
457
+ end
458
+ end
459
+
460
+ # Exception raised when a permanent task has failed
461
+ class PermanentTaskError < ToplevelTaskError
462
+ def fatal?; false end
463
+ def pretty_print(pp)
464
+ pp.text "permanent task failed: "
465
+ failed_task.pretty_print(pp)
466
+ pp.breakable
467
+ super(pp)
217
468
  end
218
469
  end
219
470
 
220
471
  # Exception raised in threads which are waiting for the control thread
221
472
  # See for instance Roby.execute
222
473
  class ExecutionQuitError < RuntimeError; end
474
+
475
+ # Exception raised when a child is being resolved by role, but the role is
476
+ # not associated with any child
477
+ class NoSuchChild < ArgumentError
478
+ # @return [Object] the object whose children we try to access
479
+ attr_reader :object
480
+ # @return [String] the role that failed to be resolved
481
+ attr_reader :role
482
+ # @return [{String=>Object}] the set of known children
483
+ attr_reader :known_children
484
+
485
+ def initialize(object, role, known_children)
486
+ @object, @role, @known_children = object, role, known_children
487
+ end
488
+
489
+ def pretty_print(pp)
490
+ pp.text "#{object} has no child with the role '#{role}'"
491
+
492
+ if known_children.empty?
493
+ pp.text ", actually, it has no child at all"
494
+ else
495
+ pp.text ". Known children:"
496
+ pp.nest(2) do
497
+ known_children.each do |role, child|
498
+ pp.breakable
499
+ pp.text "#{role}: #{child}"
500
+ end
501
+ end
502
+ end
503
+ end
504
+ end
505
+
506
+ # Exception raised when a finished task has a promise attached, or when one
507
+ # attempts to create one on a finished task
508
+ class PromiseInFinishedTask < RuntimeError; end
509
+
510
+ # Exception used when a state transition fails within an action state
511
+ # machine
512
+ class ActionStateTransitionFailed < LocalizedError
513
+ # The state that we're transitioning out of
514
+ # @return [Coordination::Task]
515
+ attr_reader :from_state
516
+ # The event that caused the transition
517
+ # @return [Event]
518
+ attr_reader :event
519
+ # The state that we were transitioning into
520
+ # @return [Coordination::Task]
521
+ attr_reader :to_state
522
+
523
+ def initialize(root_task, from_state, event, to_state, original_exception)
524
+ super(root_task)
525
+ @from_state = from_state
526
+ @event = event
527
+ @to_state = to_state
528
+ report_exceptions_from(original_exception)
529
+ end
530
+
531
+ def pretty_print(pp)
532
+ pp.text "#{failed_task} failed a state transition"
533
+ pp.nest(2) do
534
+ pp.breakable
535
+ pp.text "from state "
536
+ pp.nest(2) { from_state.pretty_print(pp) }
537
+ pp.breakable
538
+ pp.text "to state "
539
+ pp.nest(2) { to_state.pretty_print(pp) }
540
+ pp.breakable
541
+ pp.text "caused by event "
542
+ pp.nest(2) { event.pretty_print(pp) }
543
+ end
544
+ end
545
+ end
223
546
  end
224
547