roby 0.8.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (644) hide show
  1. checksums.yaml +7 -0
  2. data/.deep-cover.rb +3 -0
  3. data/.gitattributes +1 -0
  4. data/.gitignore +24 -0
  5. data/.simplecov +10 -0
  6. data/.travis.yml +17 -0
  7. data/.yardopts +4 -0
  8. data/Gemfile +15 -0
  9. data/README.md +11 -0
  10. data/Rakefile +47 -177
  11. data/benchmark/{alloc_misc.rb → attic/alloc_misc.rb} +2 -2
  12. data/benchmark/{discovery_latency.rb → attic/discovery_latency.rb} +19 -19
  13. data/benchmark/{garbage_collection.rb → attic/garbage_collection.rb} +9 -9
  14. data/benchmark/{genom.rb → attic/genom.rb} +0 -0
  15. data/benchmark/attic/transactions.rb +62 -0
  16. data/benchmark/plan_basic_operations.rb +28 -0
  17. data/benchmark/relations/graph.rb +63 -0
  18. data/benchmark/ruby/identity.rb +18 -0
  19. data/benchmark/ruby/set_intersect_vs_hash_merge.rb +39 -0
  20. data/benchmark/ruby/yield_vs_block.rb +35 -0
  21. data/benchmark/run +5 -0
  22. data/benchmark/synthetic_plan_modifications_with_transactions.rb +79 -0
  23. data/benchmark/transactions.rb +99 -51
  24. data/bin/roby +38 -197
  25. data/bin/roby-display +14 -0
  26. data/bin/roby-log +3 -176
  27. data/doc/guide/{src → attic}/abstraction/achieve_with.page +1 -1
  28. data/doc/guide/{src → attic}/abstraction/forwarding.page +1 -1
  29. data/doc/guide/{src → attic}/abstraction/hierarchy.page +1 -1
  30. data/doc/guide/{src → attic}/abstraction/index.page +1 -1
  31. data/doc/guide/{src → attic}/abstraction/task_models.page +1 -1
  32. data/doc/guide/{overview.rdoc → attic/cycle/api_overview.rdoc} +6 -1
  33. data/doc/guide/{src → attic}/cycle/cycle-overview.png +0 -0
  34. data/doc/guide/{src → attic}/cycle/cycle-overview.svg +0 -0
  35. data/doc/guide/attic/cycle/error_handling.page +98 -0
  36. data/doc/guide/{src → attic}/cycle/error_instantaneous_repair.png +0 -0
  37. data/doc/guide/{src → attic}/cycle/error_instantaneous_repair.svg +0 -0
  38. data/doc/guide/{src/cycle/error_handling.page → attic/cycle/error_sources.page} +46 -89
  39. data/doc/guide/{src → attic}/cycle/garbage_collection.page +1 -1
  40. data/doc/guide/{src → attic}/cycle/index.page +1 -1
  41. data/doc/guide/{src → attic}/cycle/propagation.page +11 -1
  42. data/doc/guide/{src → attic}/cycle/propagation_diamond.png +0 -0
  43. data/doc/guide/{src → attic}/cycle/propagation_diamond.svg +0 -0
  44. data/doc/guide/attic/plans/building_plans.page +89 -0
  45. data/doc/guide/attic/plans/code.page +192 -0
  46. data/doc/guide/{src/basics → attic/plans}/events.page +3 -4
  47. data/doc/guide/attic/plans/index.page +7 -0
  48. data/doc/guide/{plan_modifications.rdoc → attic/plans/plan_modifications.rdoc} +5 -3
  49. data/doc/guide/{src/basics → attic/plans}/plan_objects.page +2 -1
  50. data/doc/guide/attic/plans/querying_plans.page +5 -0
  51. data/doc/guide/{src/basics → attic/plans}/tasks.page +20 -20
  52. data/doc/guide/config.yaml +7 -4
  53. data/doc/guide/ext/extended_menu.rb +29 -0
  54. data/doc/guide/ext/init.rb +6 -0
  55. data/doc/guide/ext/rdoc_links.rb +7 -6
  56. data/doc/guide/src/advanced_concepts/history.page +5 -0
  57. data/doc/guide/src/advanced_concepts/index.page +11 -0
  58. data/doc/guide/src/advanced_concepts/recognizing_patterns.page +83 -0
  59. data/doc/guide/src/advanced_concepts/scheduling.page +87 -0
  60. data/doc/guide/src/advanced_concepts/transactions.page +5 -0
  61. data/doc/guide/src/advanced_concepts/unreachability.page +42 -0
  62. data/doc/guide/src/base.template +96 -0
  63. data/doc/guide/src/basics_shell_header.txt +5 -7
  64. data/doc/guide/src/building/action_coordination.page +96 -0
  65. data/doc/guide/src/building/actions.page +124 -0
  66. data/doc/guide/src/building/file_layout.page +71 -0
  67. data/doc/guide/src/building/index.page +50 -0
  68. data/doc/guide/src/building/patterns.page +86 -0
  69. data/doc/guide/src/building/patterns_forwarding.png +0 -0
  70. data/doc/guide/src/building/patterns_forwarding.svg +277 -0
  71. data/doc/guide/src/building/runtime.page +95 -0
  72. data/doc/guide/src/building/task_models.page +94 -0
  73. data/doc/guide/src/building/tasks.page +284 -0
  74. data/doc/guide/src/concepts/error_handling.page +100 -0
  75. data/doc/guide/src/concepts/exception_propagation.png +0 -0
  76. data/doc/guide/src/concepts/exception_propagation.svg +445 -0
  77. data/doc/guide/src/concepts/execution.page +85 -0
  78. data/doc/guide/src/concepts/execution.png +0 -0
  79. data/doc/guide/src/concepts/execution.svg +573 -0
  80. data/doc/guide/src/concepts/execution_cycle.png +0 -0
  81. data/doc/guide/src/concepts/garbage_collection.page +57 -0
  82. data/doc/guide/src/concepts/index.page +27 -0
  83. data/doc/guide/src/concepts/plans.page +101 -0
  84. data/doc/guide/src/concepts/policy.page +31 -0
  85. data/doc/guide/src/concepts/reactor.page +61 -0
  86. data/doc/guide/src/concepts/simple_plan_example.png +0 -0
  87. data/doc/guide/src/concepts/simple_plan_example.svg +376 -0
  88. data/doc/guide/src/default.template +9 -74
  89. data/doc/guide/src/event_relations/forward.page +71 -0
  90. data/doc/guide/src/event_relations/index.page +12 -0
  91. data/doc/guide/src/event_relations/scheduling_constraints.page +43 -0
  92. data/doc/guide/src/event_relations/signal.page +55 -0
  93. data/doc/guide/src/event_relations/temporal_constraints.page +77 -0
  94. data/doc/guide/src/htmldoc.metainfo +21 -8
  95. data/doc/guide/src/index.page +8 -3
  96. data/doc/guide/src/{introduction/install.page → installation/index.page} +37 -25
  97. data/doc/guide/src/installation/publications.page +14 -0
  98. data/doc/guide/src/{introduction → installation}/videos.page +14 -7
  99. data/doc/guide/src/interacting/index.page +16 -0
  100. data/doc/guide/src/interacting/run.page +33 -0
  101. data/doc/guide/src/interacting/shell.page +95 -0
  102. data/doc/guide/src/plugins/creating_plugins.page +72 -0
  103. data/doc/guide/src/plugins/index.page +27 -5
  104. data/doc/guide/src/plugins/{fault_tolerance.page → standard_plugins/fault_tolerance.page} +2 -2
  105. data/doc/guide/src/plugins/standard_plugins/index.page +11 -0
  106. data/doc/guide/src/plugins/{subsystems.page → standard_plugins/subsystems.page} +2 -2
  107. data/doc/guide/src/style_screen.css +687 -0
  108. data/doc/guide/src/task_relations/dependency.page +107 -0
  109. data/doc/guide/src/task_relations/executed_by.page +77 -0
  110. data/doc/guide/src/task_relations/index.page +12 -0
  111. data/doc/guide/src/task_relations/new_relations.page +119 -0
  112. data/doc/guide/src/task_relations/planned_by.page +46 -0
  113. data/doc/guide/src/tutorial/app.page +117 -0
  114. data/doc/guide/src/{basics → tutorial}/code_examples.page +6 -5
  115. data/doc/guide/src/{basics → tutorial}/dry.page +15 -15
  116. data/doc/guide/src/{basics → tutorial}/errors.page +43 -68
  117. data/doc/guide/src/tutorial/events.page +195 -0
  118. data/doc/guide/src/{basics → tutorial}/hierarchy.page +53 -52
  119. data/doc/guide/src/tutorial/index.page +13 -0
  120. data/doc/guide/src/tutorial/log_replay/goForward_1.png +0 -0
  121. data/doc/guide/src/tutorial/log_replay/goForward_2.png +0 -0
  122. data/doc/guide/src/tutorial/log_replay/goForward_3.png +0 -0
  123. data/doc/guide/src/{basics → tutorial}/log_replay/goForward_4.png +0 -0
  124. data/doc/guide/src/tutorial/log_replay/goForward_5.png +0 -0
  125. data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_1.png +0 -0
  126. data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_2.png +0 -0
  127. data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_3.png +0 -0
  128. data/doc/guide/src/tutorial/log_replay/moveto_code_error.png +0 -0
  129. data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_1.png +0 -0
  130. data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_2.png +0 -0
  131. data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_3.png +0 -0
  132. data/doc/guide/src/tutorial/log_replay/plan_repair_4.png +0 -0
  133. data/doc/guide/src/tutorial/log_replay/roby_log_main_window.png +0 -0
  134. data/doc/guide/src/{basics → tutorial}/log_replay/roby_log_relation_window.png +0 -0
  135. data/doc/guide/src/{basics → tutorial}/log_replay/roby_replay_event_representation.png +0 -0
  136. data/doc/guide/src/tutorial/relations_display.page +153 -0
  137. data/doc/guide/src/{basics → tutorial}/roby_cycle_overview.png +0 -0
  138. data/doc/guide/src/tutorial/shell.page +121 -0
  139. data/doc/guide/src/{basics → tutorial}/summary.page +1 -1
  140. data/doc/guide/src/tutorial/tasks.page +374 -0
  141. data/lib/roby.rb +102 -47
  142. data/lib/roby/actions.rb +17 -0
  143. data/lib/roby/actions/action.rb +80 -0
  144. data/lib/roby/actions/interface.rb +45 -0
  145. data/lib/roby/actions/library.rb +23 -0
  146. data/lib/roby/actions/models/action.rb +224 -0
  147. data/lib/roby/actions/models/coordination_action.rb +58 -0
  148. data/lib/roby/actions/models/interface.rb +22 -0
  149. data/lib/roby/actions/models/interface_base.rb +294 -0
  150. data/lib/roby/actions/models/library.rb +12 -0
  151. data/lib/roby/actions/models/method_action.rb +90 -0
  152. data/lib/roby/actions/task.rb +114 -0
  153. data/lib/roby/and_generator.rb +125 -0
  154. data/lib/roby/app.rb +2795 -829
  155. data/lib/roby/app/autotest_console_reporter.rb +138 -0
  156. data/lib/roby/app/base.rb +21 -0
  157. data/lib/roby/app/cucumber.rb +2 -0
  158. data/lib/roby/app/cucumber/controller.rb +439 -0
  159. data/lib/roby/app/cucumber/helpers.rb +280 -0
  160. data/lib/roby/app/cucumber/world.rb +32 -0
  161. data/lib/roby/app/debug.rb +136 -0
  162. data/lib/roby/app/gen.rb +2 -0
  163. data/lib/roby/app/rake.rb +178 -38
  164. data/lib/roby/app/robot_config.rb +9 -0
  165. data/lib/roby/app/robot_names.rb +115 -0
  166. data/lib/roby/app/run.rb +3 -2
  167. data/lib/roby/app/scripts.rb +72 -0
  168. data/lib/roby/app/scripts/autotest.rb +173 -0
  169. data/lib/roby/app/scripts/display.rb +2 -0
  170. data/lib/roby/app/scripts/restart.rb +52 -0
  171. data/lib/roby/app/scripts/results.rb +17 -8
  172. data/lib/roby/app/scripts/run.rb +155 -24
  173. data/lib/roby/app/scripts/shell.rb +147 -62
  174. data/lib/roby/app/scripts/test.rb +107 -22
  175. data/lib/roby/app/test_reporter.rb +74 -0
  176. data/lib/roby/app/test_server.rb +159 -0
  177. data/lib/roby/app/vagrant.rb +47 -0
  178. data/lib/roby/backports.rb +16 -0
  179. data/lib/roby/cli/display.rb +190 -0
  180. data/lib/roby/cli/exceptions.rb +17 -0
  181. data/lib/roby/cli/gen/actions/class.rb +5 -0
  182. data/lib/roby/cli/gen/actions/test.rb +6 -0
  183. data/lib/roby/cli/gen/app/.yardopts +6 -0
  184. data/lib/roby/cli/gen/app/README.md +28 -0
  185. data/lib/roby/cli/gen/app/Rakefile +15 -0
  186. data/{app → lib/roby/cli/gen/app}/config/app.yml +29 -39
  187. data/lib/roby/cli/gen/app/models/.gitattributes +1 -0
  188. data/{app → lib/roby/cli/gen/app/scripts}/controllers/.gitattributes +0 -0
  189. data/{app/data/.gitattributes → lib/roby/cli/gen/app/test/.gitignore} +0 -0
  190. data/lib/roby/cli/gen/class/class.rb +6 -0
  191. data/lib/roby/cli/gen/class/test.rb +7 -0
  192. data/lib/roby/cli/gen/helpers.rb +203 -0
  193. data/lib/roby/cli/gen/module/module.rb +5 -0
  194. data/lib/roby/cli/gen/module/test.rb +6 -0
  195. data/lib/roby/cli/gen/roby_app/config/init.rb +17 -0
  196. data/lib/roby/cli/gen/roby_app/config/robots/robot.rb +40 -0
  197. data/lib/roby/cli/gen/task/class.rb +44 -0
  198. data/lib/roby/cli/gen/task/test.rb +6 -0
  199. data/lib/roby/cli/gen_main.rb +120 -0
  200. data/lib/roby/cli/log.rb +276 -0
  201. data/lib/roby/cli/log/flamegraph.html +499 -0
  202. data/lib/roby/cli/log/flamegraph_renderer.rb +88 -0
  203. data/lib/roby/cli/main.rb +153 -0
  204. data/lib/roby/coordination.rb +60 -0
  205. data/lib/roby/coordination/action_script.rb +25 -0
  206. data/lib/roby/coordination/action_state_machine.rb +125 -0
  207. data/lib/roby/coordination/actions.rb +106 -0
  208. data/lib/roby/coordination/base.rb +145 -0
  209. data/lib/roby/coordination/calculus.rb +40 -0
  210. data/lib/roby/coordination/child.rb +28 -0
  211. data/lib/roby/coordination/event.rb +29 -0
  212. data/lib/roby/coordination/fault_handler.rb +25 -0
  213. data/lib/roby/coordination/fault_handling_task.rb +13 -0
  214. data/lib/roby/coordination/fault_response_table.rb +110 -0
  215. data/lib/roby/coordination/models/action_script.rb +64 -0
  216. data/lib/roby/coordination/models/action_state_machine.rb +224 -0
  217. data/lib/roby/coordination/models/actions.rb +191 -0
  218. data/lib/roby/coordination/models/arguments.rb +55 -0
  219. data/lib/roby/coordination/models/base.rb +176 -0
  220. data/lib/roby/coordination/models/capture.rb +86 -0
  221. data/lib/roby/coordination/models/child.rb +35 -0
  222. data/lib/roby/coordination/models/event.rb +41 -0
  223. data/lib/roby/coordination/models/exceptions.rb +42 -0
  224. data/lib/roby/coordination/models/fault_handler.rb +219 -0
  225. data/lib/roby/coordination/models/fault_response_table.rb +77 -0
  226. data/lib/roby/coordination/models/root.rb +22 -0
  227. data/lib/roby/coordination/models/script.rb +283 -0
  228. data/lib/roby/coordination/models/task.rb +184 -0
  229. data/lib/roby/coordination/models/task_from_action.rb +50 -0
  230. data/lib/roby/coordination/models/task_from_as_plan.rb +33 -0
  231. data/lib/roby/coordination/models/task_from_instanciation_object.rb +31 -0
  232. data/lib/roby/coordination/models/task_from_variable.rb +27 -0
  233. data/lib/roby/coordination/models/task_with_dependencies.rb +48 -0
  234. data/lib/roby/coordination/models/variable.rb +32 -0
  235. data/lib/roby/coordination/script.rb +200 -0
  236. data/lib/roby/coordination/script_instruction.rb +12 -0
  237. data/lib/roby/coordination/task.rb +45 -0
  238. data/lib/roby/coordination/task_base.rb +69 -0
  239. data/lib/roby/coordination/task_script.rb +293 -0
  240. data/lib/roby/coordination/task_state_machine.rb +308 -0
  241. data/lib/roby/decision_control.rb +33 -21
  242. data/lib/roby/distributed_object.rb +76 -0
  243. data/lib/roby/droby.rb +17 -0
  244. data/lib/roby/droby/droby_id.rb +6 -0
  245. data/lib/roby/droby/enable.rb +153 -0
  246. data/lib/roby/droby/event_logger.rb +189 -0
  247. data/lib/roby/droby/event_logging.rb +57 -0
  248. data/lib/roby/droby/exceptions.rb +14 -0
  249. data/lib/roby/droby/identifiable.rb +22 -0
  250. data/lib/roby/droby/logfile.rb +141 -0
  251. data/lib/roby/droby/logfile/client.rb +176 -0
  252. data/lib/roby/droby/logfile/file_format.md +97 -0
  253. data/lib/roby/droby/logfile/index.rb +117 -0
  254. data/lib/roby/droby/logfile/reader.rb +139 -0
  255. data/lib/roby/droby/logfile/server.rb +199 -0
  256. data/lib/roby/droby/logfile/writer.rb +114 -0
  257. data/lib/roby/droby/marshal.rb +264 -0
  258. data/lib/roby/droby/marshallable.rb +12 -0
  259. data/lib/roby/droby/null_event_logger.rb +25 -0
  260. data/lib/roby/droby/object_manager.rb +205 -0
  261. data/lib/roby/droby/peer_id.rb +6 -0
  262. data/lib/roby/droby/plan_rebuilder.rb +373 -0
  263. data/lib/roby/droby/rebuilt_plan.rb +160 -0
  264. data/lib/roby/droby/remote_droby_id.rb +6 -0
  265. data/lib/roby/droby/timepoints.rb +205 -0
  266. data/lib/roby/droby/timepoints_ctf.metadata.erb +101 -0
  267. data/lib/roby/droby/timepoints_ctf.rb +125 -0
  268. data/lib/roby/droby/v5.rb +14 -0
  269. data/lib/roby/droby/v5/builtin.rb +120 -0
  270. data/lib/roby/droby/v5/droby_class.rb +45 -0
  271. data/lib/roby/droby/v5/droby_constant.rb +81 -0
  272. data/lib/roby/droby/v5/droby_dump.rb +1026 -0
  273. data/lib/roby/droby/v5/droby_id.rb +44 -0
  274. data/lib/roby/droby/v5/droby_model.rb +82 -0
  275. data/lib/roby/droby/v5/peer_id.rb +10 -0
  276. data/lib/roby/droby/v5/remote_droby_id.rb +42 -0
  277. data/lib/roby/event.rb +79 -957
  278. data/lib/roby/event_constraints.rb +835 -0
  279. data/lib/roby/event_generator.rb +1047 -0
  280. data/lib/roby/event_structure/causal_link.rb +6 -0
  281. data/lib/roby/event_structure/forwarding.rb +6 -0
  282. data/lib/roby/event_structure/precedence.rb +7 -0
  283. data/lib/roby/event_structure/signal.rb +8 -0
  284. data/lib/roby/event_structure/temporal_constraints.rb +640 -0
  285. data/lib/roby/exceptions.rb +446 -152
  286. data/lib/roby/executable_plan.rb +549 -0
  287. data/lib/roby/execution_engine.rb +1997 -950
  288. data/lib/roby/filter_generator.rb +26 -0
  289. data/lib/roby/gui/chronicle_view.rb +225 -0
  290. data/lib/roby/gui/chronicle_widget.rb +925 -0
  291. data/lib/roby/gui/dot_id.rb +11 -0
  292. data/lib/roby/gui/exception_view.rb +44 -0
  293. data/lib/roby/gui/log_display.rb +273 -0
  294. data/lib/roby/gui/model_views.rb +2 -0
  295. data/lib/roby/gui/model_views/action_interface.rb +53 -0
  296. data/lib/roby/gui/model_views/task.rb +47 -0
  297. data/lib/roby/gui/model_views/task.rhtml +41 -0
  298. data/lib/roby/gui/object_info_view.rb +89 -0
  299. data/lib/roby/gui/plan_dot_layout.rb +427 -0
  300. data/lib/roby/gui/plan_rebuilder_widget.rb +357 -0
  301. data/lib/roby/gui/qt4_toMSecsSinceEpoch.rb +8 -0
  302. data/lib/roby/gui/relations_view.rb +278 -0
  303. data/lib/roby/gui/relations_view/relations.ui +139 -0
  304. data/lib/roby/gui/relations_view/relations_canvas.rb +1088 -0
  305. data/lib/roby/gui/relations_view/relations_config.rb +292 -0
  306. data/lib/roby/gui/relations_view/relations_view.ui +53 -0
  307. data/lib/roby/gui/scheduler_view.css +24 -0
  308. data/lib/roby/gui/scheduler_view.rb +46 -0
  309. data/lib/roby/gui/scheduler_view.rhtml +53 -0
  310. data/lib/roby/gui/stepping.rb +93 -0
  311. data/lib/roby/gui/stepping.ui +181 -0
  312. data/lib/roby/gui/styles.rb +81 -0
  313. data/lib/roby/gui/task_display_configuration.rb +42 -0
  314. data/lib/roby/gui/task_state_at.rb +38 -0
  315. data/lib/roby/hooks.rb +26 -0
  316. data/lib/roby/interface.rb +136 -469
  317. data/lib/roby/interface/async.rb +20 -0
  318. data/lib/roby/interface/async/action_monitor.rb +188 -0
  319. data/lib/roby/interface/async/interface.rb +498 -0
  320. data/lib/roby/interface/async/job_monitor.rb +213 -0
  321. data/lib/roby/interface/async/log.rb +238 -0
  322. data/lib/roby/interface/async/new_job_listener.rb +79 -0
  323. data/lib/roby/interface/async/ui_connector.rb +183 -0
  324. data/lib/roby/interface/client.rb +553 -0
  325. data/lib/roby/interface/command.rb +24 -0
  326. data/lib/roby/interface/command_argument.rb +16 -0
  327. data/lib/roby/interface/command_library.rb +92 -0
  328. data/lib/roby/interface/droby_channel.rb +174 -0
  329. data/lib/roby/interface/exceptions.rb +22 -0
  330. data/lib/roby/interface/interface.rb +655 -0
  331. data/lib/roby/interface/job.rb +47 -0
  332. data/lib/roby/interface/rest.rb +10 -0
  333. data/lib/roby/interface/rest/api.rb +29 -0
  334. data/lib/roby/interface/rest/helpers.rb +24 -0
  335. data/lib/roby/interface/rest/server.rb +212 -0
  336. data/lib/roby/interface/server.rb +154 -0
  337. data/lib/roby/interface/shell_client.rb +468 -0
  338. data/lib/roby/interface/shell_subcommand.rb +24 -0
  339. data/lib/roby/interface/subcommand_client.rb +35 -0
  340. data/lib/roby/interface/tcp.rb +168 -0
  341. data/lib/roby/models/arguments.rb +112 -0
  342. data/lib/roby/models/plan_object.rb +83 -0
  343. data/lib/roby/models/task.rb +835 -0
  344. data/lib/roby/models/task_event.rb +62 -0
  345. data/lib/roby/models/task_service.rb +78 -0
  346. data/lib/roby/or_generator.rb +88 -0
  347. data/lib/roby/plan.rb +1751 -864
  348. data/lib/roby/plan_object.rb +611 -0
  349. data/lib/roby/plan_service.rb +200 -0
  350. data/lib/roby/promise.rb +332 -0
  351. data/lib/roby/queries.rb +23 -0
  352. data/lib/roby/queries/and_matcher.rb +32 -0
  353. data/lib/roby/queries/any.rb +27 -0
  354. data/lib/roby/queries/code_error_matcher.rb +58 -0
  355. data/lib/roby/queries/event_generator_matcher.rb +9 -0
  356. data/lib/roby/queries/execution_exception_matcher.rb +165 -0
  357. data/lib/roby/queries/index.rb +165 -0
  358. data/lib/roby/queries/localized_error_matcher.rb +149 -0
  359. data/lib/roby/queries/matcher_base.rb +107 -0
  360. data/lib/roby/queries/none.rb +27 -0
  361. data/lib/roby/queries/not_matcher.rb +30 -0
  362. data/lib/roby/queries/op_matcher.rb +8 -0
  363. data/lib/roby/queries/or_matcher.rb +30 -0
  364. data/lib/roby/queries/plan_object_matcher.rb +363 -0
  365. data/lib/roby/queries/query.rb +188 -0
  366. data/lib/roby/queries/task_event_generator_matcher.rb +86 -0
  367. data/lib/roby/queries/task_matcher.rb +344 -0
  368. data/lib/roby/relations.rb +42 -678
  369. data/lib/roby/relations/bidirectional_directed_adjacency_graph.rb +492 -0
  370. data/lib/roby/relations/directed_relation_support.rb +268 -0
  371. data/lib/roby/relations/event_relation_graph.rb +19 -0
  372. data/lib/roby/relations/fork_merge_visitor.rb +154 -0
  373. data/lib/roby/relations/graph.rb +533 -0
  374. data/lib/roby/relations/models/directed_relation_support.rb +11 -0
  375. data/lib/roby/relations/models/graph.rb +75 -0
  376. data/lib/roby/relations/models/task_relation_graph.rb +18 -0
  377. data/lib/roby/relations/space.rb +380 -0
  378. data/lib/roby/relations/task_relation_graph.rb +20 -0
  379. data/lib/roby/robot.rb +85 -38
  380. data/lib/roby/schedulers/basic.rb +155 -25
  381. data/lib/roby/schedulers/null.rb +20 -0
  382. data/lib/roby/schedulers/reporting.rb +31 -0
  383. data/lib/roby/schedulers/state.rb +129 -0
  384. data/lib/roby/schedulers/temporal.rb +91 -0
  385. data/lib/roby/singletons.rb +87 -0
  386. data/lib/roby/standalone.rb +4 -2
  387. data/lib/roby/standard_errors.rb +405 -82
  388. data/lib/roby/state.rb +6 -3
  389. data/lib/roby/state/conf_model.rb +5 -0
  390. data/lib/roby/state/events.rb +181 -95
  391. data/lib/roby/state/goal_model.rb +77 -0
  392. data/lib/roby/state/open_struct.rb +591 -0
  393. data/lib/roby/state/open_struct_model.rb +68 -0
  394. data/lib/roby/state/pos.rb +45 -45
  395. data/lib/roby/state/shapes.rb +11 -11
  396. data/lib/roby/state/state_model.rb +303 -0
  397. data/lib/roby/state/task.rb +43 -0
  398. data/lib/roby/support.rb +88 -148
  399. data/lib/roby/task.rb +1361 -1750
  400. data/lib/roby/task_arguments.rb +428 -0
  401. data/lib/roby/task_event.rb +127 -0
  402. data/lib/roby/task_event_generator.rb +337 -0
  403. data/lib/roby/task_service.rb +6 -0
  404. data/lib/roby/task_structure/conflicts.rb +104 -0
  405. data/lib/roby/task_structure/dependency.rb +932 -0
  406. data/lib/roby/task_structure/error_handling.rb +118 -0
  407. data/lib/roby/task_structure/executed_by.rb +234 -0
  408. data/lib/roby/task_structure/planned_by.rb +90 -0
  409. data/lib/roby/tasks/aggregator.rb +37 -0
  410. data/lib/roby/tasks/external_process.rb +275 -0
  411. data/lib/roby/tasks/group.rb +27 -0
  412. data/lib/roby/tasks/null.rb +19 -0
  413. data/lib/roby/tasks/parallel.rb +43 -0
  414. data/lib/roby/tasks/sequence.rb +88 -0
  415. data/lib/roby/tasks/simple.rb +21 -0
  416. data/lib/roby/{thread_task.rb → tasks/thread.rb} +50 -24
  417. data/lib/roby/tasks/timeout.rb +17 -0
  418. data/lib/roby/tasks/virtual.rb +55 -0
  419. data/lib/roby/template_plan.rb +7 -0
  420. data/lib/roby/test/aruba_minitest.rb +74 -0
  421. data/lib/roby/test/assertion.rb +16 -0
  422. data/lib/roby/test/assertions.rb +490 -0
  423. data/lib/roby/test/common.rb +368 -591
  424. data/lib/roby/test/dsl.rb +149 -0
  425. data/lib/roby/test/error.rb +18 -0
  426. data/lib/roby/test/event_reporter.rb +83 -0
  427. data/lib/roby/test/execution_expectations.rb +1134 -0
  428. data/lib/roby/test/expect_execution.rb +151 -0
  429. data/lib/roby/test/minitest_helpers.rb +166 -0
  430. data/lib/roby/test/roby_app_helpers.rb +200 -0
  431. data/lib/roby/test/run_planners.rb +155 -0
  432. data/lib/roby/test/self.rb +112 -0
  433. data/lib/roby/test/spec.rb +198 -0
  434. data/lib/roby/test/tasks/empty_task.rb +4 -4
  435. data/lib/roby/test/tasks/goto.rb +28 -27
  436. data/lib/roby/test/teardown_plans.rb +100 -0
  437. data/lib/roby/test/testcase.rb +239 -307
  438. data/lib/roby/test/tools.rb +159 -155
  439. data/lib/roby/test/validate_state_machine.rb +75 -0
  440. data/lib/roby/transaction.rb +1125 -0
  441. data/lib/roby/transaction/event_generator_proxy.rb +63 -0
  442. data/lib/roby/transaction/plan_object_proxy.rb +99 -0
  443. data/lib/roby/transaction/plan_service_proxy.rb +43 -0
  444. data/lib/roby/transaction/proxying.rb +120 -0
  445. data/lib/roby/transaction/task_event_generator_proxy.rb +19 -0
  446. data/lib/roby/transaction/task_proxy.rb +135 -0
  447. data/lib/roby/until_generator.rb +30 -0
  448. data/lib/roby/version.rb +5 -0
  449. data/lib/roby/yard.rb +169 -0
  450. data/lib/yard-roby.rb +1 -0
  451. data/manifest.xml +32 -6
  452. data/roby.gemspec +59 -0
  453. metadata +788 -587
  454. data/Manifest.txt +0 -321
  455. data/NOTES +0 -4
  456. data/README.txt +0 -166
  457. data/TODO.txt +0 -146
  458. data/app/README.txt +0 -24
  459. data/app/Rakefile +0 -8
  460. data/app/config/ROBOT.rb +0 -5
  461. data/app/config/init.rb +0 -33
  462. data/app/config/roby.yml +0 -3
  463. data/app/controllers/ROBOT.rb +0 -2
  464. data/app/planners/ROBOT/main.rb +0 -6
  465. data/app/planners/main.rb +0 -5
  466. data/app/scripts/distributed +0 -3
  467. data/app/scripts/generate/bookmarks +0 -3
  468. data/app/scripts/replay +0 -3
  469. data/app/scripts/results +0 -3
  470. data/app/scripts/run +0 -3
  471. data/app/scripts/server +0 -3
  472. data/app/scripts/shell +0 -3
  473. data/app/scripts/test +0 -3
  474. data/app/tasks/.gitattributes +0 -0
  475. data/app/tasks/ROBOT/.gitattributes +0 -0
  476. data/bin/roby-shell +0 -25
  477. data/doc/guide/src/basics/app.page +0 -139
  478. data/doc/guide/src/basics/index.page +0 -11
  479. data/doc/guide/src/basics/log_replay/goForward_1.png +0 -0
  480. data/doc/guide/src/basics/log_replay/goForward_2.png +0 -0
  481. data/doc/guide/src/basics/log_replay/goForward_3.png +0 -0
  482. data/doc/guide/src/basics/log_replay/goForward_5.png +0 -0
  483. data/doc/guide/src/basics/log_replay/plan_repair_4.png +0 -0
  484. data/doc/guide/src/basics/log_replay/roby_log_main_window.png +0 -0
  485. data/doc/guide/src/basics/relations_display.page +0 -203
  486. data/doc/guide/src/basics/shell.page +0 -102
  487. data/doc/guide/src/default.css +0 -319
  488. data/doc/guide/src/introduction/index.page +0 -29
  489. data/doc/guide/src/introduction/publications.page +0 -14
  490. data/doc/guide/src/relations/dependency.page +0 -89
  491. data/doc/guide/src/relations/index.page +0 -12
  492. data/ext/droby/dump.cc +0 -175
  493. data/ext/droby/extconf.rb +0 -3
  494. data/ext/graph/algorithm.cc +0 -746
  495. data/ext/graph/extconf.rb +0 -7
  496. data/ext/graph/graph.cc +0 -575
  497. data/ext/graph/graph.hh +0 -183
  498. data/ext/graph/iterator_sequence.hh +0 -102
  499. data/ext/graph/undirected_dfs.hh +0 -226
  500. data/ext/graph/undirected_graph.hh +0 -421
  501. data/lib/roby/app/scripts/generate/bookmarks.rb +0 -162
  502. data/lib/roby/app/scripts/replay.rb +0 -31
  503. data/lib/roby/app/scripts/server.rb +0 -18
  504. data/lib/roby/basic_object.rb +0 -151
  505. data/lib/roby/config.rb +0 -14
  506. data/lib/roby/distributed.rb +0 -36
  507. data/lib/roby/distributed/base.rb +0 -448
  508. data/lib/roby/distributed/communication.rb +0 -875
  509. data/lib/roby/distributed/connection_space.rb +0 -616
  510. data/lib/roby/distributed/distributed_object.rb +0 -206
  511. data/lib/roby/distributed/drb.rb +0 -62
  512. data/lib/roby/distributed/notifications.rb +0 -531
  513. data/lib/roby/distributed/peer.rb +0 -555
  514. data/lib/roby/distributed/protocol.rb +0 -529
  515. data/lib/roby/distributed/proxy.rb +0 -343
  516. data/lib/roby/distributed/subscription.rb +0 -311
  517. data/lib/roby/distributed/transaction.rb +0 -498
  518. data/lib/roby/external_process_task.rb +0 -225
  519. data/lib/roby/graph.rb +0 -160
  520. data/lib/roby/log.rb +0 -3
  521. data/lib/roby/log/chronicle.rb +0 -303
  522. data/lib/roby/log/console.rb +0 -74
  523. data/lib/roby/log/data_stream.rb +0 -275
  524. data/lib/roby/log/dot.rb +0 -279
  525. data/lib/roby/log/event_stream.rb +0 -161
  526. data/lib/roby/log/file.rb +0 -396
  527. data/lib/roby/log/gui/basic_display.ui +0 -83
  528. data/lib/roby/log/gui/basic_display_ui.rb +0 -89
  529. data/lib/roby/log/gui/chronicle.rb +0 -26
  530. data/lib/roby/log/gui/chronicle_view.rb +0 -40
  531. data/lib/roby/log/gui/chronicle_view.ui +0 -70
  532. data/lib/roby/log/gui/chronicle_view_ui.rb +0 -90
  533. data/lib/roby/log/gui/data_displays.rb +0 -171
  534. data/lib/roby/log/gui/data_displays.ui +0 -155
  535. data/lib/roby/log/gui/data_displays_ui.rb +0 -146
  536. data/lib/roby/log/gui/notifications.rb +0 -26
  537. data/lib/roby/log/gui/relations.rb +0 -269
  538. data/lib/roby/log/gui/relations.ui +0 -123
  539. data/lib/roby/log/gui/relations_ui.rb +0 -120
  540. data/lib/roby/log/gui/relations_view.rb +0 -185
  541. data/lib/roby/log/gui/relations_view.ui +0 -149
  542. data/lib/roby/log/gui/relations_view_ui.rb +0 -144
  543. data/lib/roby/log/gui/replay.rb +0 -366
  544. data/lib/roby/log/gui/replay_controls.rb +0 -206
  545. data/lib/roby/log/gui/replay_controls.ui +0 -282
  546. data/lib/roby/log/gui/replay_controls_ui.rb +0 -249
  547. data/lib/roby/log/gui/runtime.rb +0 -130
  548. data/lib/roby/log/hooks.rb +0 -186
  549. data/lib/roby/log/logger.rb +0 -203
  550. data/lib/roby/log/notifications.rb +0 -244
  551. data/lib/roby/log/plan_rebuilder.rb +0 -468
  552. data/lib/roby/log/relations.rb +0 -1084
  553. data/lib/roby/log/server.rb +0 -547
  554. data/lib/roby/log/sqlite.rb +0 -47
  555. data/lib/roby/log/timings.rb +0 -233
  556. data/lib/roby/plan-object.rb +0 -371
  557. data/lib/roby/planning.rb +0 -13
  558. data/lib/roby/planning/loops.rb +0 -309
  559. data/lib/roby/planning/model.rb +0 -1012
  560. data/lib/roby/planning/task.rb +0 -180
  561. data/lib/roby/query.rb +0 -655
  562. data/lib/roby/relations/conflicts.rb +0 -67
  563. data/lib/roby/relations/dependency.rb +0 -358
  564. data/lib/roby/relations/ensured.rb +0 -19
  565. data/lib/roby/relations/error_handling.rb +0 -22
  566. data/lib/roby/relations/events.rb +0 -7
  567. data/lib/roby/relations/executed_by.rb +0 -208
  568. data/lib/roby/relations/influence.rb +0 -10
  569. data/lib/roby/relations/planned_by.rb +0 -63
  570. data/lib/roby/state/information.rb +0 -55
  571. data/lib/roby/state/state.rb +0 -367
  572. data/lib/roby/task-operations.rb +0 -186
  573. data/lib/roby/task_index.rb +0 -80
  574. data/lib/roby/test/distributed.rb +0 -230
  575. data/lib/roby/test/tasks/simple_task.rb +0 -23
  576. data/lib/roby/transactions.rb +0 -507
  577. data/lib/roby/transactions/proxy.rb +0 -325
  578. data/plugins/fault_injection/History.txt +0 -4
  579. data/plugins/fault_injection/README.txt +0 -34
  580. data/plugins/fault_injection/Rakefile +0 -12
  581. data/plugins/fault_injection/TODO.txt +0 -0
  582. data/plugins/fault_injection/app.rb +0 -52
  583. data/plugins/fault_injection/fault_injection.rb +0 -89
  584. data/plugins/fault_injection/test/test_fault_injection.rb +0 -78
  585. data/plugins/subsystems/README.txt +0 -37
  586. data/plugins/subsystems/Rakefile +0 -13
  587. data/plugins/subsystems/app.rb +0 -182
  588. data/plugins/subsystems/test/app/README +0 -24
  589. data/plugins/subsystems/test/app/Rakefile +0 -8
  590. data/plugins/subsystems/test/app/config/app.yml +0 -71
  591. data/plugins/subsystems/test/app/config/init.rb +0 -12
  592. data/plugins/subsystems/test/app/config/roby.yml +0 -3
  593. data/plugins/subsystems/test/app/planners/main.rb +0 -20
  594. data/plugins/subsystems/test/app/scripts/distributed +0 -3
  595. data/plugins/subsystems/test/app/scripts/replay +0 -3
  596. data/plugins/subsystems/test/app/scripts/results +0 -3
  597. data/plugins/subsystems/test/app/scripts/run +0 -3
  598. data/plugins/subsystems/test/app/scripts/server +0 -3
  599. data/plugins/subsystems/test/app/scripts/shell +0 -3
  600. data/plugins/subsystems/test/app/scripts/test +0 -3
  601. data/plugins/subsystems/test/app/tasks/services.rb +0 -15
  602. data/plugins/subsystems/test/test_subsystems.rb +0 -78
  603. data/test/distributed/test_communication.rb +0 -195
  604. data/test/distributed/test_connection.rb +0 -284
  605. data/test/distributed/test_execution.rb +0 -378
  606. data/test/distributed/test_mixed_plan.rb +0 -341
  607. data/test/distributed/test_plan_notifications.rb +0 -238
  608. data/test/distributed/test_protocol.rb +0 -525
  609. data/test/distributed/test_query.rb +0 -106
  610. data/test/distributed/test_remote_plan.rb +0 -491
  611. data/test/distributed/test_transaction.rb +0 -466
  612. data/test/mockups/external_process +0 -28
  613. data/test/mockups/tasks.rb +0 -27
  614. data/test/planning/test_loops.rb +0 -432
  615. data/test/planning/test_model.rb +0 -427
  616. data/test/planning/test_task.rb +0 -126
  617. data/test/relations/test_conflicts.rb +0 -42
  618. data/test/relations/test_dependency.rb +0 -324
  619. data/test/relations/test_ensured.rb +0 -38
  620. data/test/relations/test_executed_by.rb +0 -224
  621. data/test/relations/test_planned_by.rb +0 -56
  622. data/test/suite_core.rb +0 -29
  623. data/test/suite_distributed.rb +0 -10
  624. data/test/suite_planning.rb +0 -4
  625. data/test/suite_relations.rb +0 -8
  626. data/test/tasks/test_external_process.rb +0 -126
  627. data/test/tasks/test_thread_task.rb +0 -70
  628. data/test/test_bgl.rb +0 -528
  629. data/test/test_event.rb +0 -969
  630. data/test/test_exceptions.rb +0 -591
  631. data/test/test_execution_engine.rb +0 -987
  632. data/test/test_gui.rb +0 -20
  633. data/test/test_interface.rb +0 -43
  634. data/test/test_log.rb +0 -125
  635. data/test/test_log_server.rb +0 -133
  636. data/test/test_plan.rb +0 -418
  637. data/test/test_query.rb +0 -424
  638. data/test/test_relations.rb +0 -260
  639. data/test/test_state.rb +0 -432
  640. data/test/test_support.rb +0 -16
  641. data/test/test_task.rb +0 -1181
  642. data/test/test_testcase.rb +0 -138
  643. data/test/test_transactions.rb +0 -610
  644. data/test/test_transactions_proxy.rb +0 -216
@@ -0,0 +1,188 @@
1
+ module Roby
2
+ module Queries
3
+ # A query is a TaskMatcher that applies on a plan. It should, in general, be
4
+ # preferred to TaskMatcher as it uses task indexes to be more efficient.
5
+ #
6
+ # Queries cache their result. I.e. once #each has been called to get the
7
+ # query results, the query will always return the same results until #reset
8
+ # has been called.
9
+ class Query < TaskMatcher
10
+ # The plan this query acts on
11
+ attr_reader :plan
12
+
13
+ # Create a query object on the given plan
14
+ def initialize(plan = nil)
15
+ @scope = :global
16
+ @plan = plan
17
+ super()
18
+ @plan_predicates = Set.new
19
+ @neg_plan_predicates = Set.new
20
+ end
21
+
22
+ def query
23
+ self
24
+ end
25
+
26
+ # Search scope for queries on transactions. If equal to :local, the
27
+ # query will apply only on the scope of the searched transaction,
28
+ # otherwise it applies on a virtual plan that is the result of the
29
+ # transaction stack being applied.
30
+ #
31
+ # The default is :global.
32
+ #
33
+ # See #local_scope and #global_scope
34
+ attr_reader :scope
35
+
36
+ # Changes the scope of this query. See #scope.
37
+ def local_scope
38
+ @scope = :local
39
+ self
40
+ end
41
+ # Changes the scope of this query. See #scope.
42
+ def global_scope
43
+ @scope = :global
44
+ self
45
+ end
46
+
47
+ # Changes the plan this query works on. This calls #reset (obviously)
48
+ def plan=(new_plan)
49
+ reset
50
+ @plan = new_plan
51
+ end
52
+
53
+ # The set of tasks which match in plan. This is a cached value, so use
54
+ # #reset to actually recompute this set.
55
+ def result_set
56
+ @result_set ||= plan.query_result_set(self)
57
+ end
58
+
59
+ def indexed_sets(index)
60
+ positive_sets, negative_sets = super
61
+
62
+ if plan_predicates.include?(:mission_task?)
63
+ positive_sets << plan.mission_tasks
64
+ elsif neg_plan_predicates.include?(:mission_task?)
65
+ negative_sets << plan.mission_tasks
66
+ end
67
+
68
+ if plan_predicates.include?(:permanent_task?)
69
+ positive_sets << plan.permanent_tasks
70
+ elsif neg_plan_predicates.include?(:permanent_task?)
71
+ negative_sets << plan.permanent_tasks
72
+ end
73
+ return positive_sets, negative_sets
74
+ end
75
+
76
+ # Reinitializes the cached query result.
77
+ #
78
+ # Queries cache their result, i.e. #each will always return the same
79
+ # task set. #reset makes sure that the next call to #each will return
80
+ # the same value.
81
+ def reset
82
+ @result_set = nil
83
+ self
84
+ end
85
+
86
+ # The set of predicates of Plan which must return true for #=== to
87
+ # return true
88
+ attr_reader :plan_predicates
89
+ # The set of predicates of Plan which must return false for #=== to
90
+ # return true.
91
+ attr_reader :neg_plan_predicates
92
+
93
+ class << self
94
+ # For each name in +names+, define the #name and #not_name methods
95
+ # on Query objects. When one of these methods is called on a Query
96
+ # object, plan.name?(task) must return true (resp. false) for the
97
+ # task to match.
98
+ def match_plan_predicates(names)
99
+ names.each do |name, predicate_name|
100
+ predicate_name ||= name
101
+ class_eval <<-EOD, __FILE__, __LINE__+1
102
+ def #{name}
103
+ if neg_plan_predicates.include?(:#{predicate_name})
104
+ raise ArgumentError, "trying to match (#{name} & !#{name})"
105
+ end
106
+ plan_predicates << :#{predicate_name}
107
+ self
108
+ end
109
+ def not_#{name}
110
+ if plan_predicates.include?(:#{predicate_name})
111
+ raise ArgumentError, "trying to match (#{name} & !#{name})"
112
+ end
113
+ neg_plan_predicates << :#{predicate_name}
114
+ self
115
+ end
116
+ EOD
117
+ end
118
+ end
119
+ end
120
+
121
+ ##
122
+ # :method: mission
123
+ #
124
+ # Filters missions
125
+ #
126
+ # Matches tasks in plan that are missions
127
+
128
+ ##
129
+ # :method: not_mission
130
+ #
131
+ # Filters out missions
132
+ #
133
+ # Matches tasks in plan that are not missions
134
+
135
+ ##
136
+ # :method: permanent
137
+ #
138
+ # Filters permanent tasks
139
+ #
140
+ # Matches tasks in plan that are declared as permanent tasks.
141
+
142
+ ##
143
+ # :method: not_permanent
144
+ #
145
+ # Filters out permanent tasks
146
+ #
147
+ # Matches tasks in plan that are not declared as permanent tasks
148
+
149
+ match_plan_predicates mission: :mission_task?
150
+ match_plan_predicates permanent: :permanent_task?
151
+
152
+ # Filters tasks which have no parents in the query itself.
153
+ #
154
+ # Will filter out tasks which have parents in +relation+ that are
155
+ # included in the query result.
156
+ def roots(relation)
157
+ @result_set = plan.query_roots(result_set, relation)
158
+ self
159
+ end
160
+
161
+ # True if +task+ matches the query. Call #result_set to have the set of
162
+ # tasks which match in the given plan.
163
+ def ===(task)
164
+ for pred in plan_predicates
165
+ return unless plan.send(pred, task)
166
+ end
167
+ for neg_pred in neg_plan_predicates
168
+ return if plan.send(neg_pred, task)
169
+ end
170
+
171
+ return unless super
172
+
173
+ true
174
+ end
175
+
176
+ # Iterates on all the tasks in the given plan which match the query
177
+ #
178
+ # This set is cached, i.e. #each will yield the same task set until
179
+ # #reset is called.
180
+ def each(&block)
181
+ return enum_for(__method__) if !block_given?
182
+ plan.query_each(result_set, &block)
183
+ end
184
+ include Enumerable
185
+ end
186
+ end
187
+ end
188
+
@@ -0,0 +1,86 @@
1
+ module Roby
2
+ module Queries
3
+ # Object that allows to describe a task's event generator and match it
4
+ # in the plan
5
+ #
6
+ # It uses a task matcher to match the underlying task
7
+ class TaskEventGeneratorMatcher < PlanObjectMatcher
8
+ # @return [#===] the required event name
9
+ attr_reader :symbol
10
+ # @return [TaskMatcher] the task matcher that describes this event's
11
+ # task
12
+ attr_reader :task_matcher
13
+ # @return [Boolean] if true, self will match the specified generator
14
+ # as well as any other generator that is forwarded to it. If false
15
+ # (the default) only the specified generator will match
16
+ attr_predicate :generalized?
17
+
18
+ def initialize(task_matcher = Roby::Task.match, symbol = Queries.any)
19
+ if symbol.respond_to?(:to_sym) # Probably a symbol, convert to string
20
+ symbol = symbol.to_s
21
+ end
22
+ @symbol = symbol
23
+ @task_matcher = task_matcher
24
+ @generalized = false
25
+ super()
26
+ end
27
+
28
+ # Makes this matcher a generalized matcher
29
+ # @see #generalized?
30
+ # @return self
31
+ def generalized
32
+ @generalized = true
33
+ self
34
+ end
35
+
36
+ # Adds a matching object for the event's name
37
+ #
38
+ # @param [Regexp,Symbol,String,#===] symbol an object that will
39
+ # allow to match the event's name
40
+ # @return self
41
+ def with_name(symbol)
42
+ @symbol =
43
+ if symbol.respond_to?(:to_sym) then symbol.to_s
44
+ else symbol
45
+ end
46
+ self
47
+ end
48
+
49
+ # @raise [NotImplementedError] Cannot yet do plan queries on task
50
+ # event generators
51
+ def filter(initial_set, index)
52
+ raise NotImplementedError
53
+ end
54
+
55
+ alias plan_object_match :===
56
+
57
+ def to_s
58
+ "#{task_matcher}.#{symbol}"
59
+ end
60
+
61
+ # Tests whether the given task event generator matches self
62
+ #
63
+ # @param [TaskEventGenerator] object
64
+ # @return [Boolean]
65
+ def ===(object)
66
+ return if !object.kind_of?(TaskEventGenerator)
67
+
68
+ if match_not_generalized(object)
69
+ true
70
+ elsif generalized? && object.plan
71
+ forwarding_graph = object.relation_graph_for(EventStructure::Forwarding)
72
+ forwarding_graph.depth_first_visit(object) do |generator|
73
+ return true if match_not_generalized(generator)
74
+ end
75
+ false
76
+ end
77
+ end
78
+
79
+ def match_not_generalized(object)
80
+ (symbol === object.symbol.to_s) &&
81
+ plan_object_match(object) && (task_matcher === object.task)
82
+ end
83
+ end
84
+ end
85
+ end
86
+
@@ -0,0 +1,344 @@
1
+ module Roby
2
+ module Queries
3
+
4
+ # This class represents a predicate which can be used to filter tasks. To
5
+ # filter plan-related properties, use Query.
6
+ #
7
+ # A TaskMatcher object is a AND combination of various tests against tasks.
8
+ #
9
+ # For instance, if one does
10
+ #
11
+ # matcher = TaskMatcher.new.which_fullfills(Tasks::Simple).pending
12
+ #
13
+ # Then
14
+ #
15
+ # matcher === task
16
+ #
17
+ # will return true if +task+ is an instance of the Tasks::Simple model and
18
+ # is pending (not started yet), and false if one of these two
19
+ # characteristics is not true.
20
+ class TaskMatcher < PlanObjectMatcher
21
+ # Set of arguments that should be tested on the task
22
+ #
23
+ # @return [Hash]
24
+ attr_reader :arguments
25
+
26
+ # Initializes an empty TaskMatcher object
27
+ def initialize
28
+ super
29
+ @arguments = Hash.new
30
+ @interruptible = nil
31
+ end
32
+
33
+ def to_s
34
+ result = super
35
+ if !arguments.empty?
36
+ result << ".with_arguments(#{arguments.map { |k, v| ":#{k} => #{v}" }.join(", ")})"
37
+ end
38
+ result
39
+ end
40
+
41
+ # Filters on task model and arguments
42
+ #
43
+ # Will match if the task is an instance of +model+ or one of its
44
+ # subclasses, and if parts of its arguments are the ones provided. Set
45
+ # +arguments+ to nil if you don't want to filter on arguments.
46
+ def which_fullfills(model, arguments = nil)
47
+ with_model(model)
48
+ if arguments
49
+ with_model_arguments(arguments)
50
+ end
51
+ self
52
+ end
53
+
54
+ # Filters on the arguments that are declared in the model
55
+ #
56
+ # Will match if the task arguments for which there is a value in
57
+ # +arguments+ are set to that very value, only looking at arguments that
58
+ # are defined in the model set by #with_model.
59
+ #
60
+ # See also #with_arguments
61
+ #
62
+ # Example:
63
+ #
64
+ # class TaskModel < Roby::Task
65
+ # argument :a
66
+ # argument :b
67
+ # end
68
+ # task = TaskModel.new(a: 10, b: 20)
69
+ #
70
+ # # Matches on :a, :b is ignored altogether
71
+ # TaskMatcher.new.
72
+ # with_model(TaskModel).
73
+ # with_model_arguments(a: 10) === task # => true
74
+ # # Looks for both :a and :b
75
+ # TaskMatcher.new.
76
+ # with_model(TaskModel).
77
+ # with_model_arguments(a: 10, b: 30) === task # => false
78
+ # # Matches on :a, :c is ignored as it is not an argument of +TaskModel+
79
+ # TaskMatcher.new.
80
+ # with_model(TaskModel).
81
+ # with_model_arguments(a: 10, c: 30) === task # => true
82
+ #
83
+ # In general, one would use #which_fullfills, which sets both the model
84
+ # and the model arguments
85
+ def with_model_arguments(arguments)
86
+ valid_arguments = model.inject(Array.new) { |set, model| set | model.arguments.to_a }
87
+ with_arguments(arguments.slice(*valid_arguments))
88
+ self
89
+ end
90
+
91
+ # Filters on the arguments that are declared in the model
92
+ #
93
+ # Will match if the task arguments for which there is a value in
94
+ # +arguments+ are set to that very value. Unlike #with_model_arguments,
95
+ # all values set in +arguments+ are considered.
96
+ #
97
+ # See also #with_model_arguments
98
+ #
99
+ # Example:
100
+ #
101
+ # class TaskModel < Roby::Task
102
+ # argument :a
103
+ # argument :b
104
+ # end
105
+ # task = TaskModel.new(a: 10, b: 20)
106
+ #
107
+ # # Matches on :a, :b is ignored altogether
108
+ # TaskMatcher.new.
109
+ # with_arguments(a: 10) === task # => true
110
+ # # Looks for both :a and :b
111
+ # TaskMatcher.new.
112
+ # with_arguments(a: 10, b: 30) === task # => false
113
+ # # Looks for both :a and :c, even though :c is not declared in TaskModel
114
+ # TaskMatcher.new.
115
+ # with_arguments(a: 10, c: 30) === task # => false
116
+ def with_arguments(arguments)
117
+ @arguments ||= Hash.new
118
+ self.arguments.merge!(arguments) do |k, old, new|
119
+ if old != new
120
+ raise ArgumentError, "a constraint has already been set on the #{k} argument"
121
+ end
122
+ old
123
+ end
124
+ self
125
+ end
126
+
127
+ ##
128
+ # :method: fully_instanciated
129
+ #
130
+ # Matches if the task is fully instanciated
131
+ #
132
+ # See also #partially_instanciated, Task#fully_instanciated?
133
+
134
+ ##
135
+ # :method: partially_instanciated
136
+ #
137
+ # Matches if the task is partially instanciated
138
+ #
139
+ # See also #fully_instanciated, Task#partially_instanciated?
140
+
141
+ ##
142
+ # :method: not_abstract
143
+ #
144
+ # Matches if the task is not abstract
145
+ #
146
+ # See also #abstract, Task#abstract?
147
+
148
+ ##
149
+ # :method: abstract
150
+ #
151
+ # Matches if the task is abstract
152
+ #
153
+ # See also #not_abstract, Task#abstract?
154
+
155
+ ##
156
+ # :method: not_abstract
157
+ #
158
+ # Matches if the task is not abstract
159
+ #
160
+ # See also #abstract, Task#abstract?
161
+
162
+ ##
163
+ # :method: pending
164
+ #
165
+ # Matches if the task is pending
166
+ #
167
+ # See also #not_pending, Task#pending?
168
+
169
+ ##
170
+ # :method: not_pending
171
+ #
172
+ # Matches if the task is not pending
173
+ #
174
+ # See also #pending, Task#pending?
175
+
176
+ ##
177
+ # :method: running
178
+ #
179
+ # Matches if the task is running
180
+ #
181
+ # See also #not_running, Task#running?
182
+
183
+ ##
184
+ # :method: not_running
185
+ #
186
+ # Matches if the task is not running
187
+ #
188
+ # See also #running, Task#running?
189
+
190
+ ##
191
+ # :method: finished
192
+ #
193
+ # Matches if the task is finished
194
+ #
195
+ # See also #not_finished, Task#finished?
196
+
197
+ ##
198
+ # :method: not_finished
199
+ #
200
+ # Matches if the task is not finished
201
+ #
202
+ # See also #finished, Task#finished?
203
+
204
+ ##
205
+ # :method: success
206
+ #
207
+ # Matches if the task is success
208
+ #
209
+ # See also #not_success, Task#success?
210
+
211
+ ##
212
+ # :method: not_success
213
+ #
214
+ # Matches if the task is not success
215
+ #
216
+ # See also #success, Task#success?
217
+
218
+ ##
219
+ # :method: failed
220
+ #
221
+ # Matches if the task is failed
222
+ #
223
+ # See also #not_failed, Task#failed?
224
+
225
+ ##
226
+ # :method: not_failed
227
+ #
228
+ # Matches if the task is not failed
229
+ #
230
+ # See also #failed, Task#failed?
231
+
232
+ ##
233
+ # :method: interruptible
234
+ #
235
+ # Matches if the task is interruptible
236
+ #
237
+ # See also #not_interruptible, Task#interruptible?
238
+
239
+ ##
240
+ # :method: not_interruptible
241
+ #
242
+ # Matches if the task is not interruptible
243
+ #
244
+ # See also #interruptible, Task#interruptible?
245
+
246
+ ##
247
+ # :method: finishing
248
+ #
249
+ # Matches if the task is finishing
250
+ #
251
+ # See also #not_finishing, Task#finishing?
252
+
253
+ ##
254
+ # :method: not_finishing
255
+ #
256
+ # Matches if the task is not finishing
257
+ #
258
+ # See also #finishing, Task#finishing?
259
+
260
+ match_predicates :abstract?, :partially_instanciated?, :fully_instanciated?,
261
+ :starting?, :pending?, :running?, :finished?, :success?, :failed?, :interruptible?
262
+
263
+ # Finishing tasks are also running task, use the index on 'running'
264
+ match_predicate :finishing?, [[:running?], []]
265
+
266
+ # Reusable tasks must be neither finishing nor finished
267
+ match_predicate :reusable?, [[], [:finished?]]
268
+
269
+
270
+ # Helper method for #with_child and #with_parent
271
+ def handle_parent_child_arguments(other_query, relation, relation_options) # :nodoc:
272
+ if !other_query.kind_of?(TaskMatcher) && !other_query.kind_of?(Task)
273
+ if relation.kind_of?(Hash)
274
+ arguments = relation
275
+ relation = (arguments.delete(:relation) || arguments.delete('relation'))
276
+ relation_options = (arguments.delete(:relation_options) || arguments.delete('relation_options'))
277
+ else
278
+ arguments = Hash.new
279
+ end
280
+ other_query = TaskMatcher.which_fullfills(other_query, arguments)
281
+ end
282
+ return relation, [other_query, relation_options]
283
+ end
284
+ # True if +task+ matches all the criteria defined on this object.
285
+ def ===(task)
286
+ return unless task.kind_of?(Roby::Task)
287
+ return unless task.arguments.slice(*arguments.keys) == arguments
288
+ return super
289
+ end
290
+
291
+ # Returns true if filtering with this TaskMatcher using #=== is
292
+ # equivalent to calling #filter() using a Index. This is used to
293
+ # avoid an explicit O(N) filtering step after filter() has been called
294
+ def indexed_query?
295
+ arguments.empty? && super
296
+ end
297
+
298
+ def find_event(event_name)
299
+ event_name = event_name.to_sym
300
+ models = if !@model.empty?
301
+ @model
302
+ else [Roby::Task]
303
+ end
304
+ models.each do |m|
305
+ if event_m = m.find_event(event_name)
306
+ return TaskEventGeneratorMatcher.new(self, event_name)
307
+ end
308
+ end
309
+ nil
310
+ end
311
+
312
+ def respond_to_missing?(m, include_private)
313
+ m =~ /_event$/ || super
314
+ end
315
+
316
+ def method_missing(m, *args)
317
+ if m =~ /_event$/
318
+ event_name = $`
319
+ model = find_event(event_name)
320
+ if !model
321
+ task_models =
322
+ if !@model.empty?
323
+ @model
324
+ else [Roby::Task]
325
+ end
326
+ raise NoMethodError.new(m), "no event '#{event_name}' in match model #{task_models.map(&:to_s).join(", ")}, use #which_fullfills to narrow the task model"
327
+ elsif !args.empty?
328
+ raise ArgumentError, "#{m} expected zero arguments, got #{args.size}"
329
+ else
330
+ return TaskEventGeneratorMatcher.new(self, event_name)
331
+ end
332
+ else
333
+ super
334
+ end
335
+ end
336
+
337
+ # Define singleton classes. For instance, calling TaskMatcher.which_fullfills is equivalent
338
+ # to TaskMatcher.new.which_fullfills
339
+ declare_class_methods :which_fullfills, :with_arguments
340
+ end
341
+ end
342
+ end
343
+
344
+