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
|
@@ -1,325 +0,0 @@
|
|
|
1
|
-
require 'roby/task'
|
|
2
|
-
require 'roby/event'
|
|
3
|
-
require 'delegate'
|
|
4
|
-
require 'forwardable'
|
|
5
|
-
require 'utilrb/module/ancestor_p'
|
|
6
|
-
|
|
7
|
-
# The Transactions module define all tools needed to implement
|
|
8
|
-
# the Transaction class
|
|
9
|
-
module Roby::Transactions
|
|
10
|
-
# In transactions, we do not manipulate plan objects like Task and EventGenerator directly,
|
|
11
|
-
# but through proxies which make sure that nothing forbidden is done
|
|
12
|
-
#
|
|
13
|
-
# The Proxy module define base functionalities for these proxy objects
|
|
14
|
-
module Proxy
|
|
15
|
-
@@proxy_klass = []
|
|
16
|
-
@@forwarders = Hash.new
|
|
17
|
-
|
|
18
|
-
def to_s; "tProxy(#{__getobj__.to_s})" end
|
|
19
|
-
|
|
20
|
-
# Returns the proxy for +object+. Raises ArgumentError if +object+ is
|
|
21
|
-
# not an object which should be wrapped
|
|
22
|
-
def self.proxy_class(object)
|
|
23
|
-
proxy_class = @@proxy_klass.find { |_, real_klass| object.kind_of?(real_klass) }
|
|
24
|
-
unless proxy_class
|
|
25
|
-
raise ArgumentError, "no proxy for #{object.class}"
|
|
26
|
-
end
|
|
27
|
-
proxy_class[0]
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
# Declare that +proxy_klass+ should be used to wrap objects of +real_klass+.
|
|
31
|
-
# Order matters: if more than one wrapping matches, we will use the one
|
|
32
|
-
# defined last.
|
|
33
|
-
def self.proxy_for(proxy_klass, real_klass)
|
|
34
|
-
@@proxy_klass.unshift [proxy_klass, real_klass]
|
|
35
|
-
proxy_klass.extend Forwardable
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
# Returns a class that forwards every calls to +proxy.__getobj__+
|
|
39
|
-
def self.forwarder(object)
|
|
40
|
-
klass = object.class
|
|
41
|
-
@@forwarders[klass] ||= DelegateClass(klass)
|
|
42
|
-
@@forwarders[klass].new(object)
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
def initialize(object, transaction)
|
|
46
|
-
@distribute = nil
|
|
47
|
-
@transaction = transaction
|
|
48
|
-
@__getobj__ = object
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
module ClassExtension
|
|
52
|
-
def proxy_for(klass); Proxy.proxy_for(self, klass) end
|
|
53
|
-
|
|
54
|
-
def proxy_code(m)
|
|
55
|
-
"return unless proxying?
|
|
56
|
-
args = args.map(&plan.method(:may_unwrap))
|
|
57
|
-
result = if block_given?
|
|
58
|
-
__getobj__.#{m}(*args) do |*objects|
|
|
59
|
-
objects.map! { |o| transaction.may_wrap(o) }
|
|
60
|
-
yield(*objects)
|
|
61
|
-
end
|
|
62
|
-
else
|
|
63
|
-
__getobj__.#{m}(*args)
|
|
64
|
-
end
|
|
65
|
-
transaction.may_wrap(result)"
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
def proxy(*methods)
|
|
69
|
-
methods.each do |m|
|
|
70
|
-
class_eval "def #{m}(*args); #{proxy_code(m)} end"
|
|
71
|
-
end
|
|
72
|
-
end
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
attr_reader :transaction
|
|
76
|
-
attr_reader :__getobj__
|
|
77
|
-
|
|
78
|
-
alias :== :eql?
|
|
79
|
-
|
|
80
|
-
def pretty_print(pp)
|
|
81
|
-
if plan
|
|
82
|
-
plan.disable_proxying { super }
|
|
83
|
-
else
|
|
84
|
-
super
|
|
85
|
-
end
|
|
86
|
-
end
|
|
87
|
-
def proxying?; plan && plan.proxying? end
|
|
88
|
-
|
|
89
|
-
# Uses the +enum+ method on this proxy and on the proxied object to get
|
|
90
|
-
# a set of objects related to this one in both the plan and the
|
|
91
|
-
# transaction.
|
|
92
|
-
#
|
|
93
|
-
# The block is then given a plan_object => transaction_object hash, the
|
|
94
|
-
# relation which is being considered, the set of new relations (the
|
|
95
|
-
# relations that are in the transaction but not in the plan) and the
|
|
96
|
-
# set of deleted relation (relations that are in the plan but not in
|
|
97
|
-
# the transaction)
|
|
98
|
-
def partition_new_old_relations(enum) # :yield:
|
|
99
|
-
trsc_objects = Hash.new
|
|
100
|
-
each_relation do |rel|
|
|
101
|
-
trsc_others = send(enum, rel).
|
|
102
|
-
map do |obj|
|
|
103
|
-
plan_object = plan.may_unwrap(obj)
|
|
104
|
-
trsc_objects[plan_object] = obj
|
|
105
|
-
plan_object
|
|
106
|
-
end.to_value_set
|
|
107
|
-
|
|
108
|
-
plan_others = __getobj__.send(enum, rel).
|
|
109
|
-
find_all { |obj| plan[obj, false] }.
|
|
110
|
-
to_value_set
|
|
111
|
-
|
|
112
|
-
new = (trsc_others - plan_others)
|
|
113
|
-
del = (plan_others - trsc_others)
|
|
114
|
-
|
|
115
|
-
yield(trsc_objects, rel, new, del)
|
|
116
|
-
end
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
# Commits the modifications of this proxy. It copies the relations of
|
|
120
|
-
# the proxy on the proxied object
|
|
121
|
-
def commit_transaction
|
|
122
|
-
real_object = __getobj__
|
|
123
|
-
partition_new_old_relations(:parent_objects) do |trsc_objects, rel, new, del|
|
|
124
|
-
for other in new
|
|
125
|
-
other.add_child_object(real_object, rel, trsc_objects[other][self, rel])
|
|
126
|
-
end
|
|
127
|
-
for other in del
|
|
128
|
-
other.remove_child_object(real_object, rel)
|
|
129
|
-
end
|
|
130
|
-
end
|
|
131
|
-
|
|
132
|
-
partition_new_old_relations(:child_objects) do |trsc_objects, rel, new, del|
|
|
133
|
-
for other in new
|
|
134
|
-
real_object.add_child_object(other, rel, self[trsc_objects[other], rel])
|
|
135
|
-
end
|
|
136
|
-
for other in del
|
|
137
|
-
real_object.remove_child_object(other, rel)
|
|
138
|
-
end
|
|
139
|
-
end
|
|
140
|
-
|
|
141
|
-
super if defined? super
|
|
142
|
-
end
|
|
143
|
-
|
|
144
|
-
# Discards the transaction by clearing this proxy
|
|
145
|
-
def discard_transaction
|
|
146
|
-
clear_vertex
|
|
147
|
-
super if defined? super
|
|
148
|
-
end
|
|
149
|
-
end
|
|
150
|
-
|
|
151
|
-
# Proxy for Roby::EventGenerator
|
|
152
|
-
class EventGenerator < Roby::EventGenerator
|
|
153
|
-
include Proxy
|
|
154
|
-
proxy_for Roby::EventGenerator
|
|
155
|
-
|
|
156
|
-
def_delegator :@__getobj__, :symbol
|
|
157
|
-
def_delegator :@__getobj__, :model
|
|
158
|
-
proxy :can_signal?
|
|
159
|
-
|
|
160
|
-
def initialize(object, transaction)
|
|
161
|
-
super(object, transaction)
|
|
162
|
-
@unreachable_handlers = []
|
|
163
|
-
if object.controlable?
|
|
164
|
-
self.command = method(:emit)
|
|
165
|
-
end
|
|
166
|
-
end
|
|
167
|
-
|
|
168
|
-
def commit_transaction
|
|
169
|
-
super
|
|
170
|
-
handlers.each { |h| __getobj__.on(&h) }
|
|
171
|
-
end
|
|
172
|
-
|
|
173
|
-
def_delegator :@__getobj__, :owners
|
|
174
|
-
def_delegator :@__getobj__, :distribute?
|
|
175
|
-
def has_sibling?(peer); plan.has_sibling?(peer) end
|
|
176
|
-
|
|
177
|
-
def executable?; false end
|
|
178
|
-
def unreachable!; end
|
|
179
|
-
end
|
|
180
|
-
|
|
181
|
-
# Transaction proxy for Roby::TaskEventGenerator
|
|
182
|
-
class TaskEventGenerator < Roby::Transactions::EventGenerator
|
|
183
|
-
proxy_for Roby::TaskEventGenerator
|
|
184
|
-
|
|
185
|
-
# The transaction proxy which represents the event generator's real
|
|
186
|
-
# task
|
|
187
|
-
attr_reader :task
|
|
188
|
-
child_plan_object :task
|
|
189
|
-
|
|
190
|
-
# Create a new proxy representing +object+ in +transaction+
|
|
191
|
-
def initialize(object, transaction)
|
|
192
|
-
super(object, transaction)
|
|
193
|
-
@task = transaction.wrap(object.task)
|
|
194
|
-
end
|
|
195
|
-
|
|
196
|
-
# Task event generators do not have siblings on remote plan managers.
|
|
197
|
-
# They are always referenced by their name and task.
|
|
198
|
-
def has_sibling?(peer); false end
|
|
199
|
-
end
|
|
200
|
-
|
|
201
|
-
# Transaction proxy for Roby::Task
|
|
202
|
-
class Task < Roby::Task
|
|
203
|
-
include Proxy
|
|
204
|
-
proxy_for Roby::Task
|
|
205
|
-
|
|
206
|
-
def to_s; "tProxy(#{__getobj__.name})#{arguments}" end
|
|
207
|
-
|
|
208
|
-
def_delegator :@__getobj__, :running?
|
|
209
|
-
def_delegator :@__getobj__, :finished?
|
|
210
|
-
def_delegator :@__getobj__, :pending?
|
|
211
|
-
def_delegator :@__getobj__, :model
|
|
212
|
-
def_delegator :@__getobj__, :has_event?
|
|
213
|
-
|
|
214
|
-
def_delegator :@__getobj__, :pending?
|
|
215
|
-
def_delegator :@__getobj__, :running?
|
|
216
|
-
def_delegator :@__getobj__, :success?
|
|
217
|
-
def_delegator :@__getobj__, :failed?
|
|
218
|
-
def_delegator :@__getobj__, :finished?
|
|
219
|
-
|
|
220
|
-
proxy :event
|
|
221
|
-
proxy :same_state?
|
|
222
|
-
|
|
223
|
-
def each_plan_child(only_wrapped = false, &block)
|
|
224
|
-
each_event(only_wrapped, &block)
|
|
225
|
-
end
|
|
226
|
-
|
|
227
|
-
def each_event(only_wrapped = false)
|
|
228
|
-
__getobj__.each_event(only_wrapped) do |ev|
|
|
229
|
-
if proxy = plan[ev, !only_wrapped]
|
|
230
|
-
yield(proxy)
|
|
231
|
-
end
|
|
232
|
-
end
|
|
233
|
-
self
|
|
234
|
-
end
|
|
235
|
-
|
|
236
|
-
def kind_of?(klass)
|
|
237
|
-
super || __getobj__.kind_of?(klass)
|
|
238
|
-
end
|
|
239
|
-
|
|
240
|
-
# Remove all relations in which +self+ or its event are involved
|
|
241
|
-
def clear_relations
|
|
242
|
-
each_event(true) do |ev|
|
|
243
|
-
ev.clear_relations
|
|
244
|
-
end
|
|
245
|
-
super(false)
|
|
246
|
-
self
|
|
247
|
-
end
|
|
248
|
-
|
|
249
|
-
# Create a new proxy representing +object+ in +transaction+
|
|
250
|
-
def initialize(object, transaction)
|
|
251
|
-
super(object, transaction)
|
|
252
|
-
|
|
253
|
-
@arguments = Roby::TaskArguments.new(self)
|
|
254
|
-
object.arguments.each do |key, value|
|
|
255
|
-
if value.kind_of?(Roby::PlanObject)
|
|
256
|
-
arguments.update!(key, transaction[value])
|
|
257
|
-
else
|
|
258
|
-
arguments.update!(key, value)
|
|
259
|
-
end
|
|
260
|
-
end
|
|
261
|
-
end
|
|
262
|
-
|
|
263
|
-
# There is no bound_events map in task proxies. The proxy instead
|
|
264
|
-
# enumerates the real task's events and create proxies when needed.
|
|
265
|
-
#
|
|
266
|
-
# #bound_events is not part of the public API anyways
|
|
267
|
-
def bound_events; {} end
|
|
268
|
-
|
|
269
|
-
def instantiate_model_event_relations # :nodoc:
|
|
270
|
-
end
|
|
271
|
-
|
|
272
|
-
# Transaction proxies are never executable
|
|
273
|
-
def executable?; false end
|
|
274
|
-
|
|
275
|
-
# Transaction proxies do not have history
|
|
276
|
-
def history; "" end
|
|
277
|
-
def plan=(new_plan) # :nodoc:
|
|
278
|
-
if new_plan
|
|
279
|
-
if new_plan.plan != __getobj__.plan
|
|
280
|
-
raise "invalid plan #{new_plan}"
|
|
281
|
-
elsif !new_plan.kind_of?(Roby::Transaction)
|
|
282
|
-
raise "trying to insert a transaction proxy in something else than a transaction (#{new_plan})"
|
|
283
|
-
end
|
|
284
|
-
end
|
|
285
|
-
@plan = new_plan
|
|
286
|
-
end
|
|
287
|
-
|
|
288
|
-
# Perform the operations needed for the commit to be successful. In
|
|
289
|
-
# practice, it updates the task arguments as needed.
|
|
290
|
-
def commit_transaction
|
|
291
|
-
super
|
|
292
|
-
|
|
293
|
-
# Update the task arguments. The original
|
|
294
|
-
# Roby::Task#commit_transaction has already translated the proxy
|
|
295
|
-
# objects into real objects
|
|
296
|
-
arguments.each do |key, value|
|
|
297
|
-
__getobj__.arguments.update!(key, value)
|
|
298
|
-
end
|
|
299
|
-
end
|
|
300
|
-
|
|
301
|
-
# Perform the operations needed for the transaction to be discarded.
|
|
302
|
-
def discard_transaction
|
|
303
|
-
clear_relations
|
|
304
|
-
end
|
|
305
|
-
|
|
306
|
-
def method_missing(m, *args, &block) # :nodoc:
|
|
307
|
-
if m.to_s =~ /^(\w+)!$/ && has_event?($1.to_sym)
|
|
308
|
-
event($1.to_sym).call(*args)
|
|
309
|
-
elsif !Roby::Task.method_defined?(m)
|
|
310
|
-
__getobj__.send(m, *args, &block)
|
|
311
|
-
else
|
|
312
|
-
super
|
|
313
|
-
end
|
|
314
|
-
end
|
|
315
|
-
|
|
316
|
-
def_delegator :@__getobj__, :owners
|
|
317
|
-
def_delegator :@__getobj__, :distribute?
|
|
318
|
-
|
|
319
|
-
# True if +peer+ has a representation of this object
|
|
320
|
-
def has_sibling?(peer)
|
|
321
|
-
plan.has_sibling?(peer)
|
|
322
|
-
end
|
|
323
|
-
end
|
|
324
|
-
end
|
|
325
|
-
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
= Fault injection plugin for Roby
|
|
2
|
-
|
|
3
|
-
This is a fault injection plugin for the Roby robotic control framework. It
|
|
4
|
-
allows to test the management of rarely occuring events by simulating the
|
|
5
|
-
emission of those events. This plugin relies only on the core Roby library.
|
|
6
|
-
|
|
7
|
-
== Usage
|
|
8
|
-
|
|
9
|
-
The fault injection plugin can be used in a system to inject some spurious
|
|
10
|
-
events randomly. To set it up, one must call Application#add_fault_model
|
|
11
|
-
in the configuration files of the application. For instance,
|
|
12
|
-
|
|
13
|
-
Roby.app.add_fault_model P3d::Track,
|
|
14
|
-
:no_path, :blocked,
|
|
15
|
-
Roby::FaultInjection::Rate.new(500, 0.3)
|
|
16
|
-
|
|
17
|
-
Would inject events :no_path and :blocked randomly on any task of the P3d:Track
|
|
18
|
-
model. The probability distribution used is a rate distribution with MTTF of
|
|
19
|
-
500s and base probability of 0.3. See Roby::FaultInjection for the description
|
|
20
|
-
of the available probability distributions.
|
|
21
|
-
|
|
22
|
-
== Enabling the plugin
|
|
23
|
-
|
|
24
|
-
The plugin must be enabled in the configuration files (i.e. either in
|
|
25
|
-
<tt>config/init.rb</tt> or in one of the robot-specific files) through a call
|
|
26
|
-
to Roby.app.using:
|
|
27
|
-
|
|
28
|
-
Roby.app.using 'fault_injection'
|
|
29
|
-
|
|
30
|
-
== License:
|
|
31
|
-
|
|
32
|
-
This work is licensed under the CeCiLL-B license, which is a free software
|
|
33
|
-
license similar to the BSD license. See License.txt for details.
|
|
34
|
-
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
if ENV['ROBY_ROOT_DIR']
|
|
2
|
-
$LOAD_PATH << File.join(ENV['ROBY_ROOT_DIR'], 'lib')
|
|
3
|
-
end
|
|
4
|
-
require 'roby/app/plugins/rake'
|
|
5
|
-
|
|
6
|
-
Roby::Rake.plugin_doc("fault_injection") do |rdoc|
|
|
7
|
-
rdoc.title = "Fault injection plugin for Roby"
|
|
8
|
-
rdoc.options << '--main' << 'README.txt'
|
|
9
|
-
rdoc.rdoc_files.include('README.txt', 'TODO.txt', 'History.txt')
|
|
10
|
-
rdoc.rdoc_files.include('fault_injection.rb', 'app.rb')
|
|
11
|
-
end
|
|
12
|
-
|
|
File without changes
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
module Roby
|
|
3
|
-
# Fault injection plugin for Roby
|
|
4
|
-
#
|
|
5
|
-
# Roby::FaultInjection::Application#fault_models defines a set of
|
|
6
|
-
# probabilistic models of emission for task events. It maps task model
|
|
7
|
-
# events to emission models, and during execution will randomly emit
|
|
8
|
-
# events.
|
|
9
|
-
#
|
|
10
|
-
# Fault injection applies only on tasks which are running and interruptible.
|
|
11
|
-
module FaultInjection
|
|
12
|
-
# This module gets included in Roby::Application when the plugin is activated
|
|
13
|
-
module Application
|
|
14
|
-
# The set of fault models defined for this application. More specifically,
|
|
15
|
-
# the emission model for an event +ev+ of a task model +model+ is given by
|
|
16
|
-
#
|
|
17
|
-
# emission_model = Roby.app.fault_models[model][ev]
|
|
18
|
-
#
|
|
19
|
-
# where +ev+ is a symbol.
|
|
20
|
-
attribute(:fault_models) do
|
|
21
|
-
Hash.new { |h, k| h[k] = Hash.new }
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
# call-seq:
|
|
25
|
-
# Roby.app.fault_model task_model, emission_model, ev1, ev2, ...
|
|
26
|
-
#
|
|
27
|
-
# Defines +emission_model+ as the emission model for the listed
|
|
28
|
-
# events of task +task_model+. +ev1+, +ev2+ are symbols.
|
|
29
|
-
#
|
|
30
|
-
# Emission models are objects which must respond to #fault?(task).
|
|
31
|
-
# If this predicate returns true for the running task +task+, then
|
|
32
|
-
# the emission of the tested event will be simulated. The emission
|
|
33
|
-
# models are tested every one second.
|
|
34
|
-
#
|
|
35
|
-
# See Roby::FaultInjection::Rate for an example.
|
|
36
|
-
def add_fault_model(task_model, *args)
|
|
37
|
-
fault_model = args.pop
|
|
38
|
-
args.each do |ev|
|
|
39
|
-
fault_models[task_model][ev.to_sym] = fault_model
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
Application.register_plugin('fault_injection', Roby::FaultInjection::Application) do
|
|
46
|
-
require 'fault_injection'
|
|
47
|
-
Roby.every(1) do
|
|
48
|
-
FaultInjection.apply(Roby.app.fault_models, Roby.plan)
|
|
49
|
-
end
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
|
-
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
module Roby
|
|
2
|
-
class Task
|
|
3
|
-
# Returns for how many seconds this task is running. Returns nil if
|
|
4
|
-
# the task is not running.
|
|
5
|
-
def lifetime
|
|
6
|
-
if running?
|
|
7
|
-
Time.now - history.first.time
|
|
8
|
-
end
|
|
9
|
-
end
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
module FaultInjection
|
|
13
|
-
extend Logger::Hierarchy
|
|
14
|
-
extend Logger::Forward
|
|
15
|
-
|
|
16
|
-
# This fault model is based on a constant fault rate, defined upon the
|
|
17
|
-
# mean-time-to-failure of the task.
|
|
18
|
-
#
|
|
19
|
-
# In this model, the probability of having a fault for task t at any
|
|
20
|
-
# given instant is
|
|
21
|
-
#
|
|
22
|
-
# p(fault) = max * (1.0 - exp(- task.lifetime / mttf))
|
|
23
|
-
#
|
|
24
|
-
class Rate
|
|
25
|
-
attr_reader :mttf, :max
|
|
26
|
-
def initialize(mttf, max = 1.0)
|
|
27
|
-
@mttf, @max = mttf, max
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
def fault?(task)
|
|
31
|
-
f = max * (1.0 - Math.exp(- task.lifetime / mttf))
|
|
32
|
-
rand <= f
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
# Apply the given fault models to the main Roby plan
|
|
37
|
-
def self.apply(fault_models, plan)
|
|
38
|
-
injected_faults = Array.new
|
|
39
|
-
|
|
40
|
-
for model, faults in fault_models
|
|
41
|
-
for ev, p in faults
|
|
42
|
-
plan.find_tasks(model).
|
|
43
|
-
running.not_finishing.
|
|
44
|
-
interruptible.each do |task|
|
|
45
|
-
if p.fault?(task)
|
|
46
|
-
FaultInjection.info "injecting fault #{ev} on #{task}"
|
|
47
|
-
injected_faults << [task, ev, task.inject_fault(ev)]
|
|
48
|
-
end
|
|
49
|
-
end
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
injected_faults
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
class Task
|
|
58
|
-
# Makes the plan behave as if this task had failed by emitting the
|
|
59
|
-
# event +event+ with context +context+.
|
|
60
|
-
#
|
|
61
|
-
# The task must be running and interruptible, and +event+ must be
|
|
62
|
-
# terminal. The default implementation creates a duplicate of this task
|
|
63
|
-
# by using #dup and forwards the +stop+ event of the old task to
|
|
64
|
-
# +event+ on the new one.
|
|
65
|
-
#
|
|
66
|
-
# It returns a new task which replaced this one in the plan. This is
|
|
67
|
-
# the task on which +event+ will actually be emitted.
|
|
68
|
-
def inject_fault(event, context = nil)
|
|
69
|
-
if !running?
|
|
70
|
-
raise ArgumentError, "this task is not running"
|
|
71
|
-
elsif finishing?
|
|
72
|
-
raise ArgumentError, "this task is being stopped"
|
|
73
|
-
elsif !interruptible?
|
|
74
|
-
raise ArgumentError, "fault injection works only on interruptible tasks"
|
|
75
|
-
elsif !event(event).terminal?
|
|
76
|
-
raise ArgumentError, "the injected fault must be a terminal event"
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
new_task = dup
|
|
80
|
-
old_task = self
|
|
81
|
-
|
|
82
|
-
plan.replace_task(old_task, new_task)
|
|
83
|
-
old_task.event(:stop).filter(context).forward_to new_task.event(event)
|
|
84
|
-
|
|
85
|
-
new_task
|
|
86
|
-
end
|
|
87
|
-
end
|
|
88
|
-
end
|
|
89
|
-
|