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,91 @@
|
|
|
1
|
+
require 'roby/schedulers/basic'
|
|
2
|
+
module Roby
|
|
3
|
+
module Schedulers
|
|
4
|
+
# The temporal scheduler adds to the decisions made by the Basic
|
|
5
|
+
# scheduler information given by the temporal constraint network.
|
|
6
|
+
#
|
|
7
|
+
# See the documentation of Roby::Schedulers for more information
|
|
8
|
+
class Temporal < Basic
|
|
9
|
+
# If true, the basic scheduler's constraints must be met for all
|
|
10
|
+
# tasks. If false, they are applied only on tasks for which no
|
|
11
|
+
# temporal constraints are set.
|
|
12
|
+
attr_predicate :basic_constraints?, true
|
|
13
|
+
|
|
14
|
+
# The proper graph object that contains the scheduling constraints
|
|
15
|
+
attr_reader :scheduling_constraints_graph
|
|
16
|
+
|
|
17
|
+
def initialize(with_basic = true, with_children = true, plan = nil)
|
|
18
|
+
super(with_children, plan)
|
|
19
|
+
@basic_constraints = with_basic
|
|
20
|
+
@scheduling_constraints_graph = self.plan.
|
|
21
|
+
event_relation_graph_for(EventStructure::SchedulingConstraints)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def can_schedule?(task, time = Time.now, stack = [])
|
|
25
|
+
if task.running?
|
|
26
|
+
return true
|
|
27
|
+
elsif !can_start?(task)
|
|
28
|
+
report_holdoff "cannot be started", task
|
|
29
|
+
return false
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
start_event = task.start_event
|
|
33
|
+
|
|
34
|
+
event_filter = lambda do |ev|
|
|
35
|
+
if ev.respond_to?(:task)
|
|
36
|
+
ev.task != task &&
|
|
37
|
+
!stack.include?(ev.task) &&
|
|
38
|
+
!scheduling_constraints_graph.related_tasks?(ev.task, task)
|
|
39
|
+
else true
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
meets_constraints = start_event.meets_temporal_constraints?(time, &event_filter)
|
|
44
|
+
if !meets_constraints
|
|
45
|
+
if failed_temporal = start_event.find_failed_temporal_constraint(time, &event_filter)
|
|
46
|
+
report_holdoff "temporal constraints not met (%2: %3)", task, failed_temporal[0], failed_temporal[1]
|
|
47
|
+
end
|
|
48
|
+
if failed_occurence = start_event.find_failed_occurence_constraint(true, &event_filter)
|
|
49
|
+
report_holdoff "occurence constraints not met (%2)", task, failed_occurence
|
|
50
|
+
end
|
|
51
|
+
return false
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
start_event.each_backward_scheduling_constraint do |parent|
|
|
55
|
+
begin
|
|
56
|
+
stack.push task
|
|
57
|
+
if !can_schedule?(parent.task, time, stack)
|
|
58
|
+
report_holdoff "held by a schedule_as constraint with %2", task, parent
|
|
59
|
+
return false
|
|
60
|
+
end
|
|
61
|
+
ensure
|
|
62
|
+
stack.pop
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
if basic_constraints?
|
|
67
|
+
if super
|
|
68
|
+
return true
|
|
69
|
+
else
|
|
70
|
+
# Special case: check in Dependency if there are some
|
|
71
|
+
# parents for which a forward constraint from +self+ to
|
|
72
|
+
# +parent.start_event+ exists. If it is the case, start
|
|
73
|
+
# the task
|
|
74
|
+
task.each_parent_task do |parent|
|
|
75
|
+
parent.start_event.each_backward_temporal_constraint do |constraint|
|
|
76
|
+
if constraint.respond_to?(:task) && constraint.task == task
|
|
77
|
+
Schedulers.debug { "Temporal: #{task} has no running parent, but a constraint from #{constraint} to #{parent}.start exists. Scheduling." }
|
|
78
|
+
return true
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
return false
|
|
83
|
+
end
|
|
84
|
+
else
|
|
85
|
+
return true
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
module Roby
|
|
2
|
+
@state = Roby::StateSpace.new
|
|
3
|
+
@conf = Roby::ConfModel.new
|
|
4
|
+
|
|
5
|
+
class << self
|
|
6
|
+
# The one and only Application object
|
|
7
|
+
def app
|
|
8
|
+
@app ||= Application.new
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# The one and only StateSpace object
|
|
12
|
+
attr_reader :state
|
|
13
|
+
|
|
14
|
+
# The one and only ConfModel object
|
|
15
|
+
attr_reader :conf
|
|
16
|
+
|
|
17
|
+
# The main plan
|
|
18
|
+
#
|
|
19
|
+
# It is always the same as Roby.app.plan
|
|
20
|
+
#
|
|
21
|
+
# @return [Plan]
|
|
22
|
+
def plan; app.plan end
|
|
23
|
+
|
|
24
|
+
# The main execution engine
|
|
25
|
+
#
|
|
26
|
+
# It is always the same as Roby.plan.execution_engine
|
|
27
|
+
#
|
|
28
|
+
# Note that it is nil until the Roby application is configured
|
|
29
|
+
#
|
|
30
|
+
# @return [ExecutionEngine]
|
|
31
|
+
def execution_engine
|
|
32
|
+
app.execution_engine
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# The main scheduler
|
|
36
|
+
#
|
|
37
|
+
# It is always the same as Roby.plan.execution_engine.scheduler
|
|
38
|
+
def scheduler
|
|
39
|
+
app.plan.execution_engine.scheduler
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Sets the main scheduler
|
|
43
|
+
#
|
|
44
|
+
# It is always the same as Roby.plan.execution_engine.scheduler
|
|
45
|
+
def scheduler=(scheduler)
|
|
46
|
+
app.plan.execution_engine.scheduler = scheduler
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# The control / policy object
|
|
50
|
+
#
|
|
51
|
+
# This is the object that defines the core execution policies (e.g. what
|
|
52
|
+
# to do if the dependency of a non-running task stops). See
|
|
53
|
+
# {DecisionControl}
|
|
54
|
+
def control
|
|
55
|
+
app.plan.execution_engine.control
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Sets the control / policy object
|
|
59
|
+
#
|
|
60
|
+
# This is the object that defines the core execution policies (e.g. what
|
|
61
|
+
# to do if the dependency of a non-running task stops). See
|
|
62
|
+
# {DecisionControl}
|
|
63
|
+
def control(object)
|
|
64
|
+
app.plan.execution_engine.control = object
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# @deprecated use {Roby.execution_engine} instead
|
|
68
|
+
def engine
|
|
69
|
+
Roby.warn_deprecated "Roby.engine is deprecated, use Roby.execution_engine instead"
|
|
70
|
+
app.execution_engine
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# Defines a global exception handler on the main plan.
|
|
75
|
+
# See also Plan#on_exception
|
|
76
|
+
def self.on_exception(matcher, &handler); Roby.app.plan.on_exception(matcher, &handler) end
|
|
77
|
+
|
|
78
|
+
# The main state object
|
|
79
|
+
State = Roby.state
|
|
80
|
+
# The main configuration object
|
|
81
|
+
Conf = Roby.conf
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# The main state object
|
|
85
|
+
State = Roby.state
|
|
86
|
+
# The main configuration object
|
|
87
|
+
Conf = Roby.conf
|
data/lib/roby/standalone.rb
CHANGED
data/lib/roby/standard_errors.rb
CHANGED
|
@@ -1,49 +1,134 @@
|
|
|
1
|
+
class Exception
|
|
2
|
+
# Create a {Queries::CodeErrorMatcher} object that matches this exception
|
|
3
|
+
#
|
|
4
|
+
# @return [Queries::CodeErrorMatcher]
|
|
5
|
+
def self.match
|
|
6
|
+
Roby::CodeError.match.with_ruby_exception(self)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def self.to_execution_exception_matcher
|
|
10
|
+
match.to_execution_exception_matcher
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def pretty_print(pp)
|
|
14
|
+
pp.text "#{message} (#{self.class.name})"
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# True if +obj+ is involved in this error
|
|
18
|
+
def involved_plan_object?(obj)
|
|
19
|
+
false
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def user_error?; false end
|
|
23
|
+
end
|
|
24
|
+
|
|
1
25
|
module Roby
|
|
26
|
+
# Exception base used for all errors that show an inconsistency inside Roby
|
|
27
|
+
# itself
|
|
28
|
+
class InternalError < RuntimeError; end
|
|
29
|
+
|
|
30
|
+
# Exception raised if an object is not droby-marshallable in a place where
|
|
31
|
+
# one is required
|
|
32
|
+
class NotMarshallable < ArgumentError
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Module used to tag exceptions that "wrap" an original error from the user
|
|
36
|
+
# code
|
|
37
|
+
#
|
|
38
|
+
# All such exceptions must give access to the original error by defining an
|
|
39
|
+
# original_exceptions accessor
|
|
40
|
+
module UserExceptionWrapper; end
|
|
41
|
+
|
|
42
|
+
# Base class for all Roby exceptions
|
|
43
|
+
class ExceptionBase < RuntimeError
|
|
44
|
+
# List of Exception objects that caused this
|
|
45
|
+
#
|
|
46
|
+
# @return [Array<Exception>]
|
|
47
|
+
attr_accessor :original_exceptions
|
|
48
|
+
|
|
49
|
+
def initialize(exceptions = Array.new)
|
|
50
|
+
@original_exceptions = exceptions
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def each_original_exception(&block)
|
|
54
|
+
@original_exceptions.each(&block)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def report_exceptions_from(object)
|
|
58
|
+
if object.kind_of?(Exception)
|
|
59
|
+
original_exceptions << object
|
|
60
|
+
elsif object.respond_to?(:report_exceptions_on)
|
|
61
|
+
object.report_exceptions_on(self)
|
|
62
|
+
elsif object.respond_to?(:context) && object.context
|
|
63
|
+
object.context.each do |c|
|
|
64
|
+
report_exceptions_from(c)
|
|
65
|
+
end
|
|
66
|
+
elsif object.respond_to?(:failure_reason)
|
|
67
|
+
report_exceptions_from(object.failure_reason)
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
2
72
|
# This kind of errors are generated during the plan execution, allowing to
|
|
3
73
|
# blame a fault on a plan object (#failure_point). The precise failure
|
|
4
74
|
# point is categorized in the #failed_event, #failed_generator and
|
|
5
75
|
# #failed_task. It is guaranteed that one of #failed_generator and
|
|
6
76
|
# #failed_task is non-nil.
|
|
7
|
-
class LocalizedError <
|
|
77
|
+
class LocalizedError < ExceptionBase
|
|
78
|
+
# If true, such an exception causes the execution engine to stop tasks
|
|
79
|
+
# in the hierarchy. Otherwise, it only causes notification(s).
|
|
80
|
+
def fatal?; true end
|
|
81
|
+
# If true, such an exception will be propagated in the plan dependency
|
|
82
|
+
# structure. Otherwise, it's directly reported to the plan itself (which
|
|
83
|
+
# can choose to handle it).
|
|
84
|
+
#
|
|
85
|
+
# This is usually set to false for exceptions that report global
|
|
86
|
+
# information about the plan, such as e.g. MissionFailedError
|
|
87
|
+
def propagated?; true end
|
|
8
88
|
# The object describing the point of failure
|
|
9
|
-
|
|
89
|
+
attr_reader :failure_point
|
|
10
90
|
|
|
11
91
|
# The objects of the given categories which are related to #failure_point
|
|
12
92
|
attr_reader :failed_event, :failed_generator, :failed_task
|
|
13
93
|
|
|
14
94
|
# Create a LocalizedError object with the given failure point
|
|
15
95
|
def initialize(failure_point)
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
96
|
+
super()
|
|
97
|
+
@failure_point = failure_point
|
|
98
|
+
|
|
99
|
+
@failed_task, @failed_event, @failed_generator = nil
|
|
100
|
+
if failure_point.kind_of?(Event)
|
|
101
|
+
@failed_event = failure_point
|
|
102
|
+
@failed_generator = failure_point.generator
|
|
103
|
+
elsif failure_point.kind_of?(EventGenerator)
|
|
104
|
+
@failed_generator = failure_point
|
|
105
|
+
elsif failure_point.kind_of?(Task)
|
|
106
|
+
@failed_task = failure_point
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
if !@failed_task && @failed_generator && @failed_generator.respond_to?(:task)
|
|
110
|
+
@failed_task = failed_generator.task
|
|
111
|
+
end
|
|
112
|
+
if !@failed_task && !@failed_generator
|
|
113
|
+
raise ArgumentError, "cannot deduce a task and/or a generator from #{failure_point}"
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
if failed_event
|
|
117
|
+
failed_event.protect_all_sources
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def to_execution_exception
|
|
122
|
+
ExecutionException.new(self)
|
|
123
|
+
end
|
|
35
124
|
|
|
36
125
|
def pretty_print(pp)
|
|
37
|
-
|
|
126
|
+
pp.text "#{self.class.name}"
|
|
38
127
|
if !message.empty?
|
|
39
128
|
pp.text ": #{message}"
|
|
40
129
|
end
|
|
41
130
|
pp.breakable
|
|
42
131
|
failure_point.pretty_print(pp)
|
|
43
|
-
|
|
44
|
-
if backtrace && !backtrace.empty?
|
|
45
|
-
Roby.pretty_print_backtrace(pp, backtrace)
|
|
46
|
-
end
|
|
47
132
|
end
|
|
48
133
|
|
|
49
134
|
# True if +obj+ is involved in this error
|
|
@@ -53,17 +138,103 @@ def involved_plan_object?(obj)
|
|
|
53
138
|
obj == failed_generator ||
|
|
54
139
|
obj == failed_task)
|
|
55
140
|
end
|
|
141
|
+
|
|
142
|
+
# @return [Queries::ExecutionExceptionMatcher]
|
|
143
|
+
def self.to_execution_exception_matcher
|
|
144
|
+
Roby::Queries::ExecutionExceptionMatcher.new.with_model(self)
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
# Create a {Queries::LocalizedErrorMatcher} that matches this exception
|
|
148
|
+
#
|
|
149
|
+
# @return [Queries::LocalizedErrorMatcher]
|
|
150
|
+
def self.match
|
|
151
|
+
Roby::Queries::LocalizedErrorMatcher.new.with_model(self)
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
class RelationFailedError < LocalizedError
|
|
156
|
+
# The parent in the failed relation
|
|
157
|
+
attr_reader :parent
|
|
56
158
|
end
|
|
57
159
|
|
|
160
|
+
|
|
161
|
+
# Exception raises when attempting to add relations to a
|
|
162
|
+
# garbaged-but-not-finalized task
|
|
163
|
+
class ReusingGarbage < RuntimeError; end
|
|
164
|
+
# Exception class used when trying to perform an operation on a finalized
|
|
165
|
+
# object and the operation requires a plan
|
|
166
|
+
class FinalizedPlanObject < RuntimeError; end
|
|
58
167
|
# Raised during event propagation if a task event is called or emitted,
|
|
59
168
|
# while this task is not executable.
|
|
60
169
|
class TaskNotExecutable < LocalizedError; end
|
|
61
170
|
# Raised during event propagation if an event is called or emitted,
|
|
62
171
|
# while this event is not executable.
|
|
63
172
|
class EventNotExecutable < LocalizedError; end
|
|
64
|
-
#
|
|
65
|
-
#
|
|
66
|
-
|
|
173
|
+
# Same error than EventNotExecutable, but for task events
|
|
174
|
+
#
|
|
175
|
+
# The only difference is that this method displays some task-specific
|
|
176
|
+
# information
|
|
177
|
+
class TaskEventNotExecutable < EventNotExecutable
|
|
178
|
+
def initialize(failure_point)
|
|
179
|
+
super(failure_point)
|
|
180
|
+
if !(@plan = failed_generator.task.plan)
|
|
181
|
+
@removed_at = failed_generator.task.removed_at
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
def plan; @plan end
|
|
186
|
+
def removed_at; @removed_at end
|
|
187
|
+
|
|
188
|
+
def pretty_print(pp)
|
|
189
|
+
pp.text "#{failed_generator.symbol} called but it is not executable on"
|
|
190
|
+
pp.breakable
|
|
191
|
+
failed_generator.task.pretty_print(pp)
|
|
192
|
+
pp.breakable
|
|
193
|
+
if plan
|
|
194
|
+
pp.text "the task has NOT been garbage collected"
|
|
195
|
+
elsif removed_at
|
|
196
|
+
pp.text "#{failed_generator.task} has been removed from its plan at"
|
|
197
|
+
removed_at.each do |line|
|
|
198
|
+
pp.breakable
|
|
199
|
+
pp.text " #{line}"
|
|
200
|
+
end
|
|
201
|
+
else
|
|
202
|
+
pp.text "the task has never been included in a plan"
|
|
203
|
+
end
|
|
204
|
+
end
|
|
205
|
+
end
|
|
206
|
+
# Raised when an error occurs on a task while we were terminating it
|
|
207
|
+
class TaskEmergencyTermination < LocalizedError
|
|
208
|
+
attr_reader :reason
|
|
209
|
+
|
|
210
|
+
def quarantined?
|
|
211
|
+
!!@quarantined
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
def initialize(task, reason, quarantined = false)
|
|
215
|
+
super(task)
|
|
216
|
+
|
|
217
|
+
@quarantined = quarantined
|
|
218
|
+
@reason = reason
|
|
219
|
+
report_exceptions_from(reason)
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
def pretty_print(pp)
|
|
223
|
+
pp.text "The following task is being terminated because of an internal error"
|
|
224
|
+
pp.breakable
|
|
225
|
+
if quarantined?
|
|
226
|
+
pp.text "It has been put under quarantine"
|
|
227
|
+
else
|
|
228
|
+
pp.text "It is not yet put under quarantine"
|
|
229
|
+
end
|
|
230
|
+
pp.breakable
|
|
231
|
+
super
|
|
232
|
+
pp.breakable
|
|
233
|
+
if !original_exceptions.include?(reason)
|
|
234
|
+
reason.pretty_print(pp)
|
|
235
|
+
end
|
|
236
|
+
end
|
|
237
|
+
end
|
|
67
238
|
|
|
68
239
|
# Raised when an operation is attempted while the ownership does not allow
|
|
69
240
|
# it.
|
|
@@ -89,33 +260,54 @@ class ThreadMismatch < RuntimeError; end
|
|
|
89
260
|
# outside of Roby's plan management algorithms) has raised. This includes:
|
|
90
261
|
# event commands, event handlers, task polling blocks, ...
|
|
91
262
|
class CodeError < LocalizedError
|
|
263
|
+
include UserExceptionWrapper
|
|
264
|
+
|
|
92
265
|
# The original exception object
|
|
93
|
-
|
|
266
|
+
def original_exception; original_exceptions.first end
|
|
267
|
+
# @deprecated use {#original_exception} instead
|
|
268
|
+
def error; original_exception end
|
|
94
269
|
# Create a CodeError object from the given original exception object, and
|
|
95
270
|
# with the given failure point
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
271
|
+
def initialize(error, *args)
|
|
272
|
+
if error && !error.kind_of?(Exception)
|
|
273
|
+
raise TypeError, "#{error} should be an exception"
|
|
274
|
+
end
|
|
275
|
+
super(*args)
|
|
276
|
+
report_exceptions_from(error)
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
def pretty_print(pp)
|
|
280
|
+
pp.text "#{self.class.name}: user code raised an exception "
|
|
281
|
+
failure_point.pretty_print(pp)
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
# Create a {Queries::CodeErrorMatcher} that matches this exception
|
|
285
|
+
#
|
|
286
|
+
# @return [Queries::CodeErrorMatcher]
|
|
287
|
+
def self.match
|
|
288
|
+
Roby::Queries::CodeErrorMatcher.new.with_model(self)
|
|
289
|
+
end
|
|
115
290
|
end
|
|
116
291
|
|
|
292
|
+
# Raised when a command is being processed, but it cannot be (e.g. because
|
|
293
|
+
# of task state)
|
|
294
|
+
class CommandRejected < LocalizedError; end
|
|
295
|
+
|
|
296
|
+
# Raised when an event's emission has being requested, but it cannot be
|
|
297
|
+
# (e.g. because of task state)
|
|
298
|
+
class EmissionRejected < LocalizedError; end
|
|
299
|
+
|
|
117
300
|
# Raised if a command block has raised an exception
|
|
118
|
-
class CommandFailed < CodeError
|
|
301
|
+
class CommandFailed < CodeError
|
|
302
|
+
def pretty_print(pp)
|
|
303
|
+
pp.text "uncaught exception in the command of the "
|
|
304
|
+
failed_generator.pretty_print(pp)
|
|
305
|
+
pp.text " (#{self.class})"
|
|
306
|
+
end
|
|
307
|
+
end
|
|
308
|
+
# Raised during event propagation if an event is called, while this event
|
|
309
|
+
# is not controlable.
|
|
310
|
+
class EventNotControlable < LocalizedError; end
|
|
119
311
|
# Raised when the call of an event has been canceled.
|
|
120
312
|
# See EventGenerator#cancel.
|
|
121
313
|
class EventCanceled < LocalizedError; end
|
|
@@ -124,17 +316,48 @@ class EventCanceled < LocalizedError; end
|
|
|
124
316
|
class EventPreconditionFailed < LocalizedError; end
|
|
125
317
|
# Raised when the emission of an event has failed.
|
|
126
318
|
# See EventGenerator#emit_failed.
|
|
127
|
-
class EmissionFailed < CodeError
|
|
319
|
+
class EmissionFailed < CodeError
|
|
320
|
+
def initialize(*args, &block)
|
|
321
|
+
super
|
|
322
|
+
if !failed_generator
|
|
323
|
+
raise ArgumentError, "creating an EmissionFailed error without a generator"
|
|
324
|
+
end
|
|
325
|
+
end
|
|
326
|
+
|
|
327
|
+
def pretty_print(pp) # :nodoc:
|
|
328
|
+
pp.text "failed emission of the "
|
|
329
|
+
failed_generator.pretty_print(pp)
|
|
330
|
+
pp.text " (#{self.class})"
|
|
331
|
+
end
|
|
332
|
+
end
|
|
128
333
|
# Raised when an event handler has raised.
|
|
129
|
-
class EventHandlerError < CodeError
|
|
334
|
+
class EventHandlerError < CodeError
|
|
335
|
+
def pretty_print(pp)
|
|
336
|
+
pp.text "uncaught exception in an event handler of the "
|
|
337
|
+
failed_generator.pretty_print(pp)
|
|
338
|
+
pp.text " (#{self.class})"
|
|
339
|
+
pp.breakable
|
|
340
|
+
pp.text "called during the propagation of "
|
|
341
|
+
failed_event.pretty_print(pp)
|
|
342
|
+
end
|
|
343
|
+
end
|
|
130
344
|
|
|
131
345
|
# Raised when an exception handler has raised.
|
|
132
346
|
class FailedExceptionHandler < CodeError
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
347
|
+
attr_reader :handled_exception
|
|
348
|
+
attr_reader :handler
|
|
349
|
+
|
|
350
|
+
def initialize(error, object, handled_exception, handler)
|
|
351
|
+
super(error, object)
|
|
352
|
+
@handled_exception = handled_exception
|
|
353
|
+
@handler = handler
|
|
354
|
+
end
|
|
355
|
+
|
|
356
|
+
def pretty_print(pp)
|
|
357
|
+
pp.text "exception handler #{handler} failed while processing"
|
|
358
|
+
pp.breakable
|
|
359
|
+
handled_exception.pretty_print(pp)
|
|
360
|
+
end
|
|
138
361
|
end
|
|
139
362
|
|
|
140
363
|
# Raised when an event has become unreachable while other parts of the plan
|
|
@@ -146,38 +369,31 @@ class UnreachableEvent < LocalizedError
|
|
|
146
369
|
# Create an UnreachableEvent error for the given +generator+. +reason+
|
|
147
370
|
# is supposed to be either nil or a plan object which is the reason why
|
|
148
371
|
# +generator+ has become unreachable.
|
|
149
|
-
|
|
372
|
+
def initialize(generator, reason)
|
|
373
|
+
super(generator)
|
|
150
374
|
@reason = reason
|
|
151
|
-
|
|
152
|
-
|
|
375
|
+
report_exceptions_from(reason)
|
|
376
|
+
end
|
|
153
377
|
|
|
154
|
-
|
|
378
|
+
def pretty_print(pp) # :nodoc:
|
|
155
379
|
pp.text "#{failed_generator} has become unreachable"
|
|
156
|
-
|
|
380
|
+
if reason
|
|
157
381
|
reason = [*reason]
|
|
158
382
|
reason.each do |e|
|
|
159
383
|
pp.breakable
|
|
160
384
|
e.pretty_print(pp)
|
|
161
385
|
end
|
|
162
386
|
end
|
|
163
|
-
|
|
387
|
+
end
|
|
164
388
|
end
|
|
165
389
|
|
|
166
390
|
# Exception raised when the event loop aborts because of an unhandled
|
|
167
391
|
# exception
|
|
168
|
-
class Aborting <
|
|
169
|
-
attr_reader :all_exceptions
|
|
170
|
-
def initialize(exceptions)
|
|
171
|
-
@all_exceptions = exceptions
|
|
172
|
-
super("")
|
|
173
|
-
end
|
|
392
|
+
class Aborting < ExceptionBase
|
|
174
393
|
def pretty_print(pp) # :nodoc:
|
|
175
394
|
pp.text "control loop aborting because of unhandled exceptions"
|
|
176
|
-
pp.seplist(",") do
|
|
177
|
-
all_exceptions.pretty_print(pp)
|
|
178
|
-
end
|
|
179
395
|
end
|
|
180
|
-
|
|
396
|
+
def backtrace # :nodoc:
|
|
181
397
|
[]
|
|
182
398
|
end
|
|
183
399
|
end
|
|
@@ -185,14 +401,14 @@ def backtrace # :nodoc:
|
|
|
185
401
|
# Raised by Plan#replace when the new task cannot replace the older one.
|
|
186
402
|
class InvalidReplace < RuntimeError
|
|
187
403
|
# The task being replaced
|
|
188
|
-
|
|
404
|
+
attr_reader :from
|
|
189
405
|
# The task which should have replaced #from
|
|
190
406
|
attr_reader :to
|
|
191
407
|
|
|
192
408
|
# Create a new InvalidReplace object
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
409
|
+
def initialize(from, to)
|
|
410
|
+
@from, @to = from, to
|
|
411
|
+
end
|
|
196
412
|
def pretty_print(pp) # :nodoc:
|
|
197
413
|
pp.text "invalid replacement: #{message}"
|
|
198
414
|
pp.breakable
|
|
@@ -205,20 +421,127 @@ def pretty_print(pp) # :nodoc:
|
|
|
205
421
|
end
|
|
206
422
|
|
|
207
423
|
# Exception raised when a mission has failed
|
|
208
|
-
class
|
|
424
|
+
class ToplevelTaskError < LocalizedError
|
|
425
|
+
include UserExceptionWrapper
|
|
426
|
+
|
|
427
|
+
attr_reader :reason
|
|
428
|
+
|
|
429
|
+
def propagated?; false end
|
|
430
|
+
|
|
209
431
|
# Create a new MissionFailedError for the given mission
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
432
|
+
def initialize(task, reason = nil)
|
|
433
|
+
super(task.failure_event || task)
|
|
434
|
+
@reason = reason || task.failure_reason
|
|
435
|
+
report_exceptions_from(@reason)
|
|
436
|
+
end
|
|
437
|
+
|
|
438
|
+
def pretty_print(pp)
|
|
439
|
+
if reason
|
|
440
|
+
reason.pretty_print(pp)
|
|
441
|
+
elsif failed_event
|
|
442
|
+
failed_event.pretty_print(pp)
|
|
443
|
+
else
|
|
444
|
+
explanation = :success.to_unbound_task_predicate.explain_static(failed_task)
|
|
445
|
+
explanation.pretty_print(pp)
|
|
446
|
+
end
|
|
447
|
+
end
|
|
448
|
+
end
|
|
213
449
|
|
|
450
|
+
# Exception raised when a mission has failed
|
|
451
|
+
class MissionFailedError < ToplevelTaskError
|
|
214
452
|
def pretty_print(pp)
|
|
215
453
|
pp.text "mission failed: "
|
|
216
|
-
|
|
454
|
+
failed_task.pretty_print(pp)
|
|
455
|
+
pp.breakable
|
|
456
|
+
super(pp)
|
|
457
|
+
end
|
|
458
|
+
end
|
|
459
|
+
|
|
460
|
+
# Exception raised when a permanent task has failed
|
|
461
|
+
class PermanentTaskError < ToplevelTaskError
|
|
462
|
+
def fatal?; false end
|
|
463
|
+
def pretty_print(pp)
|
|
464
|
+
pp.text "permanent task failed: "
|
|
465
|
+
failed_task.pretty_print(pp)
|
|
466
|
+
pp.breakable
|
|
467
|
+
super(pp)
|
|
217
468
|
end
|
|
218
469
|
end
|
|
219
470
|
|
|
220
471
|
# Exception raised in threads which are waiting for the control thread
|
|
221
472
|
# See for instance Roby.execute
|
|
222
473
|
class ExecutionQuitError < RuntimeError; end
|
|
474
|
+
|
|
475
|
+
# Exception raised when a child is being resolved by role, but the role is
|
|
476
|
+
# not associated with any child
|
|
477
|
+
class NoSuchChild < ArgumentError
|
|
478
|
+
# @return [Object] the object whose children we try to access
|
|
479
|
+
attr_reader :object
|
|
480
|
+
# @return [String] the role that failed to be resolved
|
|
481
|
+
attr_reader :role
|
|
482
|
+
# @return [{String=>Object}] the set of known children
|
|
483
|
+
attr_reader :known_children
|
|
484
|
+
|
|
485
|
+
def initialize(object, role, known_children)
|
|
486
|
+
@object, @role, @known_children = object, role, known_children
|
|
487
|
+
end
|
|
488
|
+
|
|
489
|
+
def pretty_print(pp)
|
|
490
|
+
pp.text "#{object} has no child with the role '#{role}'"
|
|
491
|
+
|
|
492
|
+
if known_children.empty?
|
|
493
|
+
pp.text ", actually, it has no child at all"
|
|
494
|
+
else
|
|
495
|
+
pp.text ". Known children:"
|
|
496
|
+
pp.nest(2) do
|
|
497
|
+
known_children.each do |role, child|
|
|
498
|
+
pp.breakable
|
|
499
|
+
pp.text "#{role}: #{child}"
|
|
500
|
+
end
|
|
501
|
+
end
|
|
502
|
+
end
|
|
503
|
+
end
|
|
504
|
+
end
|
|
505
|
+
|
|
506
|
+
# Exception raised when a finished task has a promise attached, or when one
|
|
507
|
+
# attempts to create one on a finished task
|
|
508
|
+
class PromiseInFinishedTask < RuntimeError; end
|
|
509
|
+
|
|
510
|
+
# Exception used when a state transition fails within an action state
|
|
511
|
+
# machine
|
|
512
|
+
class ActionStateTransitionFailed < LocalizedError
|
|
513
|
+
# The state that we're transitioning out of
|
|
514
|
+
# @return [Coordination::Task]
|
|
515
|
+
attr_reader :from_state
|
|
516
|
+
# The event that caused the transition
|
|
517
|
+
# @return [Event]
|
|
518
|
+
attr_reader :event
|
|
519
|
+
# The state that we were transitioning into
|
|
520
|
+
# @return [Coordination::Task]
|
|
521
|
+
attr_reader :to_state
|
|
522
|
+
|
|
523
|
+
def initialize(root_task, from_state, event, to_state, original_exception)
|
|
524
|
+
super(root_task)
|
|
525
|
+
@from_state = from_state
|
|
526
|
+
@event = event
|
|
527
|
+
@to_state = to_state
|
|
528
|
+
report_exceptions_from(original_exception)
|
|
529
|
+
end
|
|
530
|
+
|
|
531
|
+
def pretty_print(pp)
|
|
532
|
+
pp.text "#{failed_task} failed a state transition"
|
|
533
|
+
pp.nest(2) do
|
|
534
|
+
pp.breakable
|
|
535
|
+
pp.text "from state "
|
|
536
|
+
pp.nest(2) { from_state.pretty_print(pp) }
|
|
537
|
+
pp.breakable
|
|
538
|
+
pp.text "to state "
|
|
539
|
+
pp.nest(2) { to_state.pretty_print(pp) }
|
|
540
|
+
pp.breakable
|
|
541
|
+
pp.text "caused by event "
|
|
542
|
+
pp.nest(2) { event.pretty_print(pp) }
|
|
543
|
+
end
|
|
544
|
+
end
|
|
545
|
+
end
|
|
223
546
|
end
|
|
224
547
|
|