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,49 +1,189 @@
1
+ require 'roby'
2
+ require 'rake'
3
+ require 'rake/tasklib'
4
+
1
5
  module Roby
2
- # This module contains some tools used in the Rakefile of both Roby core
3
- # and plugins
4
- module Rake
5
- # Returns the rdoc template path the documentation
6
- # generation should be using in Rakefile
7
- #
8
- # Two non-standard templates are provided:
9
- # allison[http://blog.evanweaver.com/files/doc/fauna/allison/files/README.html]
10
- # and jamis[http://weblog.jamisbuck.org/2005/4/8/rdoc-template]. The
11
- # default is jamis. Allison is nicer, but the javascript-based indexes
12
- # are slow given the count of classes and methods there is in Roby.
13
- def self.rdoc_template
14
- if ENV['ROBY_RDOC_TEMPLATE']
15
- if ENV['ROBY_RDOC_TEMPLATE'] == 'jamis'
16
- Roby::Rake.info "using in-source jamis template"
17
- File.expand_path('doc/styles/jamis', ROBY_ROOT_DIR)
18
- elsif ENV['ROBY_RDOC_TEMPLATE'] == 'allison'
19
- Roby::Rake.info "using in-source allison template"
20
- File.expand_path('doc/styles/allison', ROBY_ROOT_DIR)
21
- else
22
- Roby::Rake.info "using the #{ENV['ROBY_RDOC_TEMPLATE']} template"
23
- ENV['ROBY_RDOC_TEMPLATE']
6
+ module App
7
+ # Rake task definitions for the Roby apps
8
+ module Rake
9
+ # Rake task to run the Roby tests
10
+ #
11
+ # To use, add the following to your Rakefile:
12
+ #
13
+ # require 'roby/app/rake'
14
+ # Roby::App::Rake::TestTask.new
15
+ #
16
+ # It create a test task per robot configuration, named
17
+ # "test:${robot_name}". It also creates a test:all-robots task that
18
+ # runs each robot's configuration in sequence. You can inspect these
19
+ # tasks with
20
+ #
21
+ # rake --tasks
22
+ #
23
+ # and call them with e.g.
24
+ #
25
+ # rake test:default
26
+ #
27
+ # The test:all-robots task will fail only at the end of all tests, reporting
28
+ # which configuration actually failed. To stop at the first failure,
29
+ # pass a '0' as argument, e.g.
30
+ #
31
+ # rake 'test:all-robots[0]'
32
+ #
33
+ # Finally, the 'test:all' target runs syskit test --all (i.e. runs
34
+ # all tests in the default robot configuration)
35
+ #
36
+ # The 'test' target points by default to test:all-robots. See below
37
+ # to change this.
38
+ #
39
+ # The following examples show how to fine-tune the creates tests:
40
+ #
41
+ # @example restrict the tests to run only under the
42
+ # 'only_this_configuration' configuration
43
+ #
44
+ # Roby::App::Rake::TestTask.new do |t|
45
+ # t.robot_names = ['only_this_configuration']
46
+ # end
47
+ #
48
+ # @example create tasks under the roby_tests namespace instead of 'test'
49
+ #
50
+ # Roby::App::Rake::TestCase.new('roby_tests')
51
+ #
52
+ # @example make 'test' point to 'test:all'
53
+ #
54
+ # Roby::App::Rake::TestCase.new do |t|
55
+ # t.all_by_default = true
56
+ # end
57
+ #
58
+ class TestTask < ::Rake::TaskLib
59
+ # The base test task name
60
+ attr_reader :task_name
61
+
62
+ # The app
63
+ #
64
+ # It defaults to Roby.app
65
+ attr_accessor :app
66
+
67
+ # The list of robot configurations on which we should run the tests
68
+ #
69
+ # Use 'default' for the default configuration. It defaults to all
70
+ # the robots defined in config/robots/
71
+ #
72
+ # @return [Array<String,(String,String)>]
73
+ attr_accessor :robot_names
74
+
75
+ # Patterns matching excluded test files
76
+ #
77
+ # It accepts any string that File.fnmatch? accepts
78
+ #
79
+ # @return [Array<String>]
80
+ attr_accessor :excludes
81
+
82
+ # Whether the 'test' target should run all robot tests (false, the
83
+ # default) or the 'all tests' target (true)
84
+ attr_predicate :all_by_default?, true
85
+
86
+ def initialize(task_name = 'test', all_by_default: false)
87
+ @task_name = task_name
88
+ @app = Roby.app
89
+ @all_by_default = all_by_default
90
+ @robot_names = discover_robot_names
91
+ @excludes = []
92
+ yield self if block_given?
93
+ define
24
94
  end
25
- end
26
- end
27
95
 
28
- # Invoke the given target in all plugins found in plugins/ that define it
29
- def self.invoke_plugin_target(target)
30
- ENV['ROBY_ROOT_DIR'] = ROBY_ROOT_DIR
31
- Dir.new('plugins').each do |plugin_dir|
32
- next if plugin_dir =~ /^\.{1,2}$/
33
-
34
- plugin_dir = File.join('plugins', plugin_dir)
35
- if File.file? File.join(plugin_dir, 'Rakefile')
36
- Dir.chdir(plugin_dir) do
37
- task_list = `rake --tasks`.split("\n")
38
- if !task_list.grep(/^rake #{target}(\s|$)/).empty?
39
- if !system 'rake', target
40
- raise "failed to call rake target #{target} in #{plugin_dir}"
96
+ class Failed < RuntimeError; end
97
+
98
+ def define
99
+ each_robot do |robot_name, robot_type|
100
+ task_name = task_name_for_robot(robot_name, robot_type)
101
+
102
+ desc "run the tests for configuration #{robot_name}:#{robot_type}"
103
+ task task_name do
104
+ if !run_roby_test('-r', "#{robot_name},#{robot_type}")
105
+ raise Failed.new("failed to run tests for #{robot_name}:#{robot_type}")
106
+ end
107
+ end
108
+ end
109
+
110
+ desc "run tests for all known robots"
111
+ task "#{task_name}:all-robots", [:keep_going] do |t, args|
112
+ failures = Array.new
113
+ keep_going = args.fetch(:keep_going, '1') == '1'
114
+ each_robot do |robot_name, robot_type|
115
+ if !run_roby_test('-r', "#{robot_name},#{robot_type}")
116
+ if keep_going
117
+ failures << [robot_name, robot_type]
118
+ else
119
+ raise Failed.new("failed to run tests for #{robot_name}:#{robot_type}")
120
+ end
41
121
  end
42
122
  end
123
+ if !failures.empty?
124
+ raise Failed.new("failed to run the following test(s): #{failures.map { |name, type| "#{name}:#{type}" }.join(", ")}")
125
+ end
126
+ end
127
+
128
+ desc "run all tests"
129
+ task "#{task_name}:all" do
130
+ if !run_roby_test
131
+ raise Failed.new("failed to run tests")
132
+ end
133
+ end
134
+
135
+ if all_by_default?
136
+ desc "run all tests"
137
+ task task_name => "#{task_name}:all"
138
+ else
139
+ desc "run all robot tests"
140
+ task task_name => "#{task_name}:all-robots"
141
+ end
142
+ end
143
+
144
+ def task_name_for_robot(robot_name, robot_type)
145
+ if robot_name == robot_type
146
+ "#{task_name}:#{robot_name}"
147
+ else
148
+ "#{task_name}:#{robot_name}-#{robot_type}"
43
149
  end
44
150
  end
151
+
152
+ def run_roby_test(*args)
153
+ args = args + excludes.flat_map do |pattern|
154
+ ["--exclude", pattern]
155
+ end
156
+ run_roby('test', *args)
157
+ end
158
+
159
+ def run_roby(*args)
160
+ pid = spawn(Gem.ruby, File.expand_path(File.join('..', '..', '..', 'bin', 'roby'), __dir__),
161
+ *args)
162
+ begin
163
+ _, status = Process.waitpid2(pid)
164
+ status.success?
165
+ rescue Interrupt
166
+ Process.kill pid
167
+ Process.waitpid(pid)
168
+ end
169
+ end
170
+
171
+ # Enumerate the robots on which tests should be run
172
+ def each_robot(&block)
173
+ robot_names.each(&block)
174
+ end
175
+
176
+ # @api private
177
+ #
178
+ # Discover which robots are available on the current app
179
+ def discover_robot_names
180
+ if !app.app_dir
181
+ app.guess_app_dir
182
+ end
183
+ app.setup_robot_names_from_config_dir
184
+ app.robots.each.to_a
185
+ end
45
186
  end
46
187
  end
47
188
  end
48
189
  end
49
-
@@ -0,0 +1,9 @@
1
+ module Roby
2
+ module App
3
+ # Class that holds the robot-specific configuration blocks as defined
4
+ # inside
5
+ class RobotConfig
6
+ end
7
+ end
8
+ end
9
+
@@ -0,0 +1,115 @@
1
+ module Roby
2
+ module App
3
+ # The part of the configuration related to robot declaration
4
+ class RobotNames
5
+ # @return [String,nil] the default robot name
6
+ attr_reader :default_robot_name
7
+ # @return [Hash<(String,String)>] the set of declared robots, as
8
+ # robot_name => robot_type
9
+ attr_reader :robots
10
+ # @return [Hash<String,String>] a set of aliases, i.e. short names
11
+ # for robots
12
+ attr_reader :aliases
13
+ # @return [Boolean] if true, Roby will generate an error if a
14
+ # non-declared robot is used. Otherwise, it will only issue a
15
+ # warning
16
+ attr_predicate :strict?, true
17
+
18
+ # Create a RobotConfiguration object based on a hash formatted as-is
19
+ # from the app.yml file
20
+ def initialize(options = Hash.new)
21
+ @robots = options['robots'] || Hash.new
22
+ @default_robot_name = options['default_robot'] || 'default'
23
+ if !has_robot?(default_robot_name)
24
+ robots[default_robot_name] = default_robot_name
25
+ end
26
+
27
+ @aliases = options['aliases'] || Hash.new
28
+ aliases.each do |name_alias, name|
29
+ if !has_robot?(name)
30
+ raise ArgumentError, "cannot use #{name_alias} as an alias to #{name}: #{name} is not a declared robot"
31
+ end
32
+ if has_robot?(name_alias)
33
+ raise ArgumentError, "cannot use #{name_alias} as an alias to #{name}: #{name_alias} is already a declared robot"
34
+ end
35
+ end
36
+
37
+ self.strict = !!options['robots']
38
+ end
39
+
40
+ # Declare the type of an existing robot
41
+ def declare_robot_type(robot_name, robot_type)
42
+ if strict? && !has_robot?(robot_type)
43
+ raise ArgumentError, "#{robot_type} is not a known robot"
44
+ end
45
+ robots[robot_name] = robot_type
46
+ end
47
+
48
+ # Enumerate the robot names and types
49
+ def each(&block)
50
+ robots.each(&block)
51
+ end
52
+
53
+ # Enumerate the list of known robots
54
+ #
55
+ # @yieldparam [String] robot_name the robot name
56
+ def names
57
+ robots.keys
58
+ end
59
+
60
+ # @return [String,nil] the type of the default robot
61
+ def default_robot_type
62
+ if default_robot_name
63
+ robots[default_robot_name]
64
+ end
65
+ end
66
+
67
+ # Tests whether the given name is a declared robot
68
+ #
69
+ # @return [Boolean]
70
+ def has_robot?(name, type = nil)
71
+ robots.has_key?(name.to_s) &&
72
+ (!type || robots[name.to_s] == type.to_s)
73
+ end
74
+
75
+ # Helper method which either warns or raises depending on the
76
+ # value of {#strict?}
77
+ def error(klass, message)
78
+ if strict?
79
+ raise klass, message
80
+ else
81
+ Roby::Application.warn message
82
+ end
83
+ end
84
+
85
+ # Returns the robot name and type matching the given name
86
+ #
87
+ # It resolves aliases
88
+ #
89
+ # @param [String] name a robot name or alias
90
+ # @return [(String,String)]
91
+ # @raises ArgumentError if the given robot name does not exist
92
+ def resolve(name, type = nil)
93
+ robot_name = aliases[name] || name || default_robot_name
94
+ if !robot_name
95
+ error(ArgumentError, "no robot name given and no default name declared in app.yml, defaulting to #{default_robot_name}:#{default_robot_type}")
96
+ return default_robot_name, default_robot_type
97
+ elsif robots.has_key?(robot_name)
98
+ robot_type = robots[robot_name]
99
+ type ||= robot_type
100
+ if type != robot_type
101
+ error(ArgumentError, "invalid robot type when resolving #{name}:#{type}, #{name} is declared to be of type #{robot_type}")
102
+ end
103
+ return robot_name, type
104
+ else
105
+ if !robots.empty? || strict?
106
+ error(Application::NoSuchRobot, "#{name} is neither a robot name, nor an alias. Known names: #{robots.keys.sort.join(", ")}, known aliases: #{aliases.keys.join(", ")}")
107
+ end
108
+ return robot_name, (type || robot_name)
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
114
+
115
+
@@ -3,11 +3,12 @@
3
3
  app = Roby.app
4
4
  require 'optparse'
5
5
  parser = OptionParser.new do |opt|
6
+ opt.banner = "#{$0} [options] [robot_name [robot_type]]"
6
7
  opt.on("--sim", "run in simulation mode") do
7
- app.simulation
8
+ app.simulation
8
9
  end
9
10
  opt.on("--single", "run in mono-robot mode") do
10
- app.single
11
+ app.single
11
12
  end
12
13
  end
13
14
  parser.parse!(ARGV)
@@ -0,0 +1,72 @@
1
+ require 'optparse'
2
+ require 'roby/standalone'
3
+ require 'roby/interface'
4
+
5
+ module Roby
6
+ module App
7
+ module Scripts
8
+ # Common implementation for scripts whose main functionality
9
+ # requires to connect to Roby's remote interface
10
+ #
11
+ # @example basic usage
12
+ # require 'roby/app/scripts'
13
+ # Roby::App::Scripts::InterfaceScript.run(*ARGV) do |interface|
14
+ # # Do stuff with the roby interface
15
+ # end
16
+ #
17
+ class InterfaceScript
18
+ attr_reader :app
19
+ attr_reader :host
20
+
21
+ def initialize(app = Roby.app,
22
+ default_host: app.shell_interface_host || 'localhost',
23
+ default_port: app.shell_interface_port || Interface::DEFAULT_PORT)
24
+ @app = app
25
+ @host_options = Hash[host: default_host, port: default_port]
26
+ end
27
+
28
+ def setup_option_parser(parser)
29
+ Roby::Application.host_options(parser, @host_options)
30
+ end
31
+
32
+ def default_option_parser(banner: "")
33
+ parser = OptionParser.new
34
+ parser.banner = banner
35
+ setup_option_parser(parser)
36
+ parser
37
+ end
38
+
39
+ def host
40
+ return *@host_options.values_at(:host, :port)
41
+ end
42
+
43
+ def run(*args, banner: "",
44
+ option_parser: default_option_parser(banner: banner))
45
+
46
+ app.guess_app_dir
47
+ app.shell
48
+ app.single
49
+ app.load_base_config
50
+
51
+ args = option_parser.parse(args)
52
+ host, port = self.host
53
+ interface = Roby::Interface.connect_with_tcp_to(host, port)
54
+ yield(interface)
55
+ end
56
+
57
+ def self.run(*args, banner: '', &block)
58
+ Roby.display_exception do
59
+ begin
60
+ new.run(*args, banner: banner, &block)
61
+ rescue Roby::Interface::ConnectionError => e
62
+ Robot.fatal e.message
63
+ rescue Interrupt
64
+ Robot.warn "Interrupted by user"
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
72
+
@@ -0,0 +1,173 @@
1
+ require 'autorespawn'
2
+ require 'roby'
3
+ require 'roby/test/spec'
4
+ require 'optparse'
5
+ require 'drb'
6
+
7
+ Robot.logger.level = Logger::WARN
8
+
9
+ app = Roby.app
10
+ app.require_app_dir
11
+ app.public_logs = false
12
+ app.single = true
13
+ app.simulation = true
14
+ app.testing = true
15
+ app.auto_load_models = false
16
+
17
+ MetaRuby.keep_definition_location = false
18
+
19
+ modes = []
20
+ robots = []
21
+ cmdline_args = []
22
+ all_robots = false
23
+ server_pid = nil
24
+
25
+ parser = OptionParser.new do |opt|
26
+ opt.on('--verbose', 'display INFO messages') do |val|
27
+ cmdline_args << "--verbose"
28
+ Roby.logger.level = Logger::INFO
29
+ end
30
+ opt.on('--debug', 'display DEBUG messages') do |val|
31
+ cmdline_args << "--debug"
32
+ Roby.logger.level = Logger::DEBUG
33
+ end
34
+ opt.on('-s', '--sim', 'run test in simulation (stubbing)') do |val|
35
+ modes << '--sim'
36
+ end
37
+ opt.on("-l", "--live", "run tests in live mode") do |val|
38
+ modes << '--live'
39
+ end
40
+ opt.on '--all-robots', 'run tests for all robots' do
41
+ all_robots = true
42
+ end
43
+ opt.on('-r NAME', '--robot=NAME[,TYPE]', String, 'a robot name and type to add to the test matrix') do |name|
44
+ robots << name
45
+ end
46
+ opt.on("-k", "--keep-logs", "keep all logs") do |val|
47
+ cmdline_args << '--keep-logs'
48
+ end
49
+ opt.on('--server=PID', Integer, 'the minitest server PID (used to generate a drbunix path)') do |pid|
50
+ server_pid = pid
51
+ cmdline_args << "--server" << pid.to_s
52
+ end
53
+ Roby::Application.common_optparse_setup(opt)
54
+ end
55
+
56
+ test_files = parser.parse(ARGV)
57
+
58
+ if !server_pid
59
+ require 'roby/app/test_server'
60
+ require 'roby/app/autotest_console_reporter'
61
+ manager = Autorespawn::Manager.new(name: Hash[cmdline: "#{$0} #{ARGV.join(" ")}"])
62
+ server_pid = Process.pid
63
+ server = Roby::App::TestServer.start(Process.pid)
64
+ server_console_output = Roby::App::AutotestConsoleReporter.new(server, manager)
65
+ cmdline_args << '--server' << server_pid.to_s
66
+ else
67
+ DRb.start_service
68
+ manager = Autorespawn.new
69
+ end
70
+
71
+ require 'roby/app/test_reporter'
72
+ reporter = Roby::App::TestReporter.new(Process.pid, manager.name, server_pid)
73
+
74
+ Roby.display_exception do
75
+ Roby.app.setup_robot_names_from_config_dir
76
+ if all_robots
77
+ robots = Roby.app.robots.names
78
+ end
79
+
80
+ process_id = Autorespawn.name || Hash.new
81
+
82
+ if robots.size > 1
83
+ reporter.discovery_start
84
+ robots.each do |name|
85
+ spawner.add_slave(
86
+ Gem.ruby, '-S', $0,
87
+ 'autotest', "--robot=#{name}", *modes, *cmdline_args, *test_files,
88
+ name: process_id.merge(robot: name))
89
+ end
90
+ reporter.discovery_finished
91
+ manager.run
92
+ exit 0
93
+ end
94
+
95
+ if robot_name = robots.first
96
+ process_id = process_id.merge(robot: robot_name)
97
+ cmdline_args << "--robot=#{robot_name}"
98
+ end
99
+
100
+ if modes.size > 1
101
+ reporter.discovery_start
102
+ modes.each do |m|
103
+ manager.add_slave(
104
+ Gem.ruby, '-S', $0, 'autotest', m, *cmdline_args, *test_files)
105
+ end
106
+ reporter.discovery_finished
107
+ manager.run
108
+ exit 0
109
+ end
110
+
111
+ if m = modes.first
112
+ Roby.app.simulation = (m != '--live')
113
+ process_id = process_id.merge(mode: m.gsub(/^--/, ''))
114
+ cmdline_args << m
115
+ end
116
+ if robot_name
117
+ Roby.app.robot robot_name
118
+ end
119
+
120
+ if test_files.size != 1 || !Autorespawn.slave?
121
+ Roby.app.setup
122
+ begin
123
+ reporter.discovery_start
124
+ if test_files.empty?
125
+ test_files = Roby.app.each_model.map do |m|
126
+ [m, Roby.app.test_file_for(m)]
127
+ end.compact
128
+ else
129
+ test_files = test_files.map { |path| [nil, path] }
130
+ end
131
+ test_files.each do |model, path|
132
+ if model
133
+ process_id = process_id.merge(model: model.name)
134
+ end
135
+
136
+ manager.add_slave(
137
+ Gem.ruby, '-S', $0, 'autotest', *cmdline_args, path,
138
+ name: process_id.merge(path: path))
139
+ end
140
+ reporter.discovery_finished
141
+ manager.run
142
+ ensure Roby.app.cleanup
143
+ end
144
+ exit 0
145
+ end
146
+
147
+ manager.on_exception do |e|
148
+ reporter.exception(e)
149
+ end
150
+ manager.run do
151
+ Roby.app.setup
152
+ require test_files.first
153
+ reporter.test_start
154
+ begin
155
+ Roby.app.prepare
156
+
157
+ begin
158
+ Minitest.__run reporter, Hash.new
159
+ rescue Interrupt
160
+ warn "Interrupted. Exiting..."
161
+ end
162
+ ensure
163
+ reporter.test_finished
164
+ Roby.app.shutdown
165
+ Roby.app.cleanup
166
+ if reporter.has_failures?
167
+ manager.exit_code 1
168
+ end
169
+ end
170
+ end
171
+ end
172
+
173
+