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,7 +0,0 @@
1
- module Roby::EventStructure
2
- relation :Signal, :noinfo => true
3
- relation :Forwarding, :noinfo => true
4
- relation :CausalLink, :subsets => [Signal, Forwarding], :noinfo => true
5
- relation :Precedence, :subsets => [CausalLink], :noinfo => true
6
- end
7
-
@@ -1,208 +0,0 @@
1
- module Roby::TaskStructure
2
- # This module defines model-level definition of execution agent, for
3
- # instance to Roby::Task
4
- module ModelLevelExecutionAgent
5
- # The model of execution agent for this class
6
- def execution_agent
7
- for klass in ancestors
8
- if klass.instance_variable_defined?(:@execution_agent)
9
- return klass.instance_variable_get(:@execution_agent)
10
- end
11
- end
12
- nil
13
- end
14
-
15
- # Defines a model of execution agent. Doing
16
- #
17
- # TaskModel.executed_by ExecutionAgentModel
18
- #
19
- # is equivalent to
20
- #
21
- # task = TaskModel.new
22
- # exec = <find a suitable ExecutionAgentModel instance in the plan or
23
- # create a new one>
24
- # task.executed_by exec
25
- #
26
- # for all instances of TaskModel. The actual job is done in the
27
- # ExecutionAgentSpawn module
28
- def executed_by(agent_model, arguments = Hash.new)
29
- @execution_agent = [agent_model, arguments]
30
- end
31
- end
32
-
33
- # The execution_agent defines an agent (process or otherwise) a given
34
- # task is executed by. It allows to define a class of these execution agent,
35
- # so that the specific agents are managed externally (load-balancing, ...)
36
- relation :ExecutionAgent, :parent_name => :executed_task, :child_name => :execution_agent,
37
- :noinfo => true, :distribute => false, :single_child => true do
38
-
39
- # When ExecutionAgent support is included in a model (for instance Roby::Task), add
40
- # the model-level classes
41
- def self.included(klass) # :nodoc:
42
- klass.extend Roby::TaskStructure::ModelLevelExecutionAgent
43
- super
44
- end
45
-
46
- # Defines a new execution agent for this task.
47
- def executed_by(agent)
48
- return if execution_agent == agent
49
- if !agent.event(:start).controlable? && !agent.running?
50
- raise ArgumentError, "the start event of #{self}'s execution agent #{agent} is not controlable"
51
- end
52
- # Check that agent defines the :ready event
53
- if !agent.has_event?(:ready)
54
- raise ArgumentError, "execution agent tasks should define the :ready event"
55
- end
56
-
57
- old_agent = execution_agent
58
- if old_agent && old_agent != agent
59
- Roby.debug "an agent is already defined for this task"
60
- remove_execution_agent old_agent
61
- end
62
-
63
- unless old_agent
64
- # If the task did have an agent already, these event handlers
65
- # are already set up
66
- if running?
67
- Roby::Distributed.update(self) do
68
- agent.forward_to(:stop, self, :aborted)
69
- end
70
- else
71
- on(:start) do
72
- # The event handler will be called even if the
73
- # execution agent has been removed. Check that there is
74
- # actually an execution agent
75
- if execution_agent
76
- Roby::Distributed.update(self) do
77
- execution_agent.forward_to(:stop, self, :aborted)
78
- end
79
- end
80
- end
81
- end
82
-
83
- on(:stop) do
84
- if execution_agent
85
- Roby::Distributed.update(self) do
86
- execution_agent.event(:stop).remove_forwarding event(:aborted)
87
- remove_execution_agent execution_agent
88
- end
89
- end
90
- end
91
- end
92
-
93
- add_execution_agent(agent)
94
- end
95
-
96
- end
97
-
98
- class ExecutionAgentSpawningFailed < Roby::LocalizedError
99
- attr_reader :agent_model, :error
100
- def initialize(task, agent_model, error)
101
- super(task)
102
- @agent_model, @error = agent_model, error
103
- end
104
- end
105
-
106
- # Add a suitable execution agent to +task+ if its model has a execution
107
- # agent model (see ModelLevelExecutionAgent), either by reusing one
108
- # that is already in the plan, or by creating a new one.
109
- def ExecutionAgent.spawn(task)
110
- agent_model, arguments = task.model.execution_agent
111
- candidates = task.plan.find_tasks.
112
- with_model(agent_model).
113
- with_arguments(arguments).
114
- self_owned.
115
- not_finished
116
-
117
- agent = nil
118
-
119
- if candidates.empty?
120
- begin
121
- agent = agent_model.new(arguments)
122
- agent.on(:stop) do
123
- agent.each_executed_task do |task|
124
- if task.running?
125
- task.emit(:aborted, "execution agent #{self} failed")
126
- elsif task.pending?
127
- task.remove_execution_agent agent
128
- spawn(task)
129
- end
130
- end
131
- end
132
- rescue Exception => e
133
- task.plan.engine.add_error(ExecutionAgentSpawningFailed.new(task, agent_model, e))
134
- end
135
- else
136
- running, pending = candidates.partition { |t| t.running? }
137
- agent = if running.empty? then pending.first
138
- else running.first
139
- end
140
- end
141
- task.executed_by agent
142
- agent
143
- end
144
-
145
- # This module is hooked in Roby::TaskEventGenerator to check that a task
146
- # which is being started has a suitable execution agent, and to start it if
147
- # it's not the case
148
- module ExecutionAgentStart
149
- def calling(context)
150
- super if defined? super
151
- return unless symbol == :start
152
-
153
- agent = task.execution_agent
154
- if !agent
155
- if task.model.execution_agent
156
- raise CommandFailed.new(nil, self), "the model of #{task} requires an execution agent, but the task has none"
157
- else
158
- return
159
- end
160
- end
161
-
162
- # Check that the agent matches the model
163
- agent_model, arguments = task.model.execution_agent
164
- if agent_model
165
- if !agent.fullfills?(agent_model, arguments)
166
- raise CommandFailed.new(nil, self), "the execution agent #{agent} does not match the required model #{agent_model}, #{arguments}"
167
- end
168
- end
169
-
170
- if agent.finished? || agent.finishing?
171
- raise CommandFailed.new(nil, self), "task #{task} has an execution agent but it is dead"
172
- elsif !agent.event(:ready).happened? && !agent.depends_on?(task)
173
- postpone(agent.event(:ready), "spawning execution agent #{agent} for #{self}") do
174
- if agent.pending?
175
- agent.event(:ready).if_unreachable(true) do |reason|
176
- self.emit_failed "execution agent #{agent} failed to initialize: #{reason}"
177
- end
178
- agent.start!
179
- end
180
- end
181
- end
182
- end
183
- end
184
- Roby::TaskEventGenerator.include ExecutionAgentStart
185
-
186
- # This module is included in Roby::Plan to automatically add execution agents
187
- # to tasks that require it and are discovered in the executable plan.
188
- module ExecutionAgentSpawn
189
- # Hook into plan discovery to add execution agents to new tasks.
190
- # See ExecutionAgentSpawn.spawn
191
- def added_tasks(tasks)
192
- # For now, settle on adding the execution agents only in the
193
- # main plan. Otherwise, it is possible that two transactions
194
- # will try to add two different agents
195
- #
196
- # Note that it would be solved by plan merging ...
197
- return unless executable?
198
-
199
- for task in tasks
200
- if !task.execution_agent && task.model.execution_agent && task.self_owned?
201
- ExecutionAgent.spawn(task)
202
- end
203
- end
204
- end
205
- end
206
- Roby::Plan.include ExecutionAgentSpawn
207
- end
208
-
@@ -1,10 +0,0 @@
1
- module Roby
2
- module TaskStructure
3
- relation :Influence, :child_name => 'influenced_task', :noinfo => true, :weak => true do
4
- def influenced_by(task)
5
- add_influenced_task(task)
6
- end
7
- end
8
- end
9
- end
10
-
@@ -1,63 +0,0 @@
1
- module Roby::TaskStructure
2
- relation :PlannedBy, :child_name => :planning_task,
3
- :parent_name => :planned_task, :noinfo => true, :single_child => true do
4
-
5
- # The set of tasks which are planned by this one
6
- def planned_tasks; parent_objects(PlannedBy) end
7
- # Set +task+ as the planning task of +self+
8
- def planned_by(task, options = {})
9
- if old = planning_task
10
- if options[:replace]
11
- remove_planning_task(old)
12
- else
13
- raise ArgumentError, "this task already has a planner"
14
- end
15
- end
16
- add_planning_task(task)
17
- end
18
- end
19
-
20
- # Returns a set of PlanningFailedError exceptions for all abstract tasks
21
- # for which planning has failed
22
- def PlannedBy.check_structure(plan)
23
- result = []
24
- Roby::TaskStructure::PlannedBy.each_edge do |planned_task, planning_task, _|
25
- next unless plan == planning_task.plan && planning_task.failed?
26
- next unless planned_task.pending? && !planned_task.executable? && planned_task.self_owned?
27
- result << Roby::PlanningFailedError.new(planned_task, planning_task)
28
- end
29
-
30
- result
31
- end
32
- end
33
-
34
- module Roby
35
- # This exception is raised when a task is abstract, and its planner failed:
36
- # the system will therefore not have a suitable executable development for
37
- # this task, and this is a failure
38
- class PlanningFailedError < LocalizedError
39
- # The planning task
40
- attr_reader :planned_task
41
-
42
- def initialize(planned_task, planning_task)
43
- @planned_task = planned_task
44
- super(planning_task.failure_event)
45
- end
46
- def pretty_print(pp)
47
- pp.text "failed to plan "
48
- planned_task.pretty_print(pp)
49
- pp.breakable
50
- pp.breakable
51
- pp.text "the following planning task failed with the #{failure_point.symbol} event"
52
- pp.breakable
53
- failed_task.pretty_print(pp)
54
- pp.breakable
55
-
56
- if failure_point.context
57
- pp.breakable
58
- failure_point.context.first.pretty_print(pp)
59
- end
60
- end
61
- end
62
- end
63
-
@@ -1,55 +0,0 @@
1
- module Distributions
2
- class Gaussian
3
- attr_reader :mean, :dev
4
- def initialize(mean, dev)
5
- @mean, @dev = mean, dev
6
- end
7
- end
8
- end
9
-
10
- module Roby
11
- # A TimeDistribution object describes the evolution of a
12
- # value object w.r.t. time. Time can be described by absolute
13
- # values using Time objects or w.r.t. the plan by using
14
- # EventGenerator objects
15
- class TimeDistribution
16
- attr_reader :info
17
- def initialize(info)
18
- @info = info
19
- @timepoints = Array.new
20
- end
21
-
22
- # Set the predicted value of the distribution at +event+
23
- def set_value(event, value)
24
- @timepoints << [event, :set_value, value]
25
- end
26
-
27
- # Set a decay function which is valid from +event+
28
- def set_decay(event, decay)
29
- @timepoints << [event, :set_decay, decay]
30
- end
31
-
32
- # Set the knowledge value for the distribution at +event+
33
- # For now, the only valid values are 0 (nothing known)
34
- # and 1 (perfectly known)
35
- def set_knowledge(event, value = 1.0)
36
- @timepoints << [event, :set_knowledge, value]
37
- end
38
- end
39
-
40
- class Task < PlanObject
41
- inherited_enumerable(:needed_information) { Array.new }
42
- inherited_enumerable(:improved_information) { Array.new }
43
-
44
- # This task is influenced by the information contained in +info+
45
- def self.needs(info); needed_information << info end
46
- def self.needs?(info); enum_for(:each_needed_information).any? { |i| info === i } end
47
- def needs?(info); self.model.needs?(info) end
48
-
49
- # This task will improve the information contained in +info+
50
- def self.improves(info); improved_information << info end
51
- def self.improves?(info); enum_for(:each_improved_information).any? { |i| info === i } end
52
- def improves?(info); self.model.improves?(info) end
53
- end
54
- end
55
-
@@ -1,367 +0,0 @@
1
- module Roby
2
- # ExtendedStruct objects are OpenStructs where attributes have a default
3
- # class. They are used to build hierarchical data structure on-the-fly
4
- #
5
- # For instance
6
- # root = ExtendedStruct.new
7
- # root.child.value = 42
8
- #
9
- # However, you *cannot* check if a value is defined or not with
10
- # if (root.child)
11
- # <do something>
12
- # end
13
- #
14
- # You'll have to test with respond_to? or #{name}?. The second one will
15
- # return true only if the attribute is defined <b>and</b> it is not false
16
- # if (root.respond_to?(:child)
17
- # <do something>
18
- # end
19
- #
20
- # == Handling of methods defined on parents
21
- #
22
- # Methods defined in Object or Kernel are automatically overriden if needed.
23
- # For instance, if you're managing a (x, y, z) position using ExtendedStruct,
24
- # you will want YAML#y to *not* get in the way. The exceptions are the methods
25
- # listed in NOT_OVERRIDABLE
26
- #
27
- class ExtendedStruct
28
- include DRbUndumped
29
-
30
- # +attach_to+ and +attach_name+
31
- # are used so that
32
- # root = ExtendedStruct.new
33
- # root.bla
34
- # does *not* add a +bla+ attribute to root, while the following constructs
35
- # root.bla.test = 20
36
- # bla = root.bla
37
- # bla.test = 20
38
- # does
39
- #
40
- # Note, however that
41
- # bla = root.bla
42
- # root.bla = 10
43
- # bla.test = 20
44
- #
45
- # will *not* make root.bla be the +bla+ object. And that
46
- #
47
- # bla = root.bla
48
- # root.stable!
49
- # bla.test = 20
50
- #
51
- # will not fail
52
- def initialize(children_class = ExtendedStruct, attach_to = nil, attach_name = nil) # :nodoc
53
- clear
54
- @attach_as = [attach_to, attach_name.to_s] if attach_to
55
- @children_class = children_class
56
- @observers = Hash.new { |h, k| h[k] = [] }
57
- end
58
-
59
- def clear
60
- @attach_as = nil
61
- @stable = false
62
- @members = Hash.new
63
- @pending = Hash.new
64
- @filters = Hash.new
65
- @aliases = Hash.new
66
- end
67
-
68
- def self._load(io)
69
- marshalled_members, aliases = Marshal.load(io)
70
- members = marshalled_members.inject({}) do |h, (n, mv)|
71
- begin
72
- h[n] = Marshal.load(mv)
73
- rescue Exception
74
- Roby::Distributed.warn "cannot load #{n} #{mv}: #{$!.message}"
75
- end
76
-
77
- h
78
- end
79
-
80
- result = ExtendedStruct.new
81
- result.instance_variable_set("@members", members)
82
- result.instance_variable_set("@aliases", aliases)
83
- result
84
-
85
- rescue Exception
86
- Roby::Distributed.warn "cannot load #{members} #{io}: #{$!.message}"
87
- raise
88
- end
89
-
90
- def _dump(lvl = -1)
91
- marshalled_members = @members.map do |name, value|
92
- [name, Marshal.dump(value)] rescue nil
93
- end
94
- marshalled_members.compact!
95
- Marshal.dump([marshalled_members, @aliases])
96
- end
97
-
98
- attr_reader :children_class
99
-
100
- attr_reader :attach_as, :__parent_struct, :__parent_name
101
- def attach # :nodoc:
102
- if @attach_as
103
- @__parent_struct, @__parent_name = @attach_as
104
- @attach_as = nil
105
- __parent_struct.attach_child(__parent_name, self)
106
- end
107
- end
108
- def detach
109
- @attach_as = nil
110
- end
111
- def attach_child(name, obj)
112
- @members[name.to_s] = obj
113
- end
114
- protected :detach, :attach_as
115
-
116
- # Call +block+ with the new value if +name+ changes
117
- def on(name = nil, &block)
118
- name = name.to_s if name
119
- @observers[name] << block
120
- end
121
-
122
- # Converts this ExtendedStruct into a corresponding hash, where all
123
- # keys are symbols. If +recursive+ is true, any member which responds
124
- # to #to_hash will be converted as well
125
- def to_hash(recursive = true)
126
- result = Hash.new
127
- @members.each do |k, v|
128
- result[k.to_sym] = if recursive && v.respond_to?(:to_hash)
129
- v.to_hash
130
- else v
131
- end
132
- end
133
- result
134
- end
135
-
136
- # Iterates on all defined members of this object
137
- def each_member(&block)
138
- @members.each(&block)
139
- end
140
-
141
- # Update a set of values on this struct
142
- # If a hash is given, it is an name => value hash of attribute
143
- # values. A given block is yield with self, so that the construct
144
- #
145
- # my.extendable.struct.very.deep.update do |deep|
146
- # <update deep>
147
- # end
148
- #
149
- # can be used
150
- def update(hash = nil)
151
- attach
152
- hash.each { |k, v| send("#{k}=", v) } if hash
153
- yield(self) if block_given?
154
- self
155
- end
156
-
157
- def delete(name = nil)
158
- raise TypeError, "#{self} is stable" if stable?
159
- if name
160
- name = name.to_s
161
- if child = @members.delete(name)
162
- child.instance_variable_set(:@__parent_struct, nil)
163
- child.instance_variable_set(:@__parent_name, nil)
164
- elsif child = @pending.delete(name)
165
- child.instance_variable_set(:@attach_as, nil)
166
- elsif child = @aliases.delete(name)
167
- # nothing to do here
168
- else
169
- raise ArgumentError, "no such child #{name}"
170
- end
171
-
172
- # and remove aliases that point to +name+
173
- @aliases.delete_if { |_, pointed_to| pointed_to == name }
174
- else
175
- if __parent_struct
176
- __parent_struct.delete(__parent_name)
177
- elsif @attach_as
178
- @attach_as.first.delete(@attach_as.last)
179
- else
180
- raise ArgumentError, "#{self} is attached to nothing"
181
- end
182
- end
183
- end
184
-
185
- # Define a filter for the +name+ attribute on self. The given block
186
- # is called when the attribute is written, and should return true if
187
- # the new value if valid or false otherwise
188
- def filter(name, &block)
189
- @filters[name.to_s] = block
190
- end
191
-
192
- # If self is stable, it cannot be updated. That is, calling a setter method
193
- # raises NoMethodError
194
- def stable?; @stable end
195
-
196
- # Sets the stable attribute of +self+ to +is_stable+. If +recursive+ is true,
197
- # set it on the child struct as well.
198
- #
199
- def stable!(recursive = false, is_stable = true)
200
- @stable = is_stable
201
- if recursive
202
- @members.each { |name, object| object.stable!(recursive, is_stable) if object.respond_to?(:stable!) }
203
- end
204
- end
205
-
206
- def updated(name, value)
207
- if @observers.has_key?(name)
208
- @observers[name].each { |b| b.call(value) }
209
- end
210
- @observers[nil].each { |b| b.call(value) }
211
-
212
- if __parent_struct
213
- __parent_struct.updated(__parent_name, self)
214
- end
215
- end
216
-
217
- # Returns true if this object has no member
218
- def empty?; @members.empty? end
219
-
220
- if RUBY_VERSION >= "1.8.7"
221
- def respond_to?(name, include_private = false) # :nodoc:
222
- return true if super
223
- return __respond_to__(name)
224
- end
225
- else
226
- def respond_to?(name) # :nodoc:
227
- return true if super
228
- return __respond_to__(name)
229
- end
230
- end
231
-
232
-
233
- # 1.8.7's #respond_to? takes two arguments, 1.8.6 only one. This is the
234
- # common implementation for both version. #respond_to? is adapted (see
235
- # above)
236
- def __respond_to__(name) # :nodoc:
237
- name = name.to_s
238
- return false if name =~ FORBIDDEN_NAMES_RX
239
-
240
- if name =~ /=$/
241
- !@stable
242
- else
243
- if @members.has_key?(name)
244
- true
245
- else
246
- (alias_to = @aliases[name]) && respond_to?(alias_to)
247
- end
248
- end
249
- end
250
-
251
- def get(name, default_value)
252
- if respond_to?(name)
253
- send(name.to_sym)
254
- else
255
- default_value
256
- end
257
- end
258
-
259
- FORBIDDEN_NAMES=%w{marshal each enum to}.map { |str| "^#{str}_" }
260
- FORBIDDEN_NAMES_RX = /(?:#{FORBIDDEN_NAMES.join("|")})/
261
-
262
- NOT_OVERRIDABLE = %w{class} + instance_methods(false)
263
- NOT_OVERRIDABLE_RX = /(?:#{NOT_OVERRIDABLE.join("|")})/
264
-
265
- def method_missing(name, *args, &update) # :nodoc:
266
- name = name.to_s
267
-
268
- super(name.to_sym, *args, &update) if name =~ FORBIDDEN_NAMES_RX
269
- if name =~ /(.+)=$/
270
- # Setter
271
- name = $1
272
-
273
- value = *args
274
- if stable?
275
- raise NoMethodError, "#{self} is stable"
276
- elsif @filters.has_key?(name) && !@filters[name].call(value)
277
- raise ArgumentError, "value #{value} is not valid for #{name}"
278
- elsif !@members.has_key?(name) && !@aliases.has_key?(name) && respond_to?(name)
279
- if NOT_OVERRIDABLE_RX =~ name
280
- raise ArgumentError, "#{name} is already defined an cannot be overriden"
281
- end
282
-
283
- # Override it
284
- singleton_class.class_eval { private name }
285
- end
286
-
287
- attach
288
-
289
-
290
- @aliases.delete(name)
291
- pending = @pending.delete(name)
292
-
293
- if pending && pending != value
294
- pending.detach
295
- end
296
-
297
- @members[name] = value
298
- updated(name, value)
299
- return value
300
-
301
- elsif name =~ /(.+)\?$/
302
- # Test
303
- name = $1
304
- respond_to?(name) && send(name)
305
-
306
- elsif args.empty? # getter
307
- attach
308
-
309
- if @members.has_key?(name)
310
- member = @members[name]
311
- else
312
- if alias_to = @aliases[name]
313
- return send(alias_to)
314
- elsif stable?
315
- raise NoMethodError, "no such attribute #{name} (#{self} is stable)"
316
- else
317
- member = children_class.new(children_class, self, name)
318
- @pending[name] = member
319
- end
320
- end
321
-
322
- if update
323
- member.update(&update)
324
- else
325
- member
326
- end
327
-
328
- else
329
- super(name.to_sym, *args, &update)
330
- end
331
- end
332
-
333
- def alias(from, to)
334
- @aliases[to.to_s] = from.to_s
335
- end
336
- end
337
-
338
- class StateSpace < ExtendedStruct
339
- def initialize
340
- @exported_fields = Set.new
341
- super
342
- end
343
-
344
- def _dump(lvl = -1)
345
- marshalled_members = @exported_fields.map do |name|
346
- value = @members[name]
347
- [name, Marshal.dump(value)] rescue nil
348
- end
349
- marshalled_members.compact!
350
- Marshal.dump([marshalled_members, @aliases])
351
- end
352
-
353
- def deep_copy
354
- exported_fields, @exported_fields = @exported_fields, Set.new
355
- Marshal.load(Marshal.dump(self))
356
- ensure
357
- @exported_fields = exported_fiels
358
- end
359
-
360
- def testing?; Roby.app.testing? end
361
- def simulation?; Roby.app.simulation? end
362
- def export(*names)
363
- @exported_fields.merge names.map { |n| n.to_s }.to_set
364
- end
365
- end
366
- end
367
-