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,75 @@
|
|
|
1
|
+
module Roby
|
|
2
|
+
module Relations
|
|
3
|
+
module Models
|
|
4
|
+
module Graph
|
|
5
|
+
include MetaRuby::ModelAsClass
|
|
6
|
+
|
|
7
|
+
# @api private
|
|
8
|
+
#
|
|
9
|
+
# Hook method called to setup a new relation graph
|
|
10
|
+
def setup_submodel(submodel, child_name: nil, distribute: true, dag: false, weak: false, strong: false, copy_on_replace: false, noinfo: true, subsets: Set.new)
|
|
11
|
+
super
|
|
12
|
+
submodel.instance_variable_set :@child_name, child_name
|
|
13
|
+
submodel.distribute = distribute
|
|
14
|
+
submodel.dag = dag
|
|
15
|
+
submodel.weak = weak
|
|
16
|
+
submodel.strong = strong
|
|
17
|
+
submodel.copy_on_replace = copy_on_replace
|
|
18
|
+
submodel.embeds_info = !noinfo
|
|
19
|
+
submodel.instance_variable_set :@subsets, Set.new
|
|
20
|
+
submodel.instance_variable_set :@parent, nil
|
|
21
|
+
subsets.each do |rel|
|
|
22
|
+
submodel.superset_of(rel)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
attr_predicate :distribute?, true
|
|
27
|
+
attr_predicate :dag?, true
|
|
28
|
+
attr_predicate :weak?, true
|
|
29
|
+
attr_predicate :strong?, true
|
|
30
|
+
attr_predicate :copy_on_replace?, true
|
|
31
|
+
attr_predicate :embeds_info?, true
|
|
32
|
+
|
|
33
|
+
# The child_name as given to Space#relation
|
|
34
|
+
#
|
|
35
|
+
# This is used to dispatch to the relation-specific hooks in
|
|
36
|
+
# {DirectedRelationSupport}
|
|
37
|
+
attr_reader :child_name
|
|
38
|
+
|
|
39
|
+
# The set of graphs that are subsets of self
|
|
40
|
+
#
|
|
41
|
+
# @return [Set<Graph>]
|
|
42
|
+
attr_reader :subsets
|
|
43
|
+
|
|
44
|
+
# The one and only graph that is a superset of self
|
|
45
|
+
#
|
|
46
|
+
# @return [Graph,nil]
|
|
47
|
+
attr_reader :parent
|
|
48
|
+
|
|
49
|
+
# Sets the graph that is a superset of self
|
|
50
|
+
#
|
|
51
|
+
# @raise [ArgumentError] if there is already one
|
|
52
|
+
def parent=(rel)
|
|
53
|
+
if @parent && @parent != rel
|
|
54
|
+
raise ArgumentError, "#{self} already has a parent (#{@parent})"
|
|
55
|
+
end
|
|
56
|
+
@parent = rel
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# True if this relation graph is the subset of no other relation
|
|
60
|
+
def root_relation?
|
|
61
|
+
!parent
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Declare that self is a superset of another graph
|
|
65
|
+
#
|
|
66
|
+
# @param [Graph] rel
|
|
67
|
+
def superset_of(rel)
|
|
68
|
+
subsets << rel
|
|
69
|
+
rel.parent = self
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module Roby
|
|
2
|
+
module Relations
|
|
3
|
+
module Models
|
|
4
|
+
module TaskRelationGraph
|
|
5
|
+
# If true, the tasks that have a parent in this relation will still be
|
|
6
|
+
# available for scheduling. Otherwise, they won't get scheduled
|
|
7
|
+
attr_predicate :scheduling?, true
|
|
8
|
+
|
|
9
|
+
def setup_submodel(submodel, scheduling: true, **options)
|
|
10
|
+
super(submodel, **options)
|
|
11
|
+
submodel.scheduling = scheduling
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
|
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
module Roby
|
|
2
|
+
module Relations
|
|
3
|
+
# A relation space is a module which handles a list of relations
|
|
4
|
+
# (Relations::Graph instances) and applies them to a set of classes.
|
|
5
|
+
# For instance, the TaskStructure relation space is defined by
|
|
6
|
+
# TaskStructure = Space(Task)
|
|
7
|
+
#
|
|
8
|
+
# See the files in roby/relations to see example definitions of new
|
|
9
|
+
# relations
|
|
10
|
+
#
|
|
11
|
+
# Use Space#relation allow to define a new relation in a given
|
|
12
|
+
# space. For instance, one can either do
|
|
13
|
+
#
|
|
14
|
+
# TaskStructure.relation :NewRelation
|
|
15
|
+
#
|
|
16
|
+
# or
|
|
17
|
+
#
|
|
18
|
+
# module TaskStructure
|
|
19
|
+
# relation :NewRelation
|
|
20
|
+
# end
|
|
21
|
+
#
|
|
22
|
+
# This relation can then be referenced by
|
|
23
|
+
# <tt>TaskStructure::NewRelation</tt>
|
|
24
|
+
class Space < Module
|
|
25
|
+
# The set of relations included in this relation space
|
|
26
|
+
attr_reader :relations
|
|
27
|
+
# The set of classes on which the relations have been applied
|
|
28
|
+
attr_reader :applied
|
|
29
|
+
# The default graph class to be used for new relations. Defaults to
|
|
30
|
+
# Relations::Graph
|
|
31
|
+
attr_accessor :default_graph_class
|
|
32
|
+
|
|
33
|
+
def initialize # :nodoc:
|
|
34
|
+
@relations = Array.new
|
|
35
|
+
@applied = Array.new
|
|
36
|
+
@default_graph_class = Relations::Graph
|
|
37
|
+
super
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def self.new_relation_graph_mapping
|
|
41
|
+
Hash.new do |h, k|
|
|
42
|
+
if k
|
|
43
|
+
if k.kind_of?(Class)
|
|
44
|
+
known_relations = h.each_key.find_all { |rel| rel.kind_of?(Class) }
|
|
45
|
+
raise ArgumentError, "#{k} is not a known relation (known relations are #{known_relations.map { |o| "#{o.name}" }.join(", ")})"
|
|
46
|
+
elsif known_graph = h.fetch(k.class, nil)
|
|
47
|
+
raise ArgumentError, "it seems that you're trying to use the relation API to access a graph that is not part of this object's current plan. Given graph was #{k.object_id}, and the current graph for #{k.class} is #{known_graph.object_id}"
|
|
48
|
+
else
|
|
49
|
+
raise ArgumentError, "graph object #{known_graph} is not a known relation graph"
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Instanciate this space's relation graphs
|
|
56
|
+
#
|
|
57
|
+
# It instanciates a graph per relation defined on self, and sets
|
|
58
|
+
# their subset/superset relationships accordingly
|
|
59
|
+
#
|
|
60
|
+
# @param observer a graph observer object
|
|
61
|
+
# @return [Hash<Models<Graph>,Graph>]
|
|
62
|
+
def instanciate(observer: nil)
|
|
63
|
+
graphs = self.class.new_relation_graph_mapping
|
|
64
|
+
relations.each do |rel|
|
|
65
|
+
g = rel.new(observer: observer)
|
|
66
|
+
graphs[g] = graphs[rel] = g
|
|
67
|
+
end
|
|
68
|
+
relations.each do |rel|
|
|
69
|
+
rel.subsets.each do |subset_rel|
|
|
70
|
+
graphs[rel].superset_of(graphs[subset_rel])
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
graphs
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# This relation applies on +klass+. It mainly means that a relation
|
|
77
|
+
# defined on this Space will define the relation-access methods
|
|
78
|
+
# and include its support module (if any) in +klass+. Note that the
|
|
79
|
+
# {DirectedRelationSupport} module is automatically included in +klass+
|
|
80
|
+
# as well.
|
|
81
|
+
def apply_on(klass)
|
|
82
|
+
klass.include DirectedRelationSupport
|
|
83
|
+
klass.relation_spaces << self
|
|
84
|
+
each_relation do |graph|
|
|
85
|
+
klass.include graph::Extension
|
|
86
|
+
end
|
|
87
|
+
applied << klass
|
|
88
|
+
|
|
89
|
+
while klass
|
|
90
|
+
if klass.respond_to?(:all_relation_spaces)
|
|
91
|
+
klass.all_relation_spaces << self
|
|
92
|
+
end
|
|
93
|
+
klass = if klass.respond_to?(:supermodel) then klass.supermodel
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# Yields the relations that are defined on this space
|
|
99
|
+
def each_relation
|
|
100
|
+
return enum_for(__method__) if !block_given?
|
|
101
|
+
relations.each do |rel|
|
|
102
|
+
yield(rel)
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
# Yields the root relations that are defined on this space. A relation
|
|
107
|
+
# is a root relation when it has no parent relation (i.e. it is the
|
|
108
|
+
# subset of no other relations).
|
|
109
|
+
def each_root_relation
|
|
110
|
+
return enum_for(__method__) if !block_given?
|
|
111
|
+
relations.each do |rel|
|
|
112
|
+
yield(rel) if !rel.parent
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# Defines a relation in this relation space. This defines a relation
|
|
117
|
+
# graph, and various iteration methods on the vertices. If a block is
|
|
118
|
+
# given, it defines a set of functions which should additionally be
|
|
119
|
+
# defined on the vertex objects.
|
|
120
|
+
#
|
|
121
|
+
# The valid options are:
|
|
122
|
+
#
|
|
123
|
+
# child_name::
|
|
124
|
+
# define a <tt>each_#{child_name}</tt> method to iterate
|
|
125
|
+
# on the vertex children. Uses the relation name by default (a Child
|
|
126
|
+
# relation would define a <tt>each_child</tt> method)
|
|
127
|
+
# parent_name::
|
|
128
|
+
# define a <tt>each_#{parent_name}</tt> method to iterate
|
|
129
|
+
# on the parent vertices. If none is given, no method is defined.
|
|
130
|
+
# subsets:: a list of subgraphs. See Relations::Graph#superset_of [empty set by default]
|
|
131
|
+
# noinfo::
|
|
132
|
+
# wether the relation embeds some additional information. If false,
|
|
133
|
+
# the child iterator method (<tt>each_#{child_name}</tt>) will yield (child,
|
|
134
|
+
# info) instead of only child [false by default]
|
|
135
|
+
# graph:: the relation graph class [Relations::Graph by default]
|
|
136
|
+
# distribute:: if true, the relation can be seen by remote peers [true by default]
|
|
137
|
+
# single_child::
|
|
138
|
+
# if the relations accepts only one child per vertex. If this option
|
|
139
|
+
# is set, defines a <tt>#{child_name}</tt> method which returns the
|
|
140
|
+
# only child (or nil if there is no child at all) [false by default]
|
|
141
|
+
# dag::
|
|
142
|
+
# if true, {CycleFoundError} will be raised if a new vertex would
|
|
143
|
+
# create a cycle in this relation [true by default]
|
|
144
|
+
# weak::
|
|
145
|
+
# marks that this relation might be broken by the plan manager if
|
|
146
|
+
# needs be. This is currently only used in the garbage collection
|
|
147
|
+
# phase to decide in which order to GC the tasks. I.e. if a cycle is
|
|
148
|
+
# found, the weak relations will be broken to resolve it.
|
|
149
|
+
# strong::
|
|
150
|
+
# marks that the tasks that are linked by this relation should not be
|
|
151
|
+
# torn apart. This is for instance used in the replacement operation,
|
|
152
|
+
# which will never "move" a relation from the original task to the
|
|
153
|
+
# replaced one.
|
|
154
|
+
#
|
|
155
|
+
# For instance,
|
|
156
|
+
# relation :Children
|
|
157
|
+
#
|
|
158
|
+
# defines an instance of Relations::Graph which is a DAG, defining the
|
|
159
|
+
# following methods on its vertices:
|
|
160
|
+
# each_children { |v, info| ... } => graph
|
|
161
|
+
# find_children { |v, info| ... } => object or nil
|
|
162
|
+
# add_children(v, info = nil) => graph
|
|
163
|
+
# remove_children(v) => graph
|
|
164
|
+
#
|
|
165
|
+
# and
|
|
166
|
+
#
|
|
167
|
+
# relation :Children, child_name: :child
|
|
168
|
+
#
|
|
169
|
+
# would define
|
|
170
|
+
#
|
|
171
|
+
# each_child { |v, info| ... } => graph
|
|
172
|
+
# find_child { |v, info| ... } => object or nil
|
|
173
|
+
# add_child(v, info = nil) => graph
|
|
174
|
+
# remove_child(v) => graph
|
|
175
|
+
#
|
|
176
|
+
# * the {DirectedRelationSupport} module gets included in the vertex classes at the
|
|
177
|
+
# construction of the Space instance. See #apply_on.
|
|
178
|
+
# * the <tt>:noinfo</tt> option would then remove the 'info' parameter
|
|
179
|
+
# to the various blocks.
|
|
180
|
+
# * if <tt>:single_child</tt> is set to true, then an additional method is defined:
|
|
181
|
+
# child => object or nil
|
|
182
|
+
# * and finally if the following is used
|
|
183
|
+
# relation :Children, child_name: :child, parent_name: :parent
|
|
184
|
+
# then the following method is additionally defined
|
|
185
|
+
# each_parent { |v| ... }
|
|
186
|
+
#
|
|
187
|
+
# Finally, if a block is given, it gets included in the target class
|
|
188
|
+
# (i.e. for a TaskStructure relation, Roby::Task)
|
|
189
|
+
def relation(relation_name,
|
|
190
|
+
child_name: relation_name.to_s.snakecase,
|
|
191
|
+
const_name: relation_name,
|
|
192
|
+
parent_name: nil,
|
|
193
|
+
graph: default_graph_class,
|
|
194
|
+
single_child: false,
|
|
195
|
+
|
|
196
|
+
distribute: true,
|
|
197
|
+
dag: true,
|
|
198
|
+
weak: false,
|
|
199
|
+
strong: false,
|
|
200
|
+
copy_on_replace: false,
|
|
201
|
+
noinfo: false,
|
|
202
|
+
subsets: Set.new,
|
|
203
|
+
**submodel_options)
|
|
204
|
+
|
|
205
|
+
if block_given?
|
|
206
|
+
raise ArgumentError, "calling relation with a block is not supported anymore. Reopen #{const_name}::Extension after the relation call to add helper methods"
|
|
207
|
+
elsif strong && weak
|
|
208
|
+
raise ArgumentError, "a relation cannot be both strong and weak"
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
# Check if this relation is already defined. If it is the case, reuse it.
|
|
212
|
+
# This is needed mostly by the reloading code
|
|
213
|
+
graph_class = define_or_reuse(const_name) do
|
|
214
|
+
klass = graph.new_submodel(
|
|
215
|
+
distribute: distribute, dag: dag, weak: weak, strong: strong,
|
|
216
|
+
copy_on_replace: copy_on_replace, noinfo: noinfo, subsets: subsets,
|
|
217
|
+
child_name: child_name, **submodel_options)
|
|
218
|
+
synthetized_methods = Module.new do
|
|
219
|
+
define_method("__r_#{relation_name}__") { self.relation_graphs[klass] }
|
|
220
|
+
end
|
|
221
|
+
extension = Module.new
|
|
222
|
+
class_extension = Module.new
|
|
223
|
+
klass.const_set("SynthetizedMethods", synthetized_methods)
|
|
224
|
+
klass.const_set("Extension", extension)
|
|
225
|
+
klass.const_set("ModelExtension", class_extension)
|
|
226
|
+
extension.const_set("ClassExtension", class_extension)
|
|
227
|
+
klass
|
|
228
|
+
end
|
|
229
|
+
subsets.each do |subset_rel|
|
|
230
|
+
graph_class.superset_of(subset_rel)
|
|
231
|
+
end
|
|
232
|
+
synthetized_methods = graph_class::SynthetizedMethods
|
|
233
|
+
extension = graph_class::Extension
|
|
234
|
+
applied.each do |klass|
|
|
235
|
+
klass.include synthetized_methods
|
|
236
|
+
klass.include extension
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
if parent_name
|
|
240
|
+
synthetized_methods.class_eval <<-EOD, __FILE__, __LINE__ + 1
|
|
241
|
+
def each_#{parent_name}(&iterator)
|
|
242
|
+
return enum_for(__method__) if !iterator
|
|
243
|
+
self.each_parent_object(__r_#{relation_name}__, &iterator)
|
|
244
|
+
end
|
|
245
|
+
EOD
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
if noinfo
|
|
249
|
+
synthetized_methods.class_eval <<-EOD, __FILE__, __LINE__ + 1
|
|
250
|
+
def each_#{child_name}(&iterator)
|
|
251
|
+
return enum_for(__method__) if !iterator
|
|
252
|
+
each_child_object(__r_#{relation_name}__, &iterator)
|
|
253
|
+
end
|
|
254
|
+
def find_#{child_name}(&block)
|
|
255
|
+
each_child_object(__r_#{relation_name}__).find(&block)
|
|
256
|
+
end
|
|
257
|
+
EOD
|
|
258
|
+
else
|
|
259
|
+
synthetized_methods.class_eval <<-EOD, __FILE__, __LINE__ + 1
|
|
260
|
+
def enum_#{child_name}
|
|
261
|
+
Roby.warn_deprecated "enum_#{child_name} is deprecated, use each_#{child_name} instead"
|
|
262
|
+
each_#{child_name}
|
|
263
|
+
end
|
|
264
|
+
def each_#{child_name}(with_info = true)
|
|
265
|
+
return enum_for(__method__, with_info) if !block_given?
|
|
266
|
+
if with_info
|
|
267
|
+
each_child_object(__r_#{relation_name}__) do |child|
|
|
268
|
+
yield(child, self[child, __r_#{relation_name}__])
|
|
269
|
+
end
|
|
270
|
+
else
|
|
271
|
+
each_child_object(__r_#{relation_name}__, &Proc.new)
|
|
272
|
+
end
|
|
273
|
+
end
|
|
274
|
+
def find_#{child_name}(with_info = true)
|
|
275
|
+
if with_info
|
|
276
|
+
each_child_object(__r_#{relation_name}__) do |child|
|
|
277
|
+
return child if yield(child, self[child, __r_#{relation_name}__])
|
|
278
|
+
end
|
|
279
|
+
else
|
|
280
|
+
each_child_object(__r_#{relation_name}__).find(&Proc.new)
|
|
281
|
+
end
|
|
282
|
+
nil
|
|
283
|
+
end
|
|
284
|
+
EOD
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
synthetized_methods.class_eval <<-EOD, __FILE__, __LINE__ + 1
|
|
288
|
+
def add_#{child_name}(to, info = nil)
|
|
289
|
+
add_child_object(to, __r_#{relation_name}__, info)
|
|
290
|
+
self
|
|
291
|
+
end
|
|
292
|
+
def remove_#{child_name}(to)
|
|
293
|
+
remove_child_object(to, __r_#{relation_name}__)
|
|
294
|
+
self
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
def adding_#{child_name}_parent(parent, info)
|
|
298
|
+
end
|
|
299
|
+
def added_#{child_name}_parent(parent, info)
|
|
300
|
+
end
|
|
301
|
+
def removing_#{child_name}_parent(parent)
|
|
302
|
+
end
|
|
303
|
+
def removed_#{child_name}_parent(parent)
|
|
304
|
+
end
|
|
305
|
+
def updating_#{child_name}_parent(parent, info)
|
|
306
|
+
end
|
|
307
|
+
def updated_#{child_name}_parent(parent, info)
|
|
308
|
+
end
|
|
309
|
+
|
|
310
|
+
def adding_#{child_name}(child, info)
|
|
311
|
+
end
|
|
312
|
+
def added_#{child_name}(child, info)
|
|
313
|
+
end
|
|
314
|
+
def removing_#{child_name}(child)
|
|
315
|
+
end
|
|
316
|
+
def removed_#{child_name}(child)
|
|
317
|
+
end
|
|
318
|
+
def updating_#{child_name}(child, info)
|
|
319
|
+
end
|
|
320
|
+
def updated_#{child_name}(child, info)
|
|
321
|
+
end
|
|
322
|
+
EOD
|
|
323
|
+
|
|
324
|
+
if single_child
|
|
325
|
+
synthetized_methods.class_eval do
|
|
326
|
+
define_method child_name do
|
|
327
|
+
if task = instance_variable_get("@#{child_name}")
|
|
328
|
+
plan[task]
|
|
329
|
+
end
|
|
330
|
+
end
|
|
331
|
+
end
|
|
332
|
+
graph_class.class_eval do
|
|
333
|
+
attr_reader :single_child_accessor
|
|
334
|
+
|
|
335
|
+
def add_edge(parent, child, info)
|
|
336
|
+
super
|
|
337
|
+
parent.instance_variable_set single_child_accessor, child
|
|
338
|
+
end
|
|
339
|
+
|
|
340
|
+
def update_single_child_accessor(object, expected_object)
|
|
341
|
+
current_object = object.instance_variable_get single_child_accessor
|
|
342
|
+
if current_object == expected_object
|
|
343
|
+
object.instance_variable_set single_child_accessor,
|
|
344
|
+
each_out_neighbour(object).first
|
|
345
|
+
end
|
|
346
|
+
end
|
|
347
|
+
|
|
348
|
+
def remove_edge(parent, child)
|
|
349
|
+
super
|
|
350
|
+
update_single_child_accessor(parent, child)
|
|
351
|
+
end
|
|
352
|
+
|
|
353
|
+
def remove_vertex(object)
|
|
354
|
+
parents = in_neighbours(object)
|
|
355
|
+
super
|
|
356
|
+
parents.each do |parent|
|
|
357
|
+
update_single_child_accessor(parent, object)
|
|
358
|
+
end
|
|
359
|
+
end
|
|
360
|
+
end
|
|
361
|
+
end
|
|
362
|
+
|
|
363
|
+
add_relation(graph_class)
|
|
364
|
+
graph_class
|
|
365
|
+
end
|
|
366
|
+
|
|
367
|
+
def add_relation(rel)
|
|
368
|
+
relations << rel
|
|
369
|
+
Relations.add_relation(rel)
|
|
370
|
+
end
|
|
371
|
+
|
|
372
|
+
# Remove +rel+ from the set of relations managed in this space
|
|
373
|
+
def remove_relation(rel)
|
|
374
|
+
relations.delete(rel)
|
|
375
|
+
Relations.remove_relation(rel)
|
|
376
|
+
end
|
|
377
|
+
end
|
|
378
|
+
end
|
|
379
|
+
end
|
|
380
|
+
|