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,699 +1,63 @@
1
- module Roby
2
- # This exception is raised when an edge is being added in a DAG, while this
3
- # edge would create a cycle.
4
- class CycleFoundError < RuntimeError; end
5
-
6
- # Base support for relations. It is mixed in objects on which a
7
- # RelationSpace applies on, like Task for TaskStructure and EventGenerator
8
- # for EventStructure.
9
- #
10
- # See also the definition of RelationGraph#add_relation and
11
- # RelationGraph#remove_relation for the possibility to define hooks that
12
- # get called when a new edge involving +self+ as a vertex gets added and
13
- # removed
14
- module DirectedRelationSupport
15
- include BGL::Vertex
16
-
17
- alias :child_object? :child_vertex?
18
- alias :parent_object? :parent_vertex?
19
- alias :related_object? :related_vertex?
20
- alias :each_child_object :each_child_vertex
21
- alias :each_parent_object :each_parent_vertex
22
- alias :each_relation :each_graph
23
- alias :clear_relations :clear_vertex
24
-
25
- ##
26
- # :method: enum_relations => enumerator
27
- # Returns an Enumerator object for the set of relations this object is
28
- # included in. The same enumerator instance is always returned.
29
- cached_enum("graph", "relations", false)
30
- ##
31
- # :method: enum_parent_objects(relation) => enumerator
32
- # Returns an Enumerator object for the set of parents this object has
33
- # in +relation+. The same enumerator instance is always returned.
34
- cached_enum("parent_object", "parent_objects", true)
35
- ##
36
- # :method: enum_child_objects(relation) => enumerator
37
- # Returns an Enumerator object for the set of children this object has
38
- # in +relation+. The same enumerator instance is always returned.
39
- cached_enum("child_object", "child_objects", true)
40
-
41
- # The array of relations this object is part of
42
- def relations; enum_relations.to_a end
43
-
44
- # Computes and returns the set of objects related with this one (parent
45
- # or child). If +relation+ is given, enumerate only for this relation,
46
- # otherwise enumerate for all relations. If +result+ is given, it is a
47
- # ValueSet in which the related objects are added
48
- def related_objects(relation = nil, result = nil)
49
- result ||= ValueSet.new
50
- if relation
51
- result.merge(parent_objects(relation).to_value_set)
52
- result.merge(child_objects(relation).to_value_set)
53
- else
54
- each_relation { |rel| related_objects(rel, result) }
55
- end
56
- result
57
- end
58
-
59
- # Set of all parent objects in +relation+
60
- alias :parent_objects :enum_parent_objects
61
- # Set of all child object in +relation+
62
- alias :child_objects :enum_child_objects
63
-
64
- # Add a new child object in the +relation+ relation. This calls
65
- # * #adding_child_object on +self+ and #adding_parent_object on +child+
66
- # just before the relation is added
67
- # * #added_child_object on +self+ and #added_parent_object on +child+
68
- # just after
69
- def add_child_object(child, relation, info = nil)
70
- check_is_relation(relation)
71
- relation.add_relation(self, child, info)
72
- end
73
-
74
- # Add a new parent object in the +relation+ relation
75
- # * #adding_child_object on +parent+ and #adding_parent_object on
76
- # +self+ just before the relation is added
77
- # * #added_child_object on +parent+ and #added_child_object on +self+
78
- # just after
79
- def add_parent_object(parent, relation, info = nil)
80
- parent.add_child_object(self, relation, info)
81
- end
82
-
83
- # Remove all edges in which +self+ is the source and +child+ the
84
- # target. If +relation+ is given, it removes only the edge in that
85
- # relation graph.
86
- def remove_child_object(child, relation = nil)
87
- check_is_relation(relation)
88
- apply_selection(relation, (relation || enum_relations)) do |relation|
89
- relation.remove_relation(self, child)
90
- end
91
- end
92
-
93
- # Remove all edges in which +self+ is the source. If +relation+
94
- # is given, it removes only the edges in that relation graph.
95
- def remove_children(relation = nil)
96
- apply_selection(relation, (relation || enum_relations)) do |relation|
97
- self.each_child_object(relation) do |child|
98
- remove_child_object(child, relation)
99
- end
100
- end
101
- end
102
-
103
- # Remove all edges in which +child+ is the source and +self+ the
104
- # target. If +relation+ is given, it removes only the edge in that
105
- # relation graph.
106
- def remove_parent_object(parent, relation = nil)
107
- parent.remove_child_object(self, relation)
108
- end
109
-
110
- # Remove all edges in which +self+ is the target. If +relation+
111
- # is given, it removes only the edges in that relation graph.
112
- def remove_parents(relation = nil)
113
- check_is_relation(relation)
114
- apply_selection(relation, (relation || enum_relations)) do |relation|
115
- relation.each_parent_object(self) do |parent|
116
- remove_parent_object(relation, parent)
117
- end
118
- end
119
- end
120
-
121
- # Remove all relations that point to or come from +to+ If +to+ is nil,
122
- # it removes all edges in which +self+ is involved.
123
- #
124
- # If +relation+ is not nil, only edges of that relation graph are removed.
125
- def remove_relations(to = nil, relation = nil)
126
- check_is_relation(relation)
127
- if to
128
- remove_parent_object(to, relation)
129
- remove_child_object(to, relation)
130
- else
131
- apply_selection(relation, (relation || enum_relations)) do |relation|
132
- each_parent_object(relation) { |parent| remove_parent_object(parent, relation) }
133
- each_child_object(relation) { |child| remove_child_object(child, relation) }
134
- end
135
- end
136
- end
137
-
138
- # Raises if +type+ does not look like a relation
139
- def check_is_relation(type) # :nodoc:
140
- if type && !(RelationGraph === type)
141
- raise ArgumentError, "#{type} (of class #{type.class}) is not a relation type"
142
- end
143
- end
144
-
145
- # If +object+ is given, yields object or returns +object+ (if a block
146
- # is given or not). If +object+ is nil, either yields the elements of
147
- # +enumerator+ or returns enumerator.
148
- def apply_selection(object, enumerator) # :nodoc:
149
- if block_given?
150
- if object; yield(object)
151
- else enumerator.each { |o| yield(o) }
152
- end
153
- else
154
- if object; [object]
155
- else; enumerator
156
- end
157
- end
158
- end
159
- private :apply_selection
160
- end
161
-
162
- # This class manages the graph defined by an object relation in Roby.
163
- #
164
- # Relation graphs are managed in hierarchies (for instance, in
165
- # EventStructure, Precedence is a superset of CausalLink, and CausalLink a
166
- # superset of both Forwarding and Signal). In this hierarchy, at each
167
- # level, an edge cannot be present in more than one graph. Nonetheless, it
168
- # is possible for a parent relation to have an edge which is present in
169
- # none of its children.
170
- #
171
- # Each relation define two things:
172
- # * a graph, which is represented by the RelationGraph instance itself
173
- # * support methods that are defined on the vertices of the relation. They
174
- # allow to manage the vertex in its relations easily. Those methods are
175
- # defined in a separate module (see #support)
176
- #
177
- # In general, relations are part of a RelationSpace instance, which manages
178
- # the set of relations whose vertices are of the same kind (for instance
179
- # TaskStructure manages all relations whose vertices are Task instances).
180
- # In these cases, RelationSpace#relation allow to define new relations easily.
181
- class RelationGraph < BGL::Graph
182
- # The relation name
183
- attr_reader :name
184
- # The relation parent (if any). See #superset_of.
185
- attr_accessor :parent
186
- # The set of graphs
187
- attr_reader :subsets
188
- # The graph options as given to RelationSpace#relation
189
- attr_reader :options
190
-
191
- # Creates a relation graph with the given name and options. The
192
- # following options are recognized:
193
- # +dag+::
194
- # if the graph is a DAG. If true, add_relation will check that
195
- # no cycle is created
196
- # +subsets+::
197
- # a set of RelationGraph objects that are children of this one.
198
- # See #superset_of.
199
- # +distributed+::
200
- # if this relation graph should be seen by remote hosts
201
- def initialize(name, options = {})
202
- @name = name
203
- @options = options
204
- @subsets = ValueSet.new
205
- @distribute = options[:distribute]
206
- @dag = options[:dag]
207
- @weak = options[:weak]
208
- @embeds_info = !options[:noinfo]
209
-
210
- if options[:subsets]
211
- options[:subsets].each(&method(:superset_of))
212
- end
213
- end
1
+ require "roby/relations/bidirectional_directed_adjacency_graph"
2
+ require 'rgl/traversal'
3
+ require 'rgl/topsort'
4
+ require "roby/relations/models/directed_relation_support"
5
+ require "roby/relations/fork_merge_visitor"
6
+ require "roby/relations/directed_relation_support"
7
+ require "roby/relations/models/graph"
8
+ require "roby/relations/graph"
9
+ require "roby/relations/event_relation_graph"
10
+ require "roby/relations/models/task_relation_graph"
11
+ require "roby/relations/task_relation_graph"
12
+ require "roby/relations/space"
214
13
 
215
- # True if this relation graph is a DAG
216
- attr_predicate :dag
217
- # True if this relation should be seen by remote peers
218
- attr_predicate :distribute
219
- # If this relation is weak. Weak relations can be removed without major
220
- # consequences. This is mainly used during plan garbage collection to
221
- # break cross-relations cycles (cycles which exist in the graph union
222
- # of all the relation graphs).
223
- attr_predicate :weak
224
- # If this relation embeds some additional information
225
- attr_predicate :embeds_info?
226
-
227
- def to_s; name end
228
-
229
- # True if this relation does not have a parent
230
- def root_relation?; !parent end
14
+ module Roby
15
+ module Relations
16
+ # This exception is raised when an edge is being added in a DAG, while this
17
+ # edge would create a cycle.
18
+ class CycleFoundError < RuntimeError; end
231
19
 
232
- # Remove +vertex+ from this graph. It removes all relations that
233
- # +vertex+ is part of, and calls the corresponding hooks
234
- def remove(vertex)
235
- vertex.remove_relations(nil, self)
236
- super
20
+ class << self
21
+ attr_reader :all_relations
237
22
  end
23
+ @all_relations = Array.new
238
24
 
239
- # Add an edge between +from+ and +to+. The relation is added on all
240
- # parent relation graphs as well. If #dag? is true on +self+ or on one
241
- # of its parents, the method will raise CycleFoundError in case the new
242
- # edge would create a cycle.
243
- #
244
- # If +from+ or +to+ define the following hooks:
245
- # adding_parent_object(parent, relations, info)
246
- # adding_child_object(child, relations, info)
247
- # added_parent_object(parent, relations, info)
248
- # added_child_object(child, relations, info)
249
- #
250
- # then these hooks get respectively called before and after having
251
- # added the relation, where +relations+ is the set of RelationGraph
252
- # instances where the edge has been added. It can be either [+self+] if
253
- # the edge does not already exist in it, or [+self+, +parent+,
254
- # <tt>parent.parent</tt>, ...] if the parent, grandparent, ... graphs
255
- # do not include the edge either.
256
- def add_relation(from, to, info = nil)
257
- # Get the toplevel DAG in our relation hierarchy. We only test for the
258
- # DAG property on this one, as it is the union of all its children
259
- top_dag = nil
260
- new_relations = []
261
- rel = self
262
- while rel
263
- top_dag = rel if rel.dag?
264
- if !rel.linked?(from, to)
265
- new_relations << rel
266
- end
267
- rel = rel.parent
268
- end
269
- if top_dag && !top_dag.linked?(from, to) && top_dag.reachable?(to, from)
270
- raise CycleFoundError, "cannot add a #{from} -> #{to} relation since it would create a cycle"
271
- end
272
-
273
- # Now check that we're not changing the edge info. This is ignored
274
- # if +self+ has the noinfo flag set.
275
- if linked?(from, to)
276
- if !(old_info = from[to, self]).nil?
277
- if old_info != info && !(info = merge_info(from, to, old_info, info))
278
- raise ArgumentError, "trying to change edge information in #{self} for #{from} => #{to}: old was #{old_info} and new is #{info}"
279
- end
25
+ def self.each_graph_topologically(graphs)
26
+ rel_to_graph = Hash[*graphs.flat_map { |g| [g.class, g] }]
27
+ all_relations.each do |rel|
28
+ if g = rel_to_graph[rel]
29
+ yield(g)
280
30
  end
281
- from[to, self] = info
282
31
  end
283
-
284
- unless new_relations.empty?
285
- if from.respond_to?(:adding_child_object)
286
- from.adding_child_object(to, new_relations, info)
287
- end
288
- if to.respond_to?(:adding_parent_object)
289
- to.adding_parent_object(from, new_relations, info)
290
- end
291
-
292
- for rel in new_relations
293
- rel.__bgl_link(from, to, (info if self == rel))
294
- end
295
-
296
- if from.respond_to?(:added_child_object)
297
- from.added_child_object(to, new_relations, info)
298
- end
299
- if to.respond_to?(:added_parent_object)
300
- to.added_parent_object(from, new_relations, info)
301
- end
302
- end
303
- end
304
-
305
- def merge_info(from, to, old, new)
306
32
  end
307
33
 
308
- alias :__bgl_link :link
309
- # Reimplemented from BGL::Graph. Unlike this implementation, it is
310
- # possible to add an already existing edge if the +info+ parameter
311
- # matches.
312
- def link(from, to, info)
313
- if linked?(from, to)
314
- old_info = from[to, self]
315
- if info != old_info
316
- if info = merge_info(from, to, old_info, info)
317
- from[to, self] = info
318
- return
319
- else
320
- raise ArgumentError, "trying to change edge information"
321
- end
322
- end
323
- return
324
- end
325
- super(from, to, info)
326
- end
327
-
328
- # Remove the relation between +from+ and +to+, in this graph and in its
329
- # parent graphs as well.
330
- #
331
- # If +from+ or +to+ define the following hooks:
332
- # removing_parent_object(parent, relations)
333
- # removing_child_object(child, relations)
334
- # removed_parent_object(parent, relations)
335
- # removed_child_object(child, relations)
336
- #
337
- # then these hooks get respectively called once before and once after
338
- # having removed the relation, where +relations+ is the set of
339
- # RelationGraph instances where the edge has been removed. It is always
340
- # <tt>[self, parent, parent.parent, ...]</tt> up to the root relation
341
- # which is a superset of +self+.
342
- def remove_relation(from, to)
343
- rel = self
344
- relations = []
345
- while rel
346
- relations << rel
347
- rel = rel.parent
348
- end
34
+ def self.add_relation(rel)
35
+ sorted_relations = Array.new
349
36
 
350
- if from.respond_to?(:removing_child_object)
351
- from.removing_child_object(to, relations)
352
- end
353
- if to.respond_to?(:removing_parent_object)
354
- to.removing_parent_object(from, relations)
355
- end
37
+ # Remove from the set of relations the ones that are not leafs
38
+ remaining = self.all_relations
39
+ remaining << rel
40
+ target_size = remaining.size
356
41
 
357
- for rel in relations
358
- rel.unlink(from, to)
359
- end
360
-
361
- if from.respond_to?(:removed_child_object)
362
- from.removed_child_object(to, relations)
363
- end
364
- if to.respond_to?(:removed_parent_object)
365
- to.removed_parent_object(from, relations)
366
- end
367
- end
368
-
369
- # Returns true if +relation+ is included in this relation (i.e. it is
370
- # either the same relation or one of its children)
371
- #
372
- # See also #superset_of
373
- def subset?(relation)
374
- self.eql?(relation) || subsets.any? { |subrel| subrel.subset?(relation) }
375
- end
376
-
377
- # Returns +true+ if there is an edge +source+ -> +target+ in this graph
378
- # or in one of its parents
379
- #
380
- # See #superset_of for a description of the parent mechanism
381
- def linked_in_hierarchy?(source, target)
382
- linked?(source, target) || (parent.linked?(source, target) if parent)
383
- end
384
-
385
- # Declare that +self+ is a superset of +relation+. Once this is done,
386
- # the system manages two constraints:
387
- # * all new relations added in +relation+ are also added in +self+
388
- # * it is not allowed for an edge to exist in two different subsets of
389
- # +self+
390
- # * of course, if +self+ is a DAG, then in effect +relation+ is constrained
391
- # to be one as well.
392
- #
393
- # One single graph can be the superset of multiple subgraphs (these are
394
- # stored in the #subsets attribute), but one graph can have only one
395
- # parent (#parent).
396
- def superset_of(relation)
397
- relation.each_edge do |source, target, info|
398
- if linked_in_hierarchy?(source, target)
399
- raise ArgumentError, "relation and self already share an edge"
400
- end
401
- end
402
-
403
- relation.parent = self
404
- subsets << relation
405
-
406
- # Copy the relations of the child into this graph
407
- relation.each_edge do |source, target, info|
408
- source.add_child_object(target, self, info)
409
- end
410
- end
411
-
412
- # The Ruby module that gets included in graph objects
413
- attr_accessor :support
414
- end
415
-
416
- # A relation space is a module which handles a list of relations
417
- # (RelationGraph instances) and applies them to a set of classes.
418
- # For instance, the TaskStructure relation space is defined by
419
- # TaskStructure = RelationSpace(Task)
420
- #
421
- # See the files in roby/relations to see example definitions of new
422
- # relations
423
- #
424
- # Use RelationSpace#relation allow to define a new relation in a given
425
- # space. For instance, one can either do
426
- #
427
- # TaskStructure.relation :NewRelation
428
- #
429
- # or
430
- #
431
- # module TaskStructure
432
- # relation :NewRelation
433
- # end
434
- #
435
- # This relation can then be referenced by
436
- # <tt>TaskStructure::NewRelation</tt>
437
- class RelationSpace < Module
438
- # The set of relations included in this relation space
439
- attr_reader :relations
440
- # The set of classes on which the relations have been applied
441
- attr_reader :applied
442
-
443
- def initialize # :nodoc:
444
- @relations = Array.new
445
- @applied = Array.new
446
- super
447
- end
448
-
449
- # This relation applies on +klass+. It mainly means that a relation
450
- # defined on this RelationSpace will define the relation-access methods
451
- # and include its support module (if any) in +klass+. Note that the
452
- # DirectedRelationSupport module is automatically included in +klass+
453
- # as well.
454
- def apply_on(klass)
455
- klass.include DirectedRelationSupport
456
- each_relation do |graph|
457
- klass.include graph.support
458
- end
459
-
460
- applied << klass
461
- end
462
-
463
- # Yields the relations that are defined on this space
464
- def each_relation
465
- for rel in relations
466
- yield(rel)
467
- end
468
- end
469
-
470
- # Yields the root relations that are defined on this space. A relation
471
- # is a root relation when it has no parent relation (i.e. it is the
472
- # subset of no other relations).
473
- def each_root_relation
474
- for rel in relations
475
- yield(rel) unless rel.parent
476
- end
477
- end
478
-
479
- # Returns the set of objects that are reachable from +obj+ in the union
480
- # graph of all the relations defined in this space. In other words, it
481
- # returns the set of vertices so that it exists a path starting at
482
- # +obj+ and ending at +v+ in the union graph of all the relations.
483
- #
484
- # If +strict+ is true, +obj+ is not included in the returned set
485
- def children_of(obj, strict = true, relations = nil)
486
- set = compute_children_of([obj].to_value_set, relations || self.relations)
487
- set.delete(obj) if strict
488
- set
489
- end
490
-
491
- # Internal implementation method for +children_of+
492
- def compute_children_of(current, relations) # :nodoc:
493
- old_size = current.size
494
- for rel in relations
495
- next if (rel.parent && relations.include?(rel.parent))
496
-
497
- components = rel.generated_subgraphs(current, false)
498
- for c in components
499
- current.merge c
500
- end
501
- end
502
-
503
- if current.size == old_size
504
- return current
505
- else
506
- return compute_children_of(current, relations)
507
- end
508
- end
509
-
510
- # Defines a relation in this relation space. This defines a relation
511
- # graph, and various iteration methods on the vertices. If a block is
512
- # given, it defines a set of functions which should additionally be
513
- # defined on the vertex objects.
514
- #
515
- # The valid options are:
516
- #
517
- # child_name::
518
- # define a <tt>each_#{child_name}</tt> method to iterate
519
- # on the vertex children. Uses the relation name by default (a Child
520
- # relation would define a <tt>each_child</tt> method)
521
- # parent_name::
522
- # define a <tt>each_#{parent_name}</tt> method to iterate
523
- # on the parent vertices. If none is given, no method is defined.
524
- # subsets:: a list of subgraphs. See RelationGraph#superset_of [empty set by default]
525
- # noinfo::
526
- # wether the relation embeds some additional information. If false,
527
- # the child iterator method (<tt>each_#{child_name}</tt>) will yield (child,
528
- # info) instead of only child [false by default]
529
- # graph:: the relation graph class [RelationGraph by default]
530
- # distribute:: if true, the relation can be seen by remote peers [true by default]
531
- # single_child::
532
- # if the relations accepts only one child per vertex. If this option
533
- # is set, defines a <tt>#{child_name}</tt> method which returns the
534
- # only child (or nil if there is no child at all) [false by default]
535
- # dag::
536
- # if true, CycleFoundError will be raised if a new vertex would
537
- # create a cycle in this relation [true by default]
538
- #
539
- # For instance,
540
- # relation :Children
541
- #
542
- # defines an instance of RelationGraph which is a DAG, defining the
543
- # following methods on its vertices:
544
- # each_children { |v, info| ... } => graph
545
- # find_children { |v, info| ... } => object or nil
546
- # add_children(v, info = nil) => graph
547
- # remove_children(v) => graph
548
- #
549
- # and
550
- #
551
- # relation :Children, :child_name => :child
552
- #
553
- # would define
554
- #
555
- # each_child { |v, info| ... } => graph
556
- # find_child { |v, info| ... } => object or nil
557
- # add_child(v, info = nil) => graph
558
- # remove_child(v) => graph
559
- #
560
- # * the DirectedRelationSupport module gets included in the vertex classes at the
561
- # construction of the RelationSpace instance. See #apply_on.
562
- # * the <tt>:noinfo</tt> option would then remove the 'info' parameter
563
- # to the various blocks.
564
- # * if <tt>:single_child</tt> is set to true, then an additional method is defined:
565
- # child => object or nil
566
- # * and finally if the following is used
567
- # relation :Children, :child_name => :child, :parent_name => :parent
568
- # then the following method is additionally defined
569
- # each_parent { |v| ... }
570
- #
571
- def relation(relation_name, options = {}, &block)
572
- options = validate_options options,
573
- :child_name => relation_name.to_s.snakecase,
574
- :const_name => relation_name,
575
- :parent_name => nil,
576
- :subsets => ValueSet.new,
577
- :noinfo => false,
578
- :graph => RelationGraph,
579
- :distribute => true,
580
- :dag => true,
581
- :single_child => false,
582
- :weak => false
583
-
584
- # Check if this relation is already defined. If it is the case, reuse it.
585
- # This is needed mostly by the reloading code
586
- if const_defined?(options[:const_name])
587
- graph = const_get(options[:const_name])
588
- mod = graph.support
589
-
590
- else
591
- graph = options[:graph].new "#{self.name}::#{options[:const_name]}", options
592
- mod = Module.new do
593
- singleton_class.class_eval do
594
- define_method("__r_#{relation_name}__") { graph }
595
- end
596
- class_eval "@@__r_#{relation_name}__ = __r_#{relation_name}__"
597
- end
598
- const_set(options[:const_name], graph)
599
- relations << graph
600
- end
601
-
602
- mod.class_eval(&block) if block_given?
603
-
604
- if parent_enumerator = options[:parent_name]
605
- mod.class_eval <<-EOD
606
- def each_#{parent_enumerator}(&iterator)
607
- if !block_given?
608
- return enum_parent_objects(@@__r_#{relation_name}__)
609
- end
610
-
611
- self.each_parent_object(@@__r_#{relation_name}__, &iterator)
612
- end
613
- EOD
614
- end
615
-
616
- if options[:noinfo]
617
- mod.class_eval <<-EOD
618
- def each_#{options[:child_name]}
619
- if !block_given?
620
- return enum_child_objects(@@__r_#{relation_name}__)
621
- end
622
-
623
- each_child_object(@@__r_#{relation_name}__) { |child| yield(child) }
624
- end
625
- def find_#{options[:child_name]}
626
- each_child_object(@@__r_#{relation_name}__) do |child|
627
- return child if yield(child)
628
- end
629
- nil
630
- end
631
- EOD
632
- else
633
- mod.class_eval <<-EOD
634
- cached_enum("#{options[:child_name]}", "#{options[:child_name]}", true)
635
- def each_#{options[:child_name]}(with_info = true)
636
- if !block_given?
637
- return enum_#{options[:child_name]}(with_info)
638
- end
639
-
640
- if with_info
641
- each_child_object(@@__r_#{relation_name}__) do |child|
642
- yield(child, self[child, @@__r_#{relation_name}__])
643
- end
644
- else
645
- each_child_object(@@__r_#{relation_name}__) do |child|
646
- yield(child)
647
- end
648
- end
649
- end
650
- def find_#{options[:child_name]}
651
- each_child_object(@@__r_#{relation_name}__) do |child|
652
- return child if yield(child, self[child, @@__r_#{relation_name}__])
653
- end
654
- nil
655
- end
656
- EOD
657
- end
658
- mod.class_eval <<-EOD
659
- def add_#{options[:child_name]}(to, info = nil)
660
- add_child_object(to, @@__r_#{relation_name}__, info)
661
- self
662
- end
663
- def remove_#{options[:child_name]}(to)
664
- remove_child_object(to, @@__r_#{relation_name}__)
665
- self
666
- end
667
- EOD
668
-
669
- if options[:single_child]
670
- mod.class_eval <<-EOD
671
- def #{options[:child_name]}
672
- each_child_object(@@__r_#{relation_name}__) do |child_task|
673
- return child_task
674
- end
675
- nil
676
- end
677
- EOD
678
- end
679
-
680
- graph.support = mod
681
- applied.each { |klass| klass.include mod }
42
+ while sorted_relations.size != target_size
43
+ queue, remaining = remaining.partition { |g| !g.subsets.intersect?(remaining.to_set) }
44
+ sorted_relations.concat(queue)
45
+ end
682
46
 
683
- graph
684
- end
47
+ @all_relations = sorted_relations
48
+ end
685
49
 
686
- # Remove +rel+ from the set of relations managed in this space
687
- def remove_relation(rel)
688
- relations.delete(rel)
50
+ def self.remove_relation(rel)
51
+ all_relations.delete(rel)
689
52
  end
690
53
  end
691
54
 
692
55
  # Creates a new relation space which applies on +klass+. If a block is
693
56
  # given, it is eval'd in the context of the new relation space instance
694
57
  def self.RelationSpace(klass)
695
- klass.include DirectedRelationSupport
696
- relation_space = RelationSpace.new
58
+ klass.include Relations::DirectedRelationSupport
59
+ klass.extend Relations::Models::DirectedRelationSupport
60
+ relation_space = Relations::Space.new
697
61
  relation_space.apply_on klass
698
62
  relation_space
699
63
  end