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,225 +0,0 @@
1
- module Roby
2
- trap 'SIGCHLD' do
3
- begin
4
- while pid = ::Process.wait(-1, ::Process::WNOHANG)
5
- ExternalProcessTask.dead! pid, $?.dup
6
- end
7
- rescue Errno::ECHILD
8
- end
9
- end
10
-
11
- # This task class can be used to monitor the execution of an external
12
- # process. Among the useful features, it can redirect standard output and
13
- # error output to files.
14
- #
15
- # The events will act as follows:
16
- # * the start command starts the process per se. The event is emitted once
17
- # exec() has been called with success
18
- # * the signaled event is emitted when the process dies because of a signal
19
- # * the failed event is emitted whenever the process exits with a nonzero
20
- # status
21
- # * the success event is emitted when the process exits with a zero status
22
- # * the stop event is emitted when the process exits
23
- class ExternalProcessTask < Roby::Task
24
- ##
25
- # :attr_reader:
26
- # This task argument is an array whose first element is the executable
27
- # to start and the rest the arguments that need to be passed to it.
28
- #
29
- # It can also be set to a simple string, which is interpreted as the
30
- # executable name with no arguments.
31
- argument :command_line
32
-
33
- ##
34
- # :attr_reader:
35
- # The working directory. If not set, the current directory is used.
36
- argument :working_directory
37
-
38
- # Redirection specification. See #redirect_output
39
- attr_reader :redirection
40
-
41
- def initialize(arguments)
42
- arguments[:working_directory] ||= nil
43
- arguments[:command_line] = [arguments[:command_line]] unless arguments[:command_line].kind_of?(Array)
44
- super(arguments)
45
- end
46
-
47
- class << self
48
- # The set of running ExternalProcessTask instances. It is a mapping
49
- # from the PID value to the instances.
50
- attr_reader :processes
51
- end
52
- @processes = Hash.new
53
-
54
- # Called by the SIGCHLD handler to announce that a particular process
55
- # has finished. It calls #dead!(result) in the context of the execution
56
- # thread, on the corresponding task
57
- def self.dead!(pid, result) # :nodoc:
58
- task = processes[pid]
59
- return if !task
60
- if engine = task.plan.engine
61
- engine.once { task.dead!(result) }
62
- end
63
- end
64
-
65
- # Called to announce that this task has been killed. +result+ is the
66
- # corresponding Process::Status object.
67
- def dead!(result)
68
- if result.success?
69
- emit :success
70
- elsif result.signaled?
71
- emit :signaled, result
72
- else
73
- emit :failed, result
74
- end
75
- end
76
-
77
- # This event gets emitted if the process died because of a signal
78
- event :signaled
79
-
80
- forward :signaled => :failed
81
-
82
- ##
83
- # If set to a string, the process' standard output will be redirected to
84
- # the given file. The following replacement is done:
85
- # * '%p' is replaced by the process PID
86
- #
87
- # The last form (with nil argument) removes any redirection. A specific
88
- # redirection can also be disabled using the hash form:
89
- # redirect_output :stdout => nil
90
- #
91
- # :call-seq:
92
- # redirect_output "file"
93
- # redirect_output :stdout => "file-out", :stderr => "another-file"
94
- # redirect_output nil
95
- #
96
- def redirect_output(args)
97
- if !args
98
- @redirection = nil
99
- elsif args.respond_to? :to_str
100
- @redirection = args.to_str
101
- else
102
- args = validate_options args, :stdout => nil, :stderr => nil
103
- if args[:stdout] == args[:stderr]
104
- @redirection = args[:stdout].to_str
105
- else
106
- @redirection = Hash.new
107
- @redirection[:stdout] = args[:stdout].to_str if args[:stdout]
108
- @redirection[:stderr] = args[:stderr].to_str if args[:stderr]
109
- end
110
- end
111
- end
112
-
113
- # The PID of the child process, or nil if the child process is not
114
- # running
115
- attr_reader :pid
116
-
117
- # Error codes between the child and the parent. Note that the error
118
- # codes must not be greater than 9
119
- # :stopdoc:
120
- KO_REDIRECTION = 1
121
- KO_NO_SUCH_FILE = 2
122
- KO_EXEC = 3
123
- # :startdoc:
124
-
125
- # Returns the file name based on the redirection pattern and the current
126
- # PID values. This is called in the child process before exec().
127
- def redirection_path(pattern) # :nodoc:
128
- pattern.gsub '%p', Process.pid.to_s
129
- end
130
-
131
- # Starts the child process
132
- def start_process # :nodoc:
133
- # Open a pipe to monitor the child startup
134
- r, w = IO.pipe
135
-
136
- @pid = fork do
137
- # Open the redirection outputs
138
- stdout, stderr = nil
139
- begin
140
- if redirection.respond_to?(:to_str)
141
- stdout = stderr = File.open(redirection_path(redirection), "w")
142
- elsif redirection
143
- if stdout_file = redirection[:stdout]
144
- stdout = File.open(redirection_path(stdout_file), "w")
145
- end
146
- if stderr_file = redirection[:stderr]
147
- stderr = File.open(redirection_path(stderr_file), "w")
148
- end
149
- end
150
- rescue Exception => e
151
- Roby.fatal e.message
152
- w.write("#{KO_REDIRECTION}")
153
- return
154
- end
155
-
156
- STDOUT.reopen(stdout) if stdout
157
- STDERR.reopen(stderr) if stderr
158
-
159
- r.close
160
- w.fcntl(Fcntl::F_SETFD, 1) # set close on exit
161
- ::Process.setpgrp
162
- begin
163
- exec(*command_line)
164
- rescue Errno::ENOENT
165
- w.write("#{KO_NO_SUCH_FILE}")
166
- rescue Exception => e
167
- Roby.fatal e.message
168
- w.write("#{KO_EXEC}")
169
- end
170
- end
171
-
172
- ExternalProcessTask.processes[pid] = self
173
-
174
- is_running = begin
175
- !Process.waitpid(pid, Process::WNOHANG)
176
- rescue Errno::ECHILD
177
- false
178
- end
179
- if !is_running
180
- raise "child #{command_line.first} died unexpectedly during its startup"
181
- end
182
-
183
- w.close
184
- control = Integer(r.read(1))
185
- if control == KO_REDIRECTION
186
- raise "could not start #{command_line.first}: cannot establish output redirections"
187
- elsif control == KO_NO_SUCH_FILE
188
- raise "could not start #{command_line.first}: provided command does not exist"
189
- elsif control == KO_EXEC
190
- raise "could not start #{command_line.first}: exec() call failed"
191
- end
192
-
193
-
194
- rescue Exception => e
195
- ExternalProcessTask.processes.delete(pid)
196
- raise e
197
- end
198
-
199
- ##
200
- # :method: start!
201
- #
202
- # Starts the child process. Emits +start+ when the process is actually
203
- # started.
204
- event :start do |_|
205
- if working_directory
206
- Dir.chdir(working_directory) do
207
- start_process
208
- end
209
- else
210
- start_process
211
- end
212
- emit :start
213
- end
214
-
215
- # Kills the child process
216
- def kill(signo)
217
- Process.kill(signo, pid)
218
- end
219
-
220
- on :stop do |_|
221
- ExternalProcessTask.processes.delete(pid)
222
- end
223
- end
224
- end
225
-
@@ -1,160 +0,0 @@
1
- Utilrb.unless_ext do
2
- raise LoadError, "Roby needs Utilrb's C extension to be compiled"
3
- end
4
-
5
- module BGL
6
- module Vertex
7
- def initialize_copy(old)
8
- super
9
- @__bgl_graphs__ = nil
10
- end
11
-
12
- # Removes +self+ from all the graphs it is included in.
13
- def clear_vertex
14
- each_graph { |g| g.remove(self) }
15
- end
16
-
17
- attribute(:singleton_set) { [self].to_value_set.freeze }
18
- # Returns the connected component +self+ is part of in +graph+
19
- def component(graph)
20
- graph.components(singleton_set, false).first || singleton_set
21
- end
22
- # Returns the vertex set which are reachable from +self+ in +graph+
23
- def generated_subgraph(graph)
24
- graph.generated_subgraphs(singleton_set, false).first || singleton_set
25
- end
26
- # Returns the vertex set which can reach +self+ in +graph+
27
- def reverse_generated_subgraph(graph)
28
- graph.reverse.generated_subgraphs(singleton_set, false).first || singleton_set
29
- end
30
-
31
- # Replace this vertex by +to+ in all graphs. See Graph#replace_vertex.
32
- def replace_vertex_by(to)
33
- each_graph { |g| g.replace_vertex(self, to) }
34
- end
35
-
36
- # Returns an array of [graph, [parent, child, info], [parent, child,
37
- # info], ...] elements for all edges +self+ is involved in
38
- def edges
39
- result = []
40
- each_graph do |graph|
41
- graph_edges = []
42
- each_child_object do |child|
43
- graph_edges << [self, child, self[child, graph]]
44
- end
45
- each_parent_object do |parent|
46
- graph_edges << [parent, self, parent[self, graph]]
47
- end
48
- result << [graph, graph_edges]
49
- end
50
-
51
- result
52
- end
53
-
54
- # call-seq:
55
- # neighborhood(distance, graph) => [[graph, v, v1, data], [graph, v2, v, data], ...]
56
- # neighborhood(distance) => [[g1, v, v1, data], [g2, v2, v, data], ...]
57
- #
58
- # Returns a list of [graph, edge] representing all edges at a maximum distance
59
- # of +distance+ from +self+. If +graph+ is given, only enumerate the neighborhood
60
- # in +graph+.
61
- def neighborhood(distance, graph = nil)
62
- if graph
63
- graph.neighborhood(self, distance).
64
- map! { |args| args.unshift(graph) }
65
- else
66
- edges = []
67
- each_graph do |graph|
68
- edges += neighborhood(distance, graph)
69
- end
70
- edges
71
- end
72
- end
73
- end
74
-
75
- class Graph
76
- # This class is an adaptor which transforms a directed graph by
77
- # swapping its edges
78
- class Reverse
79
- # Create a directed graph whose edges are the ones of +g+, but with
80
- # source and destination swapped.
81
- def initialize(g)
82
- @__bgl_real_graph__ = g
83
- end
84
- end
85
- attribute(:reverse) { @reverse = Graph::Reverse.new(self) }
86
-
87
- # This class is a graph adaptor which transforms a directed graph into
88
- # an undirected graph
89
- class Undirected
90
- # Create an undirected graph which has the same edge set than +g+
91
- def initialize(g)
92
- @__bgl_real_graph__ = g
93
- end
94
- end
95
- attribute(:undirected) { @undirected = Graph::Undirected.new(self) }
96
-
97
- def initialize_copy(source) # :nodoc:
98
- super
99
-
100
- source.each_vertex { |v| insert(v) }
101
- source.each_edge { |s, t, i| link(s, t, i) }
102
- end
103
-
104
- # Replaces +from+ by +to+. This means +to+ takes the role of +from+ in
105
- # all edges +from+ is involved in. +from+ is removed from the graph.
106
- def replace_vertex(from, to)
107
- from.each_parent_vertex(self) do |parent|
108
- link(parent, to, parent[from, self])
109
- end
110
- from.each_child_vertex(self) do |child|
111
- link(to, child, from[child, self])
112
- end
113
- remove(from)
114
- end
115
-
116
- # Returns a list of [parent, child, info] for all edges that are at a
117
- # distance no more than +distance+ from +vertex+.
118
- def neighborhood(vertex, distance)
119
- result = []
120
- seen = Set.new
121
- depth = { vertex => 0 }
122
- undirected.each_bfs(vertex, ALL) do |from, to, info, kind|
123
- new_depth = depth[from] + 1
124
- if kind == TREE
125
- depth[to] = new_depth
126
- else
127
- next if seen.include?(to)
128
- end
129
- seen << from
130
-
131
- if depth[from] > distance
132
- break
133
- end
134
-
135
- if new_depth <= distance
136
- if linked?(from, to)
137
- result << [from, to, info]
138
- else
139
- result << [to, from, info]
140
- end
141
- end
142
- end
143
- result
144
- end
145
-
146
- # Two graphs are the same if they have the same vertex set
147
- # and the same edge set
148
- def same_graph?(other)
149
- unless other.respond_to?(:each_vertex) && other.respond_to?(:each_edge)
150
- return false
151
- end
152
-
153
- # cannot use to_value_set for edges since we are comparing arrays (and ValueSet
154
- # bases its comparison on VALUE)
155
- (other.enum_for(:each_vertex).to_value_set == enum_for(:each_vertex).to_value_set) &&
156
- (other.enum_for(:each_edge).to_set == enum_for(:each_edge).to_set)
157
- end
158
- end
159
- end
160
-
@@ -1,3 +0,0 @@
1
- require 'roby'
2
- require 'roby/distributed'
3
- require 'roby/log/logger'
@@ -1,303 +0,0 @@
1
- require 'roby/log/data_stream'
2
- require 'roby/log/relations'
3
- require 'roby/log/gui/chronicle_view'
4
-
5
- module Roby
6
- module Log
7
- class ChronicleDisplay < Qt::Object
8
-
9
- # y:: the Y of this line in the graphics scene
10
- # item:: the main item, either a free event or a task
11
- # graphic_items:: the array of graphic items
12
- # graphics_group:: a Qt::GraphicsGroup object holding all graphic objects for this line
13
- Line = Struct.new :y, :item, :graphic_items, :graphic_group, :start_time
14
- class Line
15
- def add(graphic_item, time)
16
- class << graphic_item; attr_accessor :time end
17
- graphic_item.time = time
18
- graphic_group.add_to_group graphic_item
19
-
20
- if graphic_items.empty?
21
- self.start_time = time
22
- end
23
- graphic_items << graphic_item
24
- end
25
- end
26
-
27
- include DataDisplay
28
- decoder PlanRebuilder
29
-
30
- include TaskDisplaySupport
31
-
32
- attr_reader :scene
33
- attr_reader :ui
34
-
35
- attr_reader :signalled_events
36
- attr_reader :execution_events
37
- attr_reader :graphic_stack
38
- attr_reader :graphic_objects
39
- attr_reader :last_event_graphics
40
- attr_reader :time_scale
41
-
42
- attr_predicate :display_follows_execution?, true
43
- attr_predicate :display_follows_new_tasks?, true
44
-
45
- def initialize
46
- @scene = Qt::GraphicsScene.new
47
- super()
48
-
49
- @main = Qt::MainWindow.new
50
- main.resize 500, 500
51
- @ui = Ui::ChronicleView.new
52
- ui.setupUi(self, main)
53
- ui.graphics.scene = @scene
54
-
55
- @signalled_events = []
56
- @execution_events = []
57
- @graphic_stack = []
58
- @graphic_objects = Hash.new
59
- @last_event_graphics = Hash.new
60
- self.show_ownership = false
61
-
62
- connect(ui.graphics.horizontalScrollBar, SIGNAL('valueChanged(int)'), self, SLOT('hscroll()'))
63
- connect(ui.graphics.verticalScrollBar, SIGNAL('valueChanged(int)'), self, SLOT('vscroll()'))
64
-
65
- @time_scale = 100.0
66
- end
67
-
68
- def time_scale=(new_value)
69
- @time_scale = new_value
70
-
71
- # For now, we don't relayout event labels
72
- graphic_stack.each do |line_info|
73
- base_x = time_to_display(line_info.start_time)
74
-
75
- line_info.graphic_items.each do |g|
76
- g.set_pos(time_to_display(g.time), g.pos.y)
77
- end
78
- end
79
-
80
- # call update to update the task width
81
- update
82
- end
83
-
84
- def vscroll(user = true)
85
- if user
86
- scrollbar = ui.graphics.verticalScrollBar
87
- @display_follows_new_tasks = (scrollbar.maximum == scrollbar.value)
88
- end
89
- end
90
- slots 'vscroll()'
91
-
92
- def hscroll(user = true)
93
- left_side = ui.graphics.mapToScene(0, 0).x
94
-
95
- if user
96
- scrollbar = ui.graphics.horizontalScrollBar
97
- @display_follows_execution = (scrollbar.maximum == scrollbar.value)
98
- end
99
-
100
- graphic_stack.each do |line|
101
- item = line.item
102
- next unless item.kind_of?(Roby::Task::DRoby)
103
-
104
- graphics = graphic_objects[item]
105
- dx = graphics.pos.x - left_side
106
- if dx <= 0
107
- graphics.text.set_pos(-dx, graphics.text.pos.y)
108
- else
109
- graphics.text.set_pos(0, graphics.text.pos.y)
110
- end
111
- end
112
- end
113
- slots 'hscroll()'
114
-
115
- def time_to_display(time)
116
- (time - decoder.start_time) * time_scale
117
- end
118
-
119
- def create_line(item)
120
- group = scene.create_item_group([])
121
- graphic_stack << (new_line = Line.new(0, item, [], group))
122
- new_line
123
- end
124
-
125
- def create_or_get_task(item, time)
126
- unless g = graphic_objects[item]
127
- pos_x = time_to_display(time)
128
-
129
- g = graphic_objects[item] = item.display_create(self)
130
- g.rect = Qt::RectF.new(0, 0, 0, Log::DEFAULT_TASK_HEIGHT)
131
- g.move_by pos_x, 0
132
- line = create_line(item)
133
- line.add g, time
134
- end
135
- g
136
- end
137
-
138
- def line_of(object)
139
- graphic_stack.each_with_index do |line, i|
140
- return i if line.item == object
141
- end
142
- nil
143
- end
144
-
145
- def stream=(stream)
146
- super
147
-
148
- # Initialize the set of running tasks
149
- update_prefixes_removal
150
- decoder.tasks.each_key do |task|
151
- if task.current_state == :started
152
- create_or_get_task(task, decoder.time)
153
- end
154
- end
155
- end
156
-
157
-
158
- def append_event(task, event)
159
- index = line_of(task)
160
- create_or_get_item(event, index)
161
- end
162
-
163
- def update
164
- update_prefixes_removal
165
-
166
- execution_events.each do |flags, time, event|
167
- graphics = event.display_create(self)
168
- graphics.move_by time_to_display(time), 0
169
- y_offset = Log::EVENT_CIRCLE_RADIUS + Log::TASK_EVENT_SPACING
170
-
171
- if event.respond_to?(:task)
172
- task_graphics = create_or_get_task(event.task, time)
173
- line = line_of(event.task)
174
-
175
- # Check that the event labels to not collide. If it is
176
- # the case, move the current label at the bottom of the
177
- # last label found
178
- line_info = graphic_stack[line]
179
- if line_info.graphic_items.size > 1
180
- last_event = line_info.graphic_items[-1]
181
- last_br = last_event.text.scene_bounding_rect
182
- current_br = graphics.text.scene_bounding_rect
183
- if last_br.right > current_br.left
184
- if event.task.last_event[1] == event
185
- last_event.text.hide
186
- else
187
- graphics.text.set_pos(0, last_br.bottom - last_event.scene_pos.y)
188
- end
189
- end
190
- end
191
-
192
- # Move the right edge of the task to reflect that it is
193
- # still running. Then, make sure the rectangle can
194
- # contain the event graphics
195
- expected_height = graphics.text.bounding_rect.bottom + y_offset
196
- if expected_height > task_graphics.rect.height
197
- task_graphics.set_rect(0, 0, time_to_display(time) - time_to_display(line_info.start_time), expected_height)
198
- task_graphics.text.set_pos(task_graphics.text.pos.x, expected_height)
199
- end
200
- event.task.last_event = [time, event]
201
-
202
- elsif !(line = line_of(event))
203
- group = create_line(event)
204
- line = (graphic_stack.size - 1)
205
- end
206
-
207
- line_info = graphic_stack[line]
208
- graphics.move_by 0, line_info.y + y_offset
209
-
210
- # Try to handle too-near events gracefully
211
- #old_flag, old_graphics = last_event_graphics[event]
212
- #if old_flag
213
- # flag = 2 if old_flag == 0 && flag == 1
214
- # if old_graphics.text.bounding_rect.right > graphics.text.bounding_rect.left
215
- # old_graphics.text.hide
216
- # end
217
- #end
218
- #last_event_graphics[event] = [flag, graphics]
219
-
220
- graphics.brush, graphics.pen = EventGeneratorDisplay.style(event, flags)
221
- if flags & EVENT_EMITTED == 1
222
- graphics.z_layer += 1
223
- end
224
- line_info.add graphics, time
225
- end
226
-
227
- removed_objects = (graphic_objects.keys - decoder.tasks.keys - decoder.events.keys)
228
- removed_objects.each do |obj|
229
- if line = line_of(obj)
230
- graphic_objects.delete(obj)
231
- scene.remove_item graphic_stack[line].graphic_group
232
- graphic_stack.delete_at(line)
233
- end
234
- end
235
-
236
- decoder.tasks.each_key do |task|
237
- next unless task_graphics = graphic_objects[task]
238
- line_info = graphic_stack[line_of(task)]
239
-
240
- old_state = task.displayed_state
241
- task.update_graphics(self, task_graphics)
242
-
243
- state = task.current_state
244
- rect = task_graphics.rect
245
-
246
- last_time = if state == :success || state == :finished
247
- task.last_event[0]
248
- else decoder.time
249
- end
250
- task_graphics.set_rect(0, 0, time_to_display(last_time) - time_to_display(line_info.start_time), rect.height)
251
- end
252
-
253
- if display_follows_execution?
254
- scrollbar = ui.graphics.horizontalScrollBar
255
- scrollbar.value = scrollbar.maximum
256
- hscroll(false)
257
- end
258
-
259
- if display_follows_new_tasks?
260
- scrollbar = ui.graphics.verticalScrollBar
261
- scrollbar.value = scrollbar.maximum
262
- end
263
-
264
- # layout lines
265
- y = 0
266
- graphic_stack.each do |line|
267
- offset = y - line.y
268
- if offset != 0
269
- line.y = y
270
- line.graphic_group.move_by 0, offset
271
- end
272
-
273
- br = line.graphic_group.bounding_rect | line.graphic_group.children_bounding_rect
274
- y += br.bottom + Log::TASK_EVENT_SPACING
275
- end
276
-
277
- execution_events.clear
278
- signalled_events.clear
279
- end
280
-
281
- def local_task(obj); decoder.local_task(obj) end
282
- def local_event(obj); decoder.local_event(obj) end
283
- def local_plan(obj); decoder.local_plan(obj) end
284
- def local_object(obj); decoder.local_object(obj) end
285
-
286
- def generator_called(time, generator, context)
287
- execution_events << [EVENT_CALLED, time, local_event(generator)]
288
- end
289
- def generator_fired(time, generator, event_id, event_time, event_context)
290
- generator = local_event(generator)
291
- execution_events << [EVENT_EMITTED, event_time, generator]
292
- end
293
- def generator_signalling(time, flag, from, to, event_id, event_time, event_context)
294
- signalled_events << [flag, local_event(from), local_event(to), event_id]
295
- end
296
- def generator_forwarding(time, flag, from, to, event_id, event_time, event_context)
297
- signalled_events << [flag, local_event(from), local_event(to), event_id]
298
- end
299
- end
300
- end
301
- end
302
-
303
-