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.
- checksums.yaml +7 -0
- data/.deep-cover.rb +3 -0
- data/.gitattributes +1 -0
- data/.gitignore +24 -0
- data/.simplecov +10 -0
- data/.travis.yml +17 -0
- data/.yardopts +4 -0
- data/Gemfile +15 -0
- data/README.md +11 -0
- data/Rakefile +47 -177
- data/benchmark/{alloc_misc.rb → attic/alloc_misc.rb} +2 -2
- data/benchmark/{discovery_latency.rb → attic/discovery_latency.rb} +19 -19
- data/benchmark/{garbage_collection.rb → attic/garbage_collection.rb} +9 -9
- data/benchmark/{genom.rb → attic/genom.rb} +0 -0
- data/benchmark/attic/transactions.rb +62 -0
- data/benchmark/plan_basic_operations.rb +28 -0
- data/benchmark/relations/graph.rb +63 -0
- data/benchmark/ruby/identity.rb +18 -0
- data/benchmark/ruby/set_intersect_vs_hash_merge.rb +39 -0
- data/benchmark/ruby/yield_vs_block.rb +35 -0
- data/benchmark/run +5 -0
- data/benchmark/synthetic_plan_modifications_with_transactions.rb +79 -0
- data/benchmark/transactions.rb +99 -51
- data/bin/roby +38 -197
- data/bin/roby-display +14 -0
- data/bin/roby-log +3 -176
- data/doc/guide/{src → attic}/abstraction/achieve_with.page +1 -1
- data/doc/guide/{src → attic}/abstraction/forwarding.page +1 -1
- data/doc/guide/{src → attic}/abstraction/hierarchy.page +1 -1
- data/doc/guide/{src → attic}/abstraction/index.page +1 -1
- data/doc/guide/{src → attic}/abstraction/task_models.page +1 -1
- data/doc/guide/{overview.rdoc → attic/cycle/api_overview.rdoc} +6 -1
- data/doc/guide/{src → attic}/cycle/cycle-overview.png +0 -0
- data/doc/guide/{src → attic}/cycle/cycle-overview.svg +0 -0
- data/doc/guide/attic/cycle/error_handling.page +98 -0
- data/doc/guide/{src → attic}/cycle/error_instantaneous_repair.png +0 -0
- data/doc/guide/{src → attic}/cycle/error_instantaneous_repair.svg +0 -0
- data/doc/guide/{src/cycle/error_handling.page → attic/cycle/error_sources.page} +46 -89
- data/doc/guide/{src → attic}/cycle/garbage_collection.page +1 -1
- data/doc/guide/{src → attic}/cycle/index.page +1 -1
- data/doc/guide/{src → attic}/cycle/propagation.page +11 -1
- data/doc/guide/{src → attic}/cycle/propagation_diamond.png +0 -0
- data/doc/guide/{src → attic}/cycle/propagation_diamond.svg +0 -0
- data/doc/guide/attic/plans/building_plans.page +89 -0
- data/doc/guide/attic/plans/code.page +192 -0
- data/doc/guide/{src/basics → attic/plans}/events.page +3 -4
- data/doc/guide/attic/plans/index.page +7 -0
- data/doc/guide/{plan_modifications.rdoc → attic/plans/plan_modifications.rdoc} +5 -3
- data/doc/guide/{src/basics → attic/plans}/plan_objects.page +2 -1
- data/doc/guide/attic/plans/querying_plans.page +5 -0
- data/doc/guide/{src/basics → attic/plans}/tasks.page +20 -20
- data/doc/guide/config.yaml +7 -4
- data/doc/guide/ext/extended_menu.rb +29 -0
- data/doc/guide/ext/init.rb +6 -0
- data/doc/guide/ext/rdoc_links.rb +7 -6
- data/doc/guide/src/advanced_concepts/history.page +5 -0
- data/doc/guide/src/advanced_concepts/index.page +11 -0
- data/doc/guide/src/advanced_concepts/recognizing_patterns.page +83 -0
- data/doc/guide/src/advanced_concepts/scheduling.page +87 -0
- data/doc/guide/src/advanced_concepts/transactions.page +5 -0
- data/doc/guide/src/advanced_concepts/unreachability.page +42 -0
- data/doc/guide/src/base.template +96 -0
- data/doc/guide/src/basics_shell_header.txt +5 -7
- data/doc/guide/src/building/action_coordination.page +96 -0
- data/doc/guide/src/building/actions.page +124 -0
- data/doc/guide/src/building/file_layout.page +71 -0
- data/doc/guide/src/building/index.page +50 -0
- data/doc/guide/src/building/patterns.page +86 -0
- data/doc/guide/src/building/patterns_forwarding.png +0 -0
- data/doc/guide/src/building/patterns_forwarding.svg +277 -0
- data/doc/guide/src/building/runtime.page +95 -0
- data/doc/guide/src/building/task_models.page +94 -0
- data/doc/guide/src/building/tasks.page +284 -0
- data/doc/guide/src/concepts/error_handling.page +100 -0
- data/doc/guide/src/concepts/exception_propagation.png +0 -0
- data/doc/guide/src/concepts/exception_propagation.svg +445 -0
- data/doc/guide/src/concepts/execution.page +85 -0
- data/doc/guide/src/concepts/execution.png +0 -0
- data/doc/guide/src/concepts/execution.svg +573 -0
- data/doc/guide/src/concepts/execution_cycle.png +0 -0
- data/doc/guide/src/concepts/garbage_collection.page +57 -0
- data/doc/guide/src/concepts/index.page +27 -0
- data/doc/guide/src/concepts/plans.page +101 -0
- data/doc/guide/src/concepts/policy.page +31 -0
- data/doc/guide/src/concepts/reactor.page +61 -0
- data/doc/guide/src/concepts/simple_plan_example.png +0 -0
- data/doc/guide/src/concepts/simple_plan_example.svg +376 -0
- data/doc/guide/src/default.template +9 -74
- data/doc/guide/src/event_relations/forward.page +71 -0
- data/doc/guide/src/event_relations/index.page +12 -0
- data/doc/guide/src/event_relations/scheduling_constraints.page +43 -0
- data/doc/guide/src/event_relations/signal.page +55 -0
- data/doc/guide/src/event_relations/temporal_constraints.page +77 -0
- data/doc/guide/src/htmldoc.metainfo +21 -8
- data/doc/guide/src/index.page +8 -3
- data/doc/guide/src/{introduction/install.page → installation/index.page} +37 -25
- data/doc/guide/src/installation/publications.page +14 -0
- data/doc/guide/src/{introduction → installation}/videos.page +14 -7
- data/doc/guide/src/interacting/index.page +16 -0
- data/doc/guide/src/interacting/run.page +33 -0
- data/doc/guide/src/interacting/shell.page +95 -0
- data/doc/guide/src/plugins/creating_plugins.page +72 -0
- data/doc/guide/src/plugins/index.page +27 -5
- data/doc/guide/src/plugins/{fault_tolerance.page → standard_plugins/fault_tolerance.page} +2 -2
- data/doc/guide/src/plugins/standard_plugins/index.page +11 -0
- data/doc/guide/src/plugins/{subsystems.page → standard_plugins/subsystems.page} +2 -2
- data/doc/guide/src/style_screen.css +687 -0
- data/doc/guide/src/task_relations/dependency.page +107 -0
- data/doc/guide/src/task_relations/executed_by.page +77 -0
- data/doc/guide/src/task_relations/index.page +12 -0
- data/doc/guide/src/task_relations/new_relations.page +119 -0
- data/doc/guide/src/task_relations/planned_by.page +46 -0
- data/doc/guide/src/tutorial/app.page +117 -0
- data/doc/guide/src/{basics → tutorial}/code_examples.page +6 -5
- data/doc/guide/src/{basics → tutorial}/dry.page +15 -15
- data/doc/guide/src/{basics → tutorial}/errors.page +43 -68
- data/doc/guide/src/tutorial/events.page +195 -0
- data/doc/guide/src/{basics → tutorial}/hierarchy.page +53 -52
- data/doc/guide/src/tutorial/index.page +13 -0
- data/doc/guide/src/tutorial/log_replay/goForward_1.png +0 -0
- data/doc/guide/src/tutorial/log_replay/goForward_2.png +0 -0
- data/doc/guide/src/tutorial/log_replay/goForward_3.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/goForward_4.png +0 -0
- data/doc/guide/src/tutorial/log_replay/goForward_5.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_1.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_2.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_3.png +0 -0
- data/doc/guide/src/tutorial/log_replay/moveto_code_error.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_1.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_2.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_3.png +0 -0
- data/doc/guide/src/tutorial/log_replay/plan_repair_4.png +0 -0
- data/doc/guide/src/tutorial/log_replay/roby_log_main_window.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/roby_log_relation_window.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/roby_replay_event_representation.png +0 -0
- data/doc/guide/src/tutorial/relations_display.page +153 -0
- data/doc/guide/src/{basics → tutorial}/roby_cycle_overview.png +0 -0
- data/doc/guide/src/tutorial/shell.page +121 -0
- data/doc/guide/src/{basics → tutorial}/summary.page +1 -1
- data/doc/guide/src/tutorial/tasks.page +374 -0
- data/lib/roby.rb +102 -47
- data/lib/roby/actions.rb +17 -0
- data/lib/roby/actions/action.rb +80 -0
- data/lib/roby/actions/interface.rb +45 -0
- data/lib/roby/actions/library.rb +23 -0
- data/lib/roby/actions/models/action.rb +224 -0
- data/lib/roby/actions/models/coordination_action.rb +58 -0
- data/lib/roby/actions/models/interface.rb +22 -0
- data/lib/roby/actions/models/interface_base.rb +294 -0
- data/lib/roby/actions/models/library.rb +12 -0
- data/lib/roby/actions/models/method_action.rb +90 -0
- data/lib/roby/actions/task.rb +114 -0
- data/lib/roby/and_generator.rb +125 -0
- data/lib/roby/app.rb +2795 -829
- data/lib/roby/app/autotest_console_reporter.rb +138 -0
- data/lib/roby/app/base.rb +21 -0
- data/lib/roby/app/cucumber.rb +2 -0
- data/lib/roby/app/cucumber/controller.rb +439 -0
- data/lib/roby/app/cucumber/helpers.rb +280 -0
- data/lib/roby/app/cucumber/world.rb +32 -0
- data/lib/roby/app/debug.rb +136 -0
- data/lib/roby/app/gen.rb +2 -0
- data/lib/roby/app/rake.rb +178 -38
- data/lib/roby/app/robot_config.rb +9 -0
- data/lib/roby/app/robot_names.rb +115 -0
- data/lib/roby/app/run.rb +3 -2
- data/lib/roby/app/scripts.rb +72 -0
- data/lib/roby/app/scripts/autotest.rb +173 -0
- data/lib/roby/app/scripts/display.rb +2 -0
- data/lib/roby/app/scripts/restart.rb +52 -0
- data/lib/roby/app/scripts/results.rb +17 -8
- data/lib/roby/app/scripts/run.rb +155 -24
- data/lib/roby/app/scripts/shell.rb +147 -62
- data/lib/roby/app/scripts/test.rb +107 -22
- data/lib/roby/app/test_reporter.rb +74 -0
- data/lib/roby/app/test_server.rb +159 -0
- data/lib/roby/app/vagrant.rb +47 -0
- data/lib/roby/backports.rb +16 -0
- data/lib/roby/cli/display.rb +190 -0
- data/lib/roby/cli/exceptions.rb +17 -0
- data/lib/roby/cli/gen/actions/class.rb +5 -0
- data/lib/roby/cli/gen/actions/test.rb +6 -0
- data/lib/roby/cli/gen/app/.yardopts +6 -0
- data/lib/roby/cli/gen/app/README.md +28 -0
- data/lib/roby/cli/gen/app/Rakefile +15 -0
- data/{app → lib/roby/cli/gen/app}/config/app.yml +29 -39
- data/lib/roby/cli/gen/app/models/.gitattributes +1 -0
- data/{app → lib/roby/cli/gen/app/scripts}/controllers/.gitattributes +0 -0
- data/{app/data/.gitattributes → lib/roby/cli/gen/app/test/.gitignore} +0 -0
- data/lib/roby/cli/gen/class/class.rb +6 -0
- data/lib/roby/cli/gen/class/test.rb +7 -0
- data/lib/roby/cli/gen/helpers.rb +203 -0
- data/lib/roby/cli/gen/module/module.rb +5 -0
- data/lib/roby/cli/gen/module/test.rb +6 -0
- data/lib/roby/cli/gen/roby_app/config/init.rb +17 -0
- data/lib/roby/cli/gen/roby_app/config/robots/robot.rb +40 -0
- data/lib/roby/cli/gen/task/class.rb +44 -0
- data/lib/roby/cli/gen/task/test.rb +6 -0
- data/lib/roby/cli/gen_main.rb +120 -0
- data/lib/roby/cli/log.rb +276 -0
- data/lib/roby/cli/log/flamegraph.html +499 -0
- data/lib/roby/cli/log/flamegraph_renderer.rb +88 -0
- data/lib/roby/cli/main.rb +153 -0
- data/lib/roby/coordination.rb +60 -0
- data/lib/roby/coordination/action_script.rb +25 -0
- data/lib/roby/coordination/action_state_machine.rb +125 -0
- data/lib/roby/coordination/actions.rb +106 -0
- data/lib/roby/coordination/base.rb +145 -0
- data/lib/roby/coordination/calculus.rb +40 -0
- data/lib/roby/coordination/child.rb +28 -0
- data/lib/roby/coordination/event.rb +29 -0
- data/lib/roby/coordination/fault_handler.rb +25 -0
- data/lib/roby/coordination/fault_handling_task.rb +13 -0
- data/lib/roby/coordination/fault_response_table.rb +110 -0
- data/lib/roby/coordination/models/action_script.rb +64 -0
- data/lib/roby/coordination/models/action_state_machine.rb +224 -0
- data/lib/roby/coordination/models/actions.rb +191 -0
- data/lib/roby/coordination/models/arguments.rb +55 -0
- data/lib/roby/coordination/models/base.rb +176 -0
- data/lib/roby/coordination/models/capture.rb +86 -0
- data/lib/roby/coordination/models/child.rb +35 -0
- data/lib/roby/coordination/models/event.rb +41 -0
- data/lib/roby/coordination/models/exceptions.rb +42 -0
- data/lib/roby/coordination/models/fault_handler.rb +219 -0
- data/lib/roby/coordination/models/fault_response_table.rb +77 -0
- data/lib/roby/coordination/models/root.rb +22 -0
- data/lib/roby/coordination/models/script.rb +283 -0
- data/lib/roby/coordination/models/task.rb +184 -0
- data/lib/roby/coordination/models/task_from_action.rb +50 -0
- data/lib/roby/coordination/models/task_from_as_plan.rb +33 -0
- data/lib/roby/coordination/models/task_from_instanciation_object.rb +31 -0
- data/lib/roby/coordination/models/task_from_variable.rb +27 -0
- data/lib/roby/coordination/models/task_with_dependencies.rb +48 -0
- data/lib/roby/coordination/models/variable.rb +32 -0
- data/lib/roby/coordination/script.rb +200 -0
- data/lib/roby/coordination/script_instruction.rb +12 -0
- data/lib/roby/coordination/task.rb +45 -0
- data/lib/roby/coordination/task_base.rb +69 -0
- data/lib/roby/coordination/task_script.rb +293 -0
- data/lib/roby/coordination/task_state_machine.rb +308 -0
- data/lib/roby/decision_control.rb +33 -21
- data/lib/roby/distributed_object.rb +76 -0
- data/lib/roby/droby.rb +17 -0
- data/lib/roby/droby/droby_id.rb +6 -0
- data/lib/roby/droby/enable.rb +153 -0
- data/lib/roby/droby/event_logger.rb +189 -0
- data/lib/roby/droby/event_logging.rb +57 -0
- data/lib/roby/droby/exceptions.rb +14 -0
- data/lib/roby/droby/identifiable.rb +22 -0
- data/lib/roby/droby/logfile.rb +141 -0
- data/lib/roby/droby/logfile/client.rb +176 -0
- data/lib/roby/droby/logfile/file_format.md +97 -0
- data/lib/roby/droby/logfile/index.rb +117 -0
- data/lib/roby/droby/logfile/reader.rb +139 -0
- data/lib/roby/droby/logfile/server.rb +199 -0
- data/lib/roby/droby/logfile/writer.rb +114 -0
- data/lib/roby/droby/marshal.rb +264 -0
- data/lib/roby/droby/marshallable.rb +12 -0
- data/lib/roby/droby/null_event_logger.rb +25 -0
- data/lib/roby/droby/object_manager.rb +205 -0
- data/lib/roby/droby/peer_id.rb +6 -0
- data/lib/roby/droby/plan_rebuilder.rb +373 -0
- data/lib/roby/droby/rebuilt_plan.rb +160 -0
- data/lib/roby/droby/remote_droby_id.rb +6 -0
- data/lib/roby/droby/timepoints.rb +205 -0
- data/lib/roby/droby/timepoints_ctf.metadata.erb +101 -0
- data/lib/roby/droby/timepoints_ctf.rb +125 -0
- data/lib/roby/droby/v5.rb +14 -0
- data/lib/roby/droby/v5/builtin.rb +120 -0
- data/lib/roby/droby/v5/droby_class.rb +45 -0
- data/lib/roby/droby/v5/droby_constant.rb +81 -0
- data/lib/roby/droby/v5/droby_dump.rb +1026 -0
- data/lib/roby/droby/v5/droby_id.rb +44 -0
- data/lib/roby/droby/v5/droby_model.rb +82 -0
- data/lib/roby/droby/v5/peer_id.rb +10 -0
- data/lib/roby/droby/v5/remote_droby_id.rb +42 -0
- data/lib/roby/event.rb +79 -957
- data/lib/roby/event_constraints.rb +835 -0
- data/lib/roby/event_generator.rb +1047 -0
- data/lib/roby/event_structure/causal_link.rb +6 -0
- data/lib/roby/event_structure/forwarding.rb +6 -0
- data/lib/roby/event_structure/precedence.rb +7 -0
- data/lib/roby/event_structure/signal.rb +8 -0
- data/lib/roby/event_structure/temporal_constraints.rb +640 -0
- data/lib/roby/exceptions.rb +446 -152
- data/lib/roby/executable_plan.rb +549 -0
- data/lib/roby/execution_engine.rb +1997 -950
- data/lib/roby/filter_generator.rb +26 -0
- data/lib/roby/gui/chronicle_view.rb +225 -0
- data/lib/roby/gui/chronicle_widget.rb +925 -0
- data/lib/roby/gui/dot_id.rb +11 -0
- data/lib/roby/gui/exception_view.rb +44 -0
- data/lib/roby/gui/log_display.rb +273 -0
- data/lib/roby/gui/model_views.rb +2 -0
- data/lib/roby/gui/model_views/action_interface.rb +53 -0
- data/lib/roby/gui/model_views/task.rb +47 -0
- data/lib/roby/gui/model_views/task.rhtml +41 -0
- data/lib/roby/gui/object_info_view.rb +89 -0
- data/lib/roby/gui/plan_dot_layout.rb +427 -0
- data/lib/roby/gui/plan_rebuilder_widget.rb +357 -0
- data/lib/roby/gui/qt4_toMSecsSinceEpoch.rb +8 -0
- data/lib/roby/gui/relations_view.rb +278 -0
- data/lib/roby/gui/relations_view/relations.ui +139 -0
- data/lib/roby/gui/relations_view/relations_canvas.rb +1088 -0
- data/lib/roby/gui/relations_view/relations_config.rb +292 -0
- data/lib/roby/gui/relations_view/relations_view.ui +53 -0
- data/lib/roby/gui/scheduler_view.css +24 -0
- data/lib/roby/gui/scheduler_view.rb +46 -0
- data/lib/roby/gui/scheduler_view.rhtml +53 -0
- data/lib/roby/gui/stepping.rb +93 -0
- data/lib/roby/gui/stepping.ui +181 -0
- data/lib/roby/gui/styles.rb +81 -0
- data/lib/roby/gui/task_display_configuration.rb +42 -0
- data/lib/roby/gui/task_state_at.rb +38 -0
- data/lib/roby/hooks.rb +26 -0
- data/lib/roby/interface.rb +136 -469
- data/lib/roby/interface/async.rb +20 -0
- data/lib/roby/interface/async/action_monitor.rb +188 -0
- data/lib/roby/interface/async/interface.rb +498 -0
- data/lib/roby/interface/async/job_monitor.rb +213 -0
- data/lib/roby/interface/async/log.rb +238 -0
- data/lib/roby/interface/async/new_job_listener.rb +79 -0
- data/lib/roby/interface/async/ui_connector.rb +183 -0
- data/lib/roby/interface/client.rb +553 -0
- data/lib/roby/interface/command.rb +24 -0
- data/lib/roby/interface/command_argument.rb +16 -0
- data/lib/roby/interface/command_library.rb +92 -0
- data/lib/roby/interface/droby_channel.rb +174 -0
- data/lib/roby/interface/exceptions.rb +22 -0
- data/lib/roby/interface/interface.rb +655 -0
- data/lib/roby/interface/job.rb +47 -0
- data/lib/roby/interface/rest.rb +10 -0
- data/lib/roby/interface/rest/api.rb +29 -0
- data/lib/roby/interface/rest/helpers.rb +24 -0
- data/lib/roby/interface/rest/server.rb +212 -0
- data/lib/roby/interface/server.rb +154 -0
- data/lib/roby/interface/shell_client.rb +468 -0
- data/lib/roby/interface/shell_subcommand.rb +24 -0
- data/lib/roby/interface/subcommand_client.rb +35 -0
- data/lib/roby/interface/tcp.rb +168 -0
- data/lib/roby/models/arguments.rb +112 -0
- data/lib/roby/models/plan_object.rb +83 -0
- data/lib/roby/models/task.rb +835 -0
- data/lib/roby/models/task_event.rb +62 -0
- data/lib/roby/models/task_service.rb +78 -0
- data/lib/roby/or_generator.rb +88 -0
- data/lib/roby/plan.rb +1751 -864
- data/lib/roby/plan_object.rb +611 -0
- data/lib/roby/plan_service.rb +200 -0
- data/lib/roby/promise.rb +332 -0
- data/lib/roby/queries.rb +23 -0
- data/lib/roby/queries/and_matcher.rb +32 -0
- data/lib/roby/queries/any.rb +27 -0
- data/lib/roby/queries/code_error_matcher.rb +58 -0
- data/lib/roby/queries/event_generator_matcher.rb +9 -0
- data/lib/roby/queries/execution_exception_matcher.rb +165 -0
- data/lib/roby/queries/index.rb +165 -0
- data/lib/roby/queries/localized_error_matcher.rb +149 -0
- data/lib/roby/queries/matcher_base.rb +107 -0
- data/lib/roby/queries/none.rb +27 -0
- data/lib/roby/queries/not_matcher.rb +30 -0
- data/lib/roby/queries/op_matcher.rb +8 -0
- data/lib/roby/queries/or_matcher.rb +30 -0
- data/lib/roby/queries/plan_object_matcher.rb +363 -0
- data/lib/roby/queries/query.rb +188 -0
- data/lib/roby/queries/task_event_generator_matcher.rb +86 -0
- data/lib/roby/queries/task_matcher.rb +344 -0
- data/lib/roby/relations.rb +42 -678
- data/lib/roby/relations/bidirectional_directed_adjacency_graph.rb +492 -0
- data/lib/roby/relations/directed_relation_support.rb +268 -0
- data/lib/roby/relations/event_relation_graph.rb +19 -0
- data/lib/roby/relations/fork_merge_visitor.rb +154 -0
- data/lib/roby/relations/graph.rb +533 -0
- data/lib/roby/relations/models/directed_relation_support.rb +11 -0
- data/lib/roby/relations/models/graph.rb +75 -0
- data/lib/roby/relations/models/task_relation_graph.rb +18 -0
- data/lib/roby/relations/space.rb +380 -0
- data/lib/roby/relations/task_relation_graph.rb +20 -0
- data/lib/roby/robot.rb +85 -38
- data/lib/roby/schedulers/basic.rb +155 -25
- data/lib/roby/schedulers/null.rb +20 -0
- data/lib/roby/schedulers/reporting.rb +31 -0
- data/lib/roby/schedulers/state.rb +129 -0
- data/lib/roby/schedulers/temporal.rb +91 -0
- data/lib/roby/singletons.rb +87 -0
- data/lib/roby/standalone.rb +4 -2
- data/lib/roby/standard_errors.rb +405 -82
- data/lib/roby/state.rb +6 -3
- data/lib/roby/state/conf_model.rb +5 -0
- data/lib/roby/state/events.rb +181 -95
- data/lib/roby/state/goal_model.rb +77 -0
- data/lib/roby/state/open_struct.rb +591 -0
- data/lib/roby/state/open_struct_model.rb +68 -0
- data/lib/roby/state/pos.rb +45 -45
- data/lib/roby/state/shapes.rb +11 -11
- data/lib/roby/state/state_model.rb +303 -0
- data/lib/roby/state/task.rb +43 -0
- data/lib/roby/support.rb +88 -148
- data/lib/roby/task.rb +1361 -1750
- data/lib/roby/task_arguments.rb +428 -0
- data/lib/roby/task_event.rb +127 -0
- data/lib/roby/task_event_generator.rb +337 -0
- data/lib/roby/task_service.rb +6 -0
- data/lib/roby/task_structure/conflicts.rb +104 -0
- data/lib/roby/task_structure/dependency.rb +932 -0
- data/lib/roby/task_structure/error_handling.rb +118 -0
- data/lib/roby/task_structure/executed_by.rb +234 -0
- data/lib/roby/task_structure/planned_by.rb +90 -0
- data/lib/roby/tasks/aggregator.rb +37 -0
- data/lib/roby/tasks/external_process.rb +275 -0
- data/lib/roby/tasks/group.rb +27 -0
- data/lib/roby/tasks/null.rb +19 -0
- data/lib/roby/tasks/parallel.rb +43 -0
- data/lib/roby/tasks/sequence.rb +88 -0
- data/lib/roby/tasks/simple.rb +21 -0
- data/lib/roby/{thread_task.rb → tasks/thread.rb} +50 -24
- data/lib/roby/tasks/timeout.rb +17 -0
- data/lib/roby/tasks/virtual.rb +55 -0
- data/lib/roby/template_plan.rb +7 -0
- data/lib/roby/test/aruba_minitest.rb +74 -0
- data/lib/roby/test/assertion.rb +16 -0
- data/lib/roby/test/assertions.rb +490 -0
- data/lib/roby/test/common.rb +368 -591
- data/lib/roby/test/dsl.rb +149 -0
- data/lib/roby/test/error.rb +18 -0
- data/lib/roby/test/event_reporter.rb +83 -0
- data/lib/roby/test/execution_expectations.rb +1134 -0
- data/lib/roby/test/expect_execution.rb +151 -0
- data/lib/roby/test/minitest_helpers.rb +166 -0
- data/lib/roby/test/roby_app_helpers.rb +200 -0
- data/lib/roby/test/run_planners.rb +155 -0
- data/lib/roby/test/self.rb +112 -0
- data/lib/roby/test/spec.rb +198 -0
- data/lib/roby/test/tasks/empty_task.rb +4 -4
- data/lib/roby/test/tasks/goto.rb +28 -27
- data/lib/roby/test/teardown_plans.rb +100 -0
- data/lib/roby/test/testcase.rb +239 -307
- data/lib/roby/test/tools.rb +159 -155
- data/lib/roby/test/validate_state_machine.rb +75 -0
- data/lib/roby/transaction.rb +1125 -0
- data/lib/roby/transaction/event_generator_proxy.rb +63 -0
- data/lib/roby/transaction/plan_object_proxy.rb +99 -0
- data/lib/roby/transaction/plan_service_proxy.rb +43 -0
- data/lib/roby/transaction/proxying.rb +120 -0
- data/lib/roby/transaction/task_event_generator_proxy.rb +19 -0
- data/lib/roby/transaction/task_proxy.rb +135 -0
- data/lib/roby/until_generator.rb +30 -0
- data/lib/roby/version.rb +5 -0
- data/lib/roby/yard.rb +169 -0
- data/lib/yard-roby.rb +1 -0
- data/manifest.xml +32 -6
- data/roby.gemspec +59 -0
- metadata +788 -587
- data/Manifest.txt +0 -321
- data/NOTES +0 -4
- data/README.txt +0 -166
- data/TODO.txt +0 -146
- data/app/README.txt +0 -24
- data/app/Rakefile +0 -8
- data/app/config/ROBOT.rb +0 -5
- data/app/config/init.rb +0 -33
- data/app/config/roby.yml +0 -3
- data/app/controllers/ROBOT.rb +0 -2
- data/app/planners/ROBOT/main.rb +0 -6
- data/app/planners/main.rb +0 -5
- data/app/scripts/distributed +0 -3
- data/app/scripts/generate/bookmarks +0 -3
- data/app/scripts/replay +0 -3
- data/app/scripts/results +0 -3
- data/app/scripts/run +0 -3
- data/app/scripts/server +0 -3
- data/app/scripts/shell +0 -3
- data/app/scripts/test +0 -3
- data/app/tasks/.gitattributes +0 -0
- data/app/tasks/ROBOT/.gitattributes +0 -0
- data/bin/roby-shell +0 -25
- data/doc/guide/src/basics/app.page +0 -139
- data/doc/guide/src/basics/index.page +0 -11
- data/doc/guide/src/basics/log_replay/goForward_1.png +0 -0
- data/doc/guide/src/basics/log_replay/goForward_2.png +0 -0
- data/doc/guide/src/basics/log_replay/goForward_3.png +0 -0
- data/doc/guide/src/basics/log_replay/goForward_5.png +0 -0
- data/doc/guide/src/basics/log_replay/plan_repair_4.png +0 -0
- data/doc/guide/src/basics/log_replay/roby_log_main_window.png +0 -0
- data/doc/guide/src/basics/relations_display.page +0 -203
- data/doc/guide/src/basics/shell.page +0 -102
- data/doc/guide/src/default.css +0 -319
- data/doc/guide/src/introduction/index.page +0 -29
- data/doc/guide/src/introduction/publications.page +0 -14
- data/doc/guide/src/relations/dependency.page +0 -89
- data/doc/guide/src/relations/index.page +0 -12
- data/ext/droby/dump.cc +0 -175
- data/ext/droby/extconf.rb +0 -3
- data/ext/graph/algorithm.cc +0 -746
- data/ext/graph/extconf.rb +0 -7
- data/ext/graph/graph.cc +0 -575
- data/ext/graph/graph.hh +0 -183
- data/ext/graph/iterator_sequence.hh +0 -102
- data/ext/graph/undirected_dfs.hh +0 -226
- data/ext/graph/undirected_graph.hh +0 -421
- data/lib/roby/app/scripts/generate/bookmarks.rb +0 -162
- data/lib/roby/app/scripts/replay.rb +0 -31
- data/lib/roby/app/scripts/server.rb +0 -18
- data/lib/roby/basic_object.rb +0 -151
- data/lib/roby/config.rb +0 -14
- data/lib/roby/distributed.rb +0 -36
- data/lib/roby/distributed/base.rb +0 -448
- data/lib/roby/distributed/communication.rb +0 -875
- data/lib/roby/distributed/connection_space.rb +0 -616
- data/lib/roby/distributed/distributed_object.rb +0 -206
- data/lib/roby/distributed/drb.rb +0 -62
- data/lib/roby/distributed/notifications.rb +0 -531
- data/lib/roby/distributed/peer.rb +0 -555
- data/lib/roby/distributed/protocol.rb +0 -529
- data/lib/roby/distributed/proxy.rb +0 -343
- data/lib/roby/distributed/subscription.rb +0 -311
- data/lib/roby/distributed/transaction.rb +0 -498
- data/lib/roby/external_process_task.rb +0 -225
- data/lib/roby/graph.rb +0 -160
- data/lib/roby/log.rb +0 -3
- data/lib/roby/log/chronicle.rb +0 -303
- data/lib/roby/log/console.rb +0 -74
- data/lib/roby/log/data_stream.rb +0 -275
- data/lib/roby/log/dot.rb +0 -279
- data/lib/roby/log/event_stream.rb +0 -161
- data/lib/roby/log/file.rb +0 -396
- data/lib/roby/log/gui/basic_display.ui +0 -83
- data/lib/roby/log/gui/basic_display_ui.rb +0 -89
- data/lib/roby/log/gui/chronicle.rb +0 -26
- data/lib/roby/log/gui/chronicle_view.rb +0 -40
- data/lib/roby/log/gui/chronicle_view.ui +0 -70
- data/lib/roby/log/gui/chronicle_view_ui.rb +0 -90
- data/lib/roby/log/gui/data_displays.rb +0 -171
- data/lib/roby/log/gui/data_displays.ui +0 -155
- data/lib/roby/log/gui/data_displays_ui.rb +0 -146
- data/lib/roby/log/gui/notifications.rb +0 -26
- data/lib/roby/log/gui/relations.rb +0 -269
- data/lib/roby/log/gui/relations.ui +0 -123
- data/lib/roby/log/gui/relations_ui.rb +0 -120
- data/lib/roby/log/gui/relations_view.rb +0 -185
- data/lib/roby/log/gui/relations_view.ui +0 -149
- data/lib/roby/log/gui/relations_view_ui.rb +0 -144
- data/lib/roby/log/gui/replay.rb +0 -366
- data/lib/roby/log/gui/replay_controls.rb +0 -206
- data/lib/roby/log/gui/replay_controls.ui +0 -282
- data/lib/roby/log/gui/replay_controls_ui.rb +0 -249
- data/lib/roby/log/gui/runtime.rb +0 -130
- data/lib/roby/log/hooks.rb +0 -186
- data/lib/roby/log/logger.rb +0 -203
- data/lib/roby/log/notifications.rb +0 -244
- data/lib/roby/log/plan_rebuilder.rb +0 -468
- data/lib/roby/log/relations.rb +0 -1084
- data/lib/roby/log/server.rb +0 -547
- data/lib/roby/log/sqlite.rb +0 -47
- data/lib/roby/log/timings.rb +0 -233
- data/lib/roby/plan-object.rb +0 -371
- data/lib/roby/planning.rb +0 -13
- data/lib/roby/planning/loops.rb +0 -309
- data/lib/roby/planning/model.rb +0 -1012
- data/lib/roby/planning/task.rb +0 -180
- data/lib/roby/query.rb +0 -655
- data/lib/roby/relations/conflicts.rb +0 -67
- data/lib/roby/relations/dependency.rb +0 -358
- data/lib/roby/relations/ensured.rb +0 -19
- data/lib/roby/relations/error_handling.rb +0 -22
- data/lib/roby/relations/events.rb +0 -7
- data/lib/roby/relations/executed_by.rb +0 -208
- data/lib/roby/relations/influence.rb +0 -10
- data/lib/roby/relations/planned_by.rb +0 -63
- data/lib/roby/state/information.rb +0 -55
- data/lib/roby/state/state.rb +0 -367
- data/lib/roby/task-operations.rb +0 -186
- data/lib/roby/task_index.rb +0 -80
- data/lib/roby/test/distributed.rb +0 -230
- data/lib/roby/test/tasks/simple_task.rb +0 -23
- data/lib/roby/transactions.rb +0 -507
- data/lib/roby/transactions/proxy.rb +0 -325
- data/plugins/fault_injection/History.txt +0 -4
- data/plugins/fault_injection/README.txt +0 -34
- data/plugins/fault_injection/Rakefile +0 -12
- data/plugins/fault_injection/TODO.txt +0 -0
- data/plugins/fault_injection/app.rb +0 -52
- data/plugins/fault_injection/fault_injection.rb +0 -89
- data/plugins/fault_injection/test/test_fault_injection.rb +0 -78
- data/plugins/subsystems/README.txt +0 -37
- data/plugins/subsystems/Rakefile +0 -13
- data/plugins/subsystems/app.rb +0 -182
- data/plugins/subsystems/test/app/README +0 -24
- data/plugins/subsystems/test/app/Rakefile +0 -8
- data/plugins/subsystems/test/app/config/app.yml +0 -71
- data/plugins/subsystems/test/app/config/init.rb +0 -12
- data/plugins/subsystems/test/app/config/roby.yml +0 -3
- data/plugins/subsystems/test/app/planners/main.rb +0 -20
- data/plugins/subsystems/test/app/scripts/distributed +0 -3
- data/plugins/subsystems/test/app/scripts/replay +0 -3
- data/plugins/subsystems/test/app/scripts/results +0 -3
- data/plugins/subsystems/test/app/scripts/run +0 -3
- data/plugins/subsystems/test/app/scripts/server +0 -3
- data/plugins/subsystems/test/app/scripts/shell +0 -3
- data/plugins/subsystems/test/app/scripts/test +0 -3
- data/plugins/subsystems/test/app/tasks/services.rb +0 -15
- data/plugins/subsystems/test/test_subsystems.rb +0 -78
- data/test/distributed/test_communication.rb +0 -195
- data/test/distributed/test_connection.rb +0 -284
- data/test/distributed/test_execution.rb +0 -378
- data/test/distributed/test_mixed_plan.rb +0 -341
- data/test/distributed/test_plan_notifications.rb +0 -238
- data/test/distributed/test_protocol.rb +0 -525
- data/test/distributed/test_query.rb +0 -106
- data/test/distributed/test_remote_plan.rb +0 -491
- data/test/distributed/test_transaction.rb +0 -466
- data/test/mockups/external_process +0 -28
- data/test/mockups/tasks.rb +0 -27
- data/test/planning/test_loops.rb +0 -432
- data/test/planning/test_model.rb +0 -427
- data/test/planning/test_task.rb +0 -126
- data/test/relations/test_conflicts.rb +0 -42
- data/test/relations/test_dependency.rb +0 -324
- data/test/relations/test_ensured.rb +0 -38
- data/test/relations/test_executed_by.rb +0 -224
- data/test/relations/test_planned_by.rb +0 -56
- data/test/suite_core.rb +0 -29
- data/test/suite_distributed.rb +0 -10
- data/test/suite_planning.rb +0 -4
- data/test/suite_relations.rb +0 -8
- data/test/tasks/test_external_process.rb +0 -126
- data/test/tasks/test_thread_task.rb +0 -70
- data/test/test_bgl.rb +0 -528
- data/test/test_event.rb +0 -969
- data/test/test_exceptions.rb +0 -591
- data/test/test_execution_engine.rb +0 -987
- data/test/test_gui.rb +0 -20
- data/test/test_interface.rb +0 -43
- data/test/test_log.rb +0 -125
- data/test/test_log_server.rb +0 -133
- data/test/test_plan.rb +0 -418
- data/test/test_query.rb +0 -424
- data/test/test_relations.rb +0 -260
- data/test/test_state.rb +0 -432
- data/test/test_support.rb +0 -16
- data/test/test_task.rb +0 -1181
- data/test/test_testcase.rb +0 -138
- data/test/test_transactions.rb +0 -610
- 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
|
+
|