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,428 @@
|
|
|
1
|
+
module Roby
|
|
2
|
+
# Class that handles task arguments. They are handled specially as the
|
|
3
|
+
# arguments cannot be overwritten and can not be changed by a task that is
|
|
4
|
+
# not owned.
|
|
5
|
+
class TaskArguments
|
|
6
|
+
attr_reader :task
|
|
7
|
+
attr_reader :values
|
|
8
|
+
|
|
9
|
+
def initialize(task)
|
|
10
|
+
@task = task
|
|
11
|
+
@static = true
|
|
12
|
+
@values = Hash.new
|
|
13
|
+
super()
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def self.delayed_argument?(obj)
|
|
17
|
+
obj.respond_to?(:evaluate_delayed_argument)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# True if none of the argument values are delayed objects
|
|
21
|
+
def static?
|
|
22
|
+
@static
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def warn_deprecated_non_symbol_key(key)
|
|
26
|
+
if !key.kind_of?(Symbol)
|
|
27
|
+
Roby.warn_deprecated "accessing arguments using anything else than a symbol is deprecated", 2
|
|
28
|
+
key.to_sym
|
|
29
|
+
else key
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Return the value stored for the given key as-is
|
|
34
|
+
def raw_get(key)
|
|
35
|
+
values[key]
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# True if an argument with that name is assigned, be it a proper value
|
|
39
|
+
# or a delayed value object
|
|
40
|
+
def has_key?(key)
|
|
41
|
+
values.has_key?(key)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# The set of argument names that have been assigned so far, either
|
|
45
|
+
# with a proper object or a delayed value object
|
|
46
|
+
def keys
|
|
47
|
+
values.keys
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# True if it is possible to write the given value to the given argument
|
|
51
|
+
#
|
|
52
|
+
# @param [Symbol] key the argument name
|
|
53
|
+
# @param [Object] value the new argument value
|
|
54
|
+
def writable?(key, value)
|
|
55
|
+
if has_key?(key)
|
|
56
|
+
!task.model.arguments.include?(key) ||
|
|
57
|
+
TaskArguments.delayed_argument?(values[key])
|
|
58
|
+
else
|
|
59
|
+
true
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# Returns the listed set of arguments
|
|
64
|
+
#
|
|
65
|
+
# @param [Array<Symbol>] args the argument names
|
|
66
|
+
#
|
|
67
|
+
# Delayed arguments are evaluated before it is sliced
|
|
68
|
+
def slice(*args)
|
|
69
|
+
evaluate_delayed_arguments.slice(*args)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def dup; self.to_hash end
|
|
73
|
+
def to_hash
|
|
74
|
+
values.dup
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Tests if a given argument has been assigned, that is either has a
|
|
78
|
+
# static value or has a delayed value object
|
|
79
|
+
def assigned?(key)
|
|
80
|
+
has_key?(key)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# Tests if a given argument has been set with a proper value (not a
|
|
84
|
+
# delayed value object)
|
|
85
|
+
def set?(key)
|
|
86
|
+
has_key?(key) && !TaskArguments.delayed_argument?(values.fetch(key))
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# True if the arguments are equal
|
|
90
|
+
#
|
|
91
|
+
# Both proper values and delayed values have to be equal
|
|
92
|
+
#
|
|
93
|
+
# @return [Boolean]
|
|
94
|
+
def ==(hash)
|
|
95
|
+
to_hash == hash.to_hash
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# Pretty-prints this argument set
|
|
99
|
+
def pretty_print(pp)
|
|
100
|
+
pp.seplist(values) do |keyvalue|
|
|
101
|
+
key, value = *keyvalue
|
|
102
|
+
pp.text "#{key}: "
|
|
103
|
+
value.pretty_print(pp)
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def to_s
|
|
108
|
+
values.sort_by(&:first).map { |k, v| "#{k}: #{v}" }.join(", ")
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# Returns the set of arguments for which a proper value has been
|
|
112
|
+
# assigned
|
|
113
|
+
#
|
|
114
|
+
# @return [Hash]
|
|
115
|
+
def assigned_arguments
|
|
116
|
+
result = Hash.new
|
|
117
|
+
each_assigned_argument do |k, v|
|
|
118
|
+
result[k] = v
|
|
119
|
+
end
|
|
120
|
+
result
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
# Enumerates the arguments that have been explicitly assigned
|
|
124
|
+
def each_assigned_argument
|
|
125
|
+
return assigned_arguments if !block_given?
|
|
126
|
+
each do |key, value|
|
|
127
|
+
if !TaskArguments.delayed_argument?(value)
|
|
128
|
+
yield(key, value)
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def each(&block)
|
|
134
|
+
values.each(&block)
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
# Updates the given argument, regardless of whether it is allowed or not
|
|
138
|
+
#
|
|
139
|
+
# @see {#writable?}
|
|
140
|
+
# @param [Symbol] key the argument name
|
|
141
|
+
# @param [Object] value the new argument value
|
|
142
|
+
# @return [Object]
|
|
143
|
+
def update!(key, value)
|
|
144
|
+
if values.has_key?(key)
|
|
145
|
+
current_value = values[key]
|
|
146
|
+
is_updated = (current_value != value)
|
|
147
|
+
update_static = TaskArguments.delayed_argument?(current_value)
|
|
148
|
+
else is_updated = true
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
values[key] = value
|
|
152
|
+
if is_updated
|
|
153
|
+
task.plan.log(:task_arguments_updated, task, key, value)
|
|
154
|
+
end
|
|
155
|
+
if TaskArguments.delayed_argument?(value)
|
|
156
|
+
@static = false
|
|
157
|
+
elsif update_static
|
|
158
|
+
@static = values.all? { |k, v| !TaskArguments.delayed_argument?(v) }
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
# Assigns a value to a given argument name
|
|
163
|
+
#
|
|
164
|
+
# The method validates that writing this argument value is allowed
|
|
165
|
+
#
|
|
166
|
+
# @raise OwnershipError if we don't own the task
|
|
167
|
+
# @raise ArgumentError if the argument is already set
|
|
168
|
+
def []=(key, value)
|
|
169
|
+
key = warn_deprecated_non_symbol_key(key)
|
|
170
|
+
if writable?(key, value)
|
|
171
|
+
if !value.droby_marshallable?
|
|
172
|
+
raise NotMarshallable, "values used as task arguments must be marshallable, attempting to set #{key} to #{value} of class #{value.class}, which is not"
|
|
173
|
+
elsif !task.read_write?
|
|
174
|
+
raise OwnershipError, "cannot change the argument set of a task which is not owned #{task} is owned by #{task.owners} and #{task.plan} by #{task.plan.owners}"
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
if TaskArguments.delayed_argument?(value)
|
|
178
|
+
@static = false
|
|
179
|
+
elsif values.has_key?(key) && TaskArguments.delayed_argument?(values[key])
|
|
180
|
+
update_static = true
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
values[key] = value
|
|
184
|
+
task.plan.log(:task_arguments_updated, task, key, value)
|
|
185
|
+
|
|
186
|
+
if update_static
|
|
187
|
+
@static = values.all? { |k, v| !TaskArguments.delayed_argument?(v) }
|
|
188
|
+
end
|
|
189
|
+
value
|
|
190
|
+
else
|
|
191
|
+
raise ArgumentError, "cannot override task argument #{key} as it is already set to #{values[key]}"
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
def [](key)
|
|
196
|
+
key = warn_deprecated_non_symbol_key(key)
|
|
197
|
+
value = values[key]
|
|
198
|
+
if !TaskArguments.delayed_argument?(value)
|
|
199
|
+
value
|
|
200
|
+
end
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
# Returns this argument set, but with the delayed arguments evaluated
|
|
204
|
+
#
|
|
205
|
+
# @return [Hash]
|
|
206
|
+
def evaluate_delayed_arguments
|
|
207
|
+
result = Hash.new
|
|
208
|
+
values.each do |key, val|
|
|
209
|
+
if TaskArguments.delayed_argument?(val)
|
|
210
|
+
catch(:no_value) do
|
|
211
|
+
result[key] = val.evaluate_delayed_argument(task)
|
|
212
|
+
end
|
|
213
|
+
else
|
|
214
|
+
result[key] = val
|
|
215
|
+
end
|
|
216
|
+
end
|
|
217
|
+
result
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
def force_merge!(hash)
|
|
221
|
+
if task.plan && task.plan.executable?
|
|
222
|
+
values.merge!(hash) do |k, _, v|
|
|
223
|
+
task.plan.log(:task_arguments_updated, task, k, v)
|
|
224
|
+
v
|
|
225
|
+
end
|
|
226
|
+
else
|
|
227
|
+
values.merge!(hash)
|
|
228
|
+
end
|
|
229
|
+
@static = values.all? { |k, v| !TaskArguments.delayed_argument?(v) }
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
def merge!(**hash)
|
|
233
|
+
hash.each do |key, value|
|
|
234
|
+
if !value.droby_marshallable?
|
|
235
|
+
raise NotMarshallable, "values used as task arguments must be marshallable, attempting to set #{key} to #{value}, which is not"
|
|
236
|
+
end
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
values.merge!(hash) do |key, old, new|
|
|
240
|
+
if old == new then old
|
|
241
|
+
elsif writable?(key, new)
|
|
242
|
+
task.plan.log(:task_arguments_updated, task, key, new)
|
|
243
|
+
new
|
|
244
|
+
else
|
|
245
|
+
raise ArgumentError, "cannot override task argument #{key}: trying to replace #{old} by #{new}"
|
|
246
|
+
end
|
|
247
|
+
end
|
|
248
|
+
@static = values.all? { |k, v| !TaskArguments.delayed_argument?(v) }
|
|
249
|
+
self
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
include Enumerable
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
# Placeholder that can be used as an argument to represent a default value
|
|
256
|
+
class DefaultArgument
|
|
257
|
+
attr_reader :value
|
|
258
|
+
|
|
259
|
+
def initialize(value)
|
|
260
|
+
@value = value
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
def evaluate_delayed_argument(task)
|
|
264
|
+
value
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
def pretty_print(pp)
|
|
268
|
+
pp.text to_s
|
|
269
|
+
end
|
|
270
|
+
|
|
271
|
+
def to_s
|
|
272
|
+
"default(" + if value.nil?
|
|
273
|
+
'nil'
|
|
274
|
+
else value.to_s
|
|
275
|
+
end + ")"
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
def ==(other)
|
|
279
|
+
other.kind_of?(self.class) &&
|
|
280
|
+
other.value == value
|
|
281
|
+
end
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
# Placeholder that can be used to assign an argument from an object's
|
|
285
|
+
# attribute, reading the attribute only when the task is started
|
|
286
|
+
#
|
|
287
|
+
# This will usually not be used directly. One should use Task.from instead
|
|
288
|
+
class DelayedArgumentFromObject
|
|
289
|
+
def initialize(object, weak = true)
|
|
290
|
+
@object = object
|
|
291
|
+
@methods = []
|
|
292
|
+
@expected_class = Object
|
|
293
|
+
@weak = weak
|
|
294
|
+
end
|
|
295
|
+
|
|
296
|
+
def of_type(expected_class)
|
|
297
|
+
@expected_class = expected_class
|
|
298
|
+
self
|
|
299
|
+
end
|
|
300
|
+
|
|
301
|
+
def evaluate_delayed_argument(task)
|
|
302
|
+
result = @methods.inject(@object || task) do |v, m|
|
|
303
|
+
if v.kind_of?(Roby::Task) && v.model.has_argument?(m)
|
|
304
|
+
# We are trying to access a task argument, throw no_value if the
|
|
305
|
+
# argument is not set
|
|
306
|
+
if !v.arguments.has_key?(m)
|
|
307
|
+
throw :no_value
|
|
308
|
+
end
|
|
309
|
+
|
|
310
|
+
argument = v.arguments.values[m]
|
|
311
|
+
if TaskArguments.delayed_argument?(argument)
|
|
312
|
+
argument.evaluate_delayed_argument(v)
|
|
313
|
+
else
|
|
314
|
+
argument
|
|
315
|
+
end
|
|
316
|
+
elsif v.respond_to?(m)
|
|
317
|
+
begin v.send(m)
|
|
318
|
+
rescue Exception
|
|
319
|
+
throw :no_value
|
|
320
|
+
end
|
|
321
|
+
elsif @weak
|
|
322
|
+
throw :no_value
|
|
323
|
+
else
|
|
324
|
+
task.failed_to_start!("#{v} has no method called #{m}")
|
|
325
|
+
throw :no_value
|
|
326
|
+
end
|
|
327
|
+
end
|
|
328
|
+
|
|
329
|
+
if @expected_class && !result.kind_of?(@expected_class)
|
|
330
|
+
throw :no_value
|
|
331
|
+
end
|
|
332
|
+
result
|
|
333
|
+
end
|
|
334
|
+
|
|
335
|
+
def method_missing(m, *args)
|
|
336
|
+
if args.empty? && !block_given?
|
|
337
|
+
@methods << m
|
|
338
|
+
self
|
|
339
|
+
else
|
|
340
|
+
super
|
|
341
|
+
end
|
|
342
|
+
end
|
|
343
|
+
|
|
344
|
+
def ==(other)
|
|
345
|
+
other.kind_of?(DelayedArgumentFromObject) &&
|
|
346
|
+
@object.object_id == other.instance_variable_get(:@object).object_id &&
|
|
347
|
+
@methods == other.instance_variable_get(:@methods)
|
|
348
|
+
end
|
|
349
|
+
|
|
350
|
+
def to_s
|
|
351
|
+
"delayed_argument_from(#{@object || 'task'}.#{@methods.map(&:to_s).join(".")})"
|
|
352
|
+
end
|
|
353
|
+
|
|
354
|
+
def pretty_print(pp)
|
|
355
|
+
pp.text to_s
|
|
356
|
+
end
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
# Placeholder that can be used to assign an argument from a state value,
|
|
360
|
+
# reading the attribute only when the task is started
|
|
361
|
+
#
|
|
362
|
+
# This will usually not be used directly. One should use Task.from_state instead
|
|
363
|
+
#
|
|
364
|
+
# It differs from DelayedArgumentFromObject as it always filters out
|
|
365
|
+
# unassigned state values
|
|
366
|
+
class DelayedArgumentFromState < DelayedArgumentFromObject
|
|
367
|
+
def initialize(state_object = State, weak = true)
|
|
368
|
+
super(state_object, weak)
|
|
369
|
+
end
|
|
370
|
+
|
|
371
|
+
def evaluate_delayed_argument(task)
|
|
372
|
+
result = super
|
|
373
|
+
if result.kind_of?(OpenStruct) && !result.attached?
|
|
374
|
+
throw :no_value
|
|
375
|
+
end
|
|
376
|
+
result
|
|
377
|
+
end
|
|
378
|
+
end
|
|
379
|
+
|
|
380
|
+
# Use to specify that a task argument should be initialized from an
|
|
381
|
+
# object's attribute.
|
|
382
|
+
#
|
|
383
|
+
# For instance,
|
|
384
|
+
#
|
|
385
|
+
# task.new(goal: Roby.from(State).pose.position))
|
|
386
|
+
#
|
|
387
|
+
# will set the task's 'goal' argument from State.pose.position *at the
|
|
388
|
+
# time the task is started*
|
|
389
|
+
#
|
|
390
|
+
# It can also be used as default argument values (in which case
|
|
391
|
+
# Task.from can be used instead of Roby.from):
|
|
392
|
+
#
|
|
393
|
+
# class MyTask < Roby::Task
|
|
394
|
+
# argument :goal, default: from(State).pose.position
|
|
395
|
+
# end
|
|
396
|
+
#
|
|
397
|
+
# If the provided object is nil, the receiver will be the task itself.
|
|
398
|
+
#
|
|
399
|
+
# @example initialize an argument from the task's parent
|
|
400
|
+
# MyTaskModel.new(arg: Task.from(:parent_task).parent_arg)
|
|
401
|
+
#
|
|
402
|
+
def self.from(object)
|
|
403
|
+
DelayedArgumentFromObject.new(object)
|
|
404
|
+
end
|
|
405
|
+
|
|
406
|
+
# Use to specify that a task argument should be initialized from a value in
|
|
407
|
+
# the State
|
|
408
|
+
#
|
|
409
|
+
# For instance:
|
|
410
|
+
#
|
|
411
|
+
# task.new(goal: Roby.from_state.pose.position))
|
|
412
|
+
#
|
|
413
|
+
def self.from_state(state_object = State)
|
|
414
|
+
DelayedArgumentFromState.new(state_object)
|
|
415
|
+
end
|
|
416
|
+
|
|
417
|
+
# Use to specify that a task argument should be initialized from a value in
|
|
418
|
+
# the Conf object. The value will be taken at the point in time where the
|
|
419
|
+
# task is executed.
|
|
420
|
+
#
|
|
421
|
+
# For instance:
|
|
422
|
+
#
|
|
423
|
+
# task.new(goal: Roby.from_state.pose.position))
|
|
424
|
+
#
|
|
425
|
+
def self.from_conf
|
|
426
|
+
from_state(Conf)
|
|
427
|
+
end
|
|
428
|
+
end
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
module Roby
|
|
2
|
+
# Base class for events emitted by tasks.
|
|
3
|
+
#
|
|
4
|
+
# When one creates a new event on a task, Roby creates a corresponding
|
|
5
|
+
# subclass of TaskEvent. The emitted event objects are then instances of
|
|
6
|
+
# that class.
|
|
7
|
+
#
|
|
8
|
+
# For instance, there is a Roby::Task::StopEvent class which is used to
|
|
9
|
+
# represent the emitted :stop events of Roby::Task. However, if one
|
|
10
|
+
# overloads the stop command with
|
|
11
|
+
#
|
|
12
|
+
# class TModel < Roby::Task
|
|
13
|
+
# event :stop, controlable: true
|
|
14
|
+
# end
|
|
15
|
+
#
|
|
16
|
+
# Then TModel::StopEvent will be a subclass of StopEvent.
|
|
17
|
+
#
|
|
18
|
+
# These models are meant to be extended when the emission carry
|
|
19
|
+
# information, i.e. to provide a robust access to the information contained
|
|
20
|
+
# in Event#context
|
|
21
|
+
class TaskEvent < Event
|
|
22
|
+
extend Models::TaskEvent
|
|
23
|
+
|
|
24
|
+
# The task which fired this event
|
|
25
|
+
attr_reader :task
|
|
26
|
+
# The event model, usually its class
|
|
27
|
+
attr_reader :model
|
|
28
|
+
|
|
29
|
+
def initialize(task, generator, propagation_id, context, time = Time.now)
|
|
30
|
+
@task = task
|
|
31
|
+
@terminal_flag = generator.terminal_flag
|
|
32
|
+
@model = self.class
|
|
33
|
+
super(generator, propagation_id, context, time)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Returns the events that are the cause of this event, limiting itself
|
|
37
|
+
# to the task's events. The return value is a Set of TaskEvent
|
|
38
|
+
# instances.
|
|
39
|
+
#
|
|
40
|
+
# For instance, for an interruptible task:
|
|
41
|
+
#
|
|
42
|
+
# task.start!
|
|
43
|
+
# task.stop!
|
|
44
|
+
#
|
|
45
|
+
# Then task.stop_event.last.task_sources will return a Set instance
|
|
46
|
+
# which contains the failed event. I.e. in this particular situation, it
|
|
47
|
+
# behaves in the same way than Event#event_sources
|
|
48
|
+
#
|
|
49
|
+
# However, with
|
|
50
|
+
#
|
|
51
|
+
# event.add_signal task.failed_event
|
|
52
|
+
# task.start!
|
|
53
|
+
# event.call
|
|
54
|
+
#
|
|
55
|
+
# Event#event_sources will return both event.last and
|
|
56
|
+
# task.failed_event.last while TaskEvent will only return
|
|
57
|
+
# task.failed_event.last.
|
|
58
|
+
def task_sources
|
|
59
|
+
result = Set.new
|
|
60
|
+
for ev in sources
|
|
61
|
+
gen = ev.generator
|
|
62
|
+
if gen.respond_to?(:task) && gen.task == task
|
|
63
|
+
result << ev
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
result
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Recursively browses in the event sources, returning only those that
|
|
70
|
+
# come from this event's task
|
|
71
|
+
def all_task_sources
|
|
72
|
+
result = Set.new
|
|
73
|
+
for ev in task_sources
|
|
74
|
+
result << ev
|
|
75
|
+
result.merge(ev.all_task_sources)
|
|
76
|
+
end
|
|
77
|
+
result
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Recursively browses in the event sources, returning those (1) that
|
|
81
|
+
# come from this event's task and (2) have no parent from within the
|
|
82
|
+
# Forwarding relation in the task sources.
|
|
83
|
+
def root_task_sources
|
|
84
|
+
all = all_task_sources
|
|
85
|
+
all.find_all do |event|
|
|
86
|
+
all.none? { |ev| ev.generator.child_object?(event.generator, Roby::EventStructure::Forwarding) }
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def to_s
|
|
91
|
+
result = "[#{Roby.format_time(time)} @#{propagation_id}] #{task}/#{symbol}"
|
|
92
|
+
if context
|
|
93
|
+
result += ": #{context}"
|
|
94
|
+
end
|
|
95
|
+
result
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def pretty_print(pp, with_context = true)
|
|
99
|
+
pp.text "event '#{symbol}' emitted at [#{Roby.format_time(time)} @#{propagation_id}] from "
|
|
100
|
+
pp.nest(2) do
|
|
101
|
+
pp.breakable
|
|
102
|
+
task.pretty_print(pp)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
if with_context && context
|
|
106
|
+
pp.breakable
|
|
107
|
+
pp.nest(2) do
|
|
108
|
+
pp.text " "
|
|
109
|
+
pp.seplist(context) do |v|
|
|
110
|
+
v.pretty_print(pp)
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# If the event is controlable
|
|
117
|
+
def controlable?; model.controlable? end
|
|
118
|
+
# If this event is terminal
|
|
119
|
+
def success?; @terminal_flag == :success end
|
|
120
|
+
# If this event is terminal
|
|
121
|
+
def failure?; @terminal_flag == :failure end
|
|
122
|
+
# If this event is terminal
|
|
123
|
+
def terminal?; @terminal_flag end
|
|
124
|
+
# The event symbol
|
|
125
|
+
def symbol; model.symbol end
|
|
126
|
+
end
|
|
127
|
+
end
|