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
data/lib/roby/relations.rb
CHANGED
|
@@ -1,699 +1,63 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
# removed
|
|
14
|
-
module DirectedRelationSupport
|
|
15
|
-
include BGL::Vertex
|
|
16
|
-
|
|
17
|
-
alias :child_object? :child_vertex?
|
|
18
|
-
alias :parent_object? :parent_vertex?
|
|
19
|
-
alias :related_object? :related_vertex?
|
|
20
|
-
alias :each_child_object :each_child_vertex
|
|
21
|
-
alias :each_parent_object :each_parent_vertex
|
|
22
|
-
alias :each_relation :each_graph
|
|
23
|
-
alias :clear_relations :clear_vertex
|
|
24
|
-
|
|
25
|
-
##
|
|
26
|
-
# :method: enum_relations => enumerator
|
|
27
|
-
# Returns an Enumerator object for the set of relations this object is
|
|
28
|
-
# included in. The same enumerator instance is always returned.
|
|
29
|
-
cached_enum("graph", "relations", false)
|
|
30
|
-
##
|
|
31
|
-
# :method: enum_parent_objects(relation) => enumerator
|
|
32
|
-
# Returns an Enumerator object for the set of parents this object has
|
|
33
|
-
# in +relation+. The same enumerator instance is always returned.
|
|
34
|
-
cached_enum("parent_object", "parent_objects", true)
|
|
35
|
-
##
|
|
36
|
-
# :method: enum_child_objects(relation) => enumerator
|
|
37
|
-
# Returns an Enumerator object for the set of children this object has
|
|
38
|
-
# in +relation+. The same enumerator instance is always returned.
|
|
39
|
-
cached_enum("child_object", "child_objects", true)
|
|
40
|
-
|
|
41
|
-
# The array of relations this object is part of
|
|
42
|
-
def relations; enum_relations.to_a end
|
|
43
|
-
|
|
44
|
-
# Computes and returns the set of objects related with this one (parent
|
|
45
|
-
# or child). If +relation+ is given, enumerate only for this relation,
|
|
46
|
-
# otherwise enumerate for all relations. If +result+ is given, it is a
|
|
47
|
-
# ValueSet in which the related objects are added
|
|
48
|
-
def related_objects(relation = nil, result = nil)
|
|
49
|
-
result ||= ValueSet.new
|
|
50
|
-
if relation
|
|
51
|
-
result.merge(parent_objects(relation).to_value_set)
|
|
52
|
-
result.merge(child_objects(relation).to_value_set)
|
|
53
|
-
else
|
|
54
|
-
each_relation { |rel| related_objects(rel, result) }
|
|
55
|
-
end
|
|
56
|
-
result
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
# Set of all parent objects in +relation+
|
|
60
|
-
alias :parent_objects :enum_parent_objects
|
|
61
|
-
# Set of all child object in +relation+
|
|
62
|
-
alias :child_objects :enum_child_objects
|
|
63
|
-
|
|
64
|
-
# Add a new child object in the +relation+ relation. This calls
|
|
65
|
-
# * #adding_child_object on +self+ and #adding_parent_object on +child+
|
|
66
|
-
# just before the relation is added
|
|
67
|
-
# * #added_child_object on +self+ and #added_parent_object on +child+
|
|
68
|
-
# just after
|
|
69
|
-
def add_child_object(child, relation, info = nil)
|
|
70
|
-
check_is_relation(relation)
|
|
71
|
-
relation.add_relation(self, child, info)
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
# Add a new parent object in the +relation+ relation
|
|
75
|
-
# * #adding_child_object on +parent+ and #adding_parent_object on
|
|
76
|
-
# +self+ just before the relation is added
|
|
77
|
-
# * #added_child_object on +parent+ and #added_child_object on +self+
|
|
78
|
-
# just after
|
|
79
|
-
def add_parent_object(parent, relation, info = nil)
|
|
80
|
-
parent.add_child_object(self, relation, info)
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
# Remove all edges in which +self+ is the source and +child+ the
|
|
84
|
-
# target. If +relation+ is given, it removes only the edge in that
|
|
85
|
-
# relation graph.
|
|
86
|
-
def remove_child_object(child, relation = nil)
|
|
87
|
-
check_is_relation(relation)
|
|
88
|
-
apply_selection(relation, (relation || enum_relations)) do |relation|
|
|
89
|
-
relation.remove_relation(self, child)
|
|
90
|
-
end
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
# Remove all edges in which +self+ is the source. If +relation+
|
|
94
|
-
# is given, it removes only the edges in that relation graph.
|
|
95
|
-
def remove_children(relation = nil)
|
|
96
|
-
apply_selection(relation, (relation || enum_relations)) do |relation|
|
|
97
|
-
self.each_child_object(relation) do |child|
|
|
98
|
-
remove_child_object(child, relation)
|
|
99
|
-
end
|
|
100
|
-
end
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
# Remove all edges in which +child+ is the source and +self+ the
|
|
104
|
-
# target. If +relation+ is given, it removes only the edge in that
|
|
105
|
-
# relation graph.
|
|
106
|
-
def remove_parent_object(parent, relation = nil)
|
|
107
|
-
parent.remove_child_object(self, relation)
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
# Remove all edges in which +self+ is the target. If +relation+
|
|
111
|
-
# is given, it removes only the edges in that relation graph.
|
|
112
|
-
def remove_parents(relation = nil)
|
|
113
|
-
check_is_relation(relation)
|
|
114
|
-
apply_selection(relation, (relation || enum_relations)) do |relation|
|
|
115
|
-
relation.each_parent_object(self) do |parent|
|
|
116
|
-
remove_parent_object(relation, parent)
|
|
117
|
-
end
|
|
118
|
-
end
|
|
119
|
-
end
|
|
120
|
-
|
|
121
|
-
# Remove all relations that point to or come from +to+ If +to+ is nil,
|
|
122
|
-
# it removes all edges in which +self+ is involved.
|
|
123
|
-
#
|
|
124
|
-
# If +relation+ is not nil, only edges of that relation graph are removed.
|
|
125
|
-
def remove_relations(to = nil, relation = nil)
|
|
126
|
-
check_is_relation(relation)
|
|
127
|
-
if to
|
|
128
|
-
remove_parent_object(to, relation)
|
|
129
|
-
remove_child_object(to, relation)
|
|
130
|
-
else
|
|
131
|
-
apply_selection(relation, (relation || enum_relations)) do |relation|
|
|
132
|
-
each_parent_object(relation) { |parent| remove_parent_object(parent, relation) }
|
|
133
|
-
each_child_object(relation) { |child| remove_child_object(child, relation) }
|
|
134
|
-
end
|
|
135
|
-
end
|
|
136
|
-
end
|
|
137
|
-
|
|
138
|
-
# Raises if +type+ does not look like a relation
|
|
139
|
-
def check_is_relation(type) # :nodoc:
|
|
140
|
-
if type && !(RelationGraph === type)
|
|
141
|
-
raise ArgumentError, "#{type} (of class #{type.class}) is not a relation type"
|
|
142
|
-
end
|
|
143
|
-
end
|
|
144
|
-
|
|
145
|
-
# If +object+ is given, yields object or returns +object+ (if a block
|
|
146
|
-
# is given or not). If +object+ is nil, either yields the elements of
|
|
147
|
-
# +enumerator+ or returns enumerator.
|
|
148
|
-
def apply_selection(object, enumerator) # :nodoc:
|
|
149
|
-
if block_given?
|
|
150
|
-
if object; yield(object)
|
|
151
|
-
else enumerator.each { |o| yield(o) }
|
|
152
|
-
end
|
|
153
|
-
else
|
|
154
|
-
if object; [object]
|
|
155
|
-
else; enumerator
|
|
156
|
-
end
|
|
157
|
-
end
|
|
158
|
-
end
|
|
159
|
-
private :apply_selection
|
|
160
|
-
end
|
|
161
|
-
|
|
162
|
-
# This class manages the graph defined by an object relation in Roby.
|
|
163
|
-
#
|
|
164
|
-
# Relation graphs are managed in hierarchies (for instance, in
|
|
165
|
-
# EventStructure, Precedence is a superset of CausalLink, and CausalLink a
|
|
166
|
-
# superset of both Forwarding and Signal). In this hierarchy, at each
|
|
167
|
-
# level, an edge cannot be present in more than one graph. Nonetheless, it
|
|
168
|
-
# is possible for a parent relation to have an edge which is present in
|
|
169
|
-
# none of its children.
|
|
170
|
-
#
|
|
171
|
-
# Each relation define two things:
|
|
172
|
-
# * a graph, which is represented by the RelationGraph instance itself
|
|
173
|
-
# * support methods that are defined on the vertices of the relation. They
|
|
174
|
-
# allow to manage the vertex in its relations easily. Those methods are
|
|
175
|
-
# defined in a separate module (see #support)
|
|
176
|
-
#
|
|
177
|
-
# In general, relations are part of a RelationSpace instance, which manages
|
|
178
|
-
# the set of relations whose vertices are of the same kind (for instance
|
|
179
|
-
# TaskStructure manages all relations whose vertices are Task instances).
|
|
180
|
-
# In these cases, RelationSpace#relation allow to define new relations easily.
|
|
181
|
-
class RelationGraph < BGL::Graph
|
|
182
|
-
# The relation name
|
|
183
|
-
attr_reader :name
|
|
184
|
-
# The relation parent (if any). See #superset_of.
|
|
185
|
-
attr_accessor :parent
|
|
186
|
-
# The set of graphs
|
|
187
|
-
attr_reader :subsets
|
|
188
|
-
# The graph options as given to RelationSpace#relation
|
|
189
|
-
attr_reader :options
|
|
190
|
-
|
|
191
|
-
# Creates a relation graph with the given name and options. The
|
|
192
|
-
# following options are recognized:
|
|
193
|
-
# +dag+::
|
|
194
|
-
# if the graph is a DAG. If true, add_relation will check that
|
|
195
|
-
# no cycle is created
|
|
196
|
-
# +subsets+::
|
|
197
|
-
# a set of RelationGraph objects that are children of this one.
|
|
198
|
-
# See #superset_of.
|
|
199
|
-
# +distributed+::
|
|
200
|
-
# if this relation graph should be seen by remote hosts
|
|
201
|
-
def initialize(name, options = {})
|
|
202
|
-
@name = name
|
|
203
|
-
@options = options
|
|
204
|
-
@subsets = ValueSet.new
|
|
205
|
-
@distribute = options[:distribute]
|
|
206
|
-
@dag = options[:dag]
|
|
207
|
-
@weak = options[:weak]
|
|
208
|
-
@embeds_info = !options[:noinfo]
|
|
209
|
-
|
|
210
|
-
if options[:subsets]
|
|
211
|
-
options[:subsets].each(&method(:superset_of))
|
|
212
|
-
end
|
|
213
|
-
end
|
|
1
|
+
require "roby/relations/bidirectional_directed_adjacency_graph"
|
|
2
|
+
require 'rgl/traversal'
|
|
3
|
+
require 'rgl/topsort'
|
|
4
|
+
require "roby/relations/models/directed_relation_support"
|
|
5
|
+
require "roby/relations/fork_merge_visitor"
|
|
6
|
+
require "roby/relations/directed_relation_support"
|
|
7
|
+
require "roby/relations/models/graph"
|
|
8
|
+
require "roby/relations/graph"
|
|
9
|
+
require "roby/relations/event_relation_graph"
|
|
10
|
+
require "roby/relations/models/task_relation_graph"
|
|
11
|
+
require "roby/relations/task_relation_graph"
|
|
12
|
+
require "roby/relations/space"
|
|
214
13
|
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
# consequences. This is mainly used during plan garbage collection to
|
|
221
|
-
# break cross-relations cycles (cycles which exist in the graph union
|
|
222
|
-
# of all the relation graphs).
|
|
223
|
-
attr_predicate :weak
|
|
224
|
-
# If this relation embeds some additional information
|
|
225
|
-
attr_predicate :embeds_info?
|
|
226
|
-
|
|
227
|
-
def to_s; name end
|
|
228
|
-
|
|
229
|
-
# True if this relation does not have a parent
|
|
230
|
-
def root_relation?; !parent end
|
|
14
|
+
module Roby
|
|
15
|
+
module Relations
|
|
16
|
+
# This exception is raised when an edge is being added in a DAG, while this
|
|
17
|
+
# edge would create a cycle.
|
|
18
|
+
class CycleFoundError < RuntimeError; end
|
|
231
19
|
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
def remove(vertex)
|
|
235
|
-
vertex.remove_relations(nil, self)
|
|
236
|
-
super
|
|
20
|
+
class << self
|
|
21
|
+
attr_reader :all_relations
|
|
237
22
|
end
|
|
23
|
+
@all_relations = Array.new
|
|
238
24
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
# If +from+ or +to+ define the following hooks:
|
|
245
|
-
# adding_parent_object(parent, relations, info)
|
|
246
|
-
# adding_child_object(child, relations, info)
|
|
247
|
-
# added_parent_object(parent, relations, info)
|
|
248
|
-
# added_child_object(child, relations, info)
|
|
249
|
-
#
|
|
250
|
-
# then these hooks get respectively called before and after having
|
|
251
|
-
# added the relation, where +relations+ is the set of RelationGraph
|
|
252
|
-
# instances where the edge has been added. It can be either [+self+] if
|
|
253
|
-
# the edge does not already exist in it, or [+self+, +parent+,
|
|
254
|
-
# <tt>parent.parent</tt>, ...] if the parent, grandparent, ... graphs
|
|
255
|
-
# do not include the edge either.
|
|
256
|
-
def add_relation(from, to, info = nil)
|
|
257
|
-
# Get the toplevel DAG in our relation hierarchy. We only test for the
|
|
258
|
-
# DAG property on this one, as it is the union of all its children
|
|
259
|
-
top_dag = nil
|
|
260
|
-
new_relations = []
|
|
261
|
-
rel = self
|
|
262
|
-
while rel
|
|
263
|
-
top_dag = rel if rel.dag?
|
|
264
|
-
if !rel.linked?(from, to)
|
|
265
|
-
new_relations << rel
|
|
266
|
-
end
|
|
267
|
-
rel = rel.parent
|
|
268
|
-
end
|
|
269
|
-
if top_dag && !top_dag.linked?(from, to) && top_dag.reachable?(to, from)
|
|
270
|
-
raise CycleFoundError, "cannot add a #{from} -> #{to} relation since it would create a cycle"
|
|
271
|
-
end
|
|
272
|
-
|
|
273
|
-
# Now check that we're not changing the edge info. This is ignored
|
|
274
|
-
# if +self+ has the noinfo flag set.
|
|
275
|
-
if linked?(from, to)
|
|
276
|
-
if !(old_info = from[to, self]).nil?
|
|
277
|
-
if old_info != info && !(info = merge_info(from, to, old_info, info))
|
|
278
|
-
raise ArgumentError, "trying to change edge information in #{self} for #{from} => #{to}: old was #{old_info} and new is #{info}"
|
|
279
|
-
end
|
|
25
|
+
def self.each_graph_topologically(graphs)
|
|
26
|
+
rel_to_graph = Hash[*graphs.flat_map { |g| [g.class, g] }]
|
|
27
|
+
all_relations.each do |rel|
|
|
28
|
+
if g = rel_to_graph[rel]
|
|
29
|
+
yield(g)
|
|
280
30
|
end
|
|
281
|
-
from[to, self] = info
|
|
282
31
|
end
|
|
283
|
-
|
|
284
|
-
unless new_relations.empty?
|
|
285
|
-
if from.respond_to?(:adding_child_object)
|
|
286
|
-
from.adding_child_object(to, new_relations, info)
|
|
287
|
-
end
|
|
288
|
-
if to.respond_to?(:adding_parent_object)
|
|
289
|
-
to.adding_parent_object(from, new_relations, info)
|
|
290
|
-
end
|
|
291
|
-
|
|
292
|
-
for rel in new_relations
|
|
293
|
-
rel.__bgl_link(from, to, (info if self == rel))
|
|
294
|
-
end
|
|
295
|
-
|
|
296
|
-
if from.respond_to?(:added_child_object)
|
|
297
|
-
from.added_child_object(to, new_relations, info)
|
|
298
|
-
end
|
|
299
|
-
if to.respond_to?(:added_parent_object)
|
|
300
|
-
to.added_parent_object(from, new_relations, info)
|
|
301
|
-
end
|
|
302
|
-
end
|
|
303
|
-
end
|
|
304
|
-
|
|
305
|
-
def merge_info(from, to, old, new)
|
|
306
32
|
end
|
|
307
33
|
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
# possible to add an already existing edge if the +info+ parameter
|
|
311
|
-
# matches.
|
|
312
|
-
def link(from, to, info)
|
|
313
|
-
if linked?(from, to)
|
|
314
|
-
old_info = from[to, self]
|
|
315
|
-
if info != old_info
|
|
316
|
-
if info = merge_info(from, to, old_info, info)
|
|
317
|
-
from[to, self] = info
|
|
318
|
-
return
|
|
319
|
-
else
|
|
320
|
-
raise ArgumentError, "trying to change edge information"
|
|
321
|
-
end
|
|
322
|
-
end
|
|
323
|
-
return
|
|
324
|
-
end
|
|
325
|
-
super(from, to, info)
|
|
326
|
-
end
|
|
327
|
-
|
|
328
|
-
# Remove the relation between +from+ and +to+, in this graph and in its
|
|
329
|
-
# parent graphs as well.
|
|
330
|
-
#
|
|
331
|
-
# If +from+ or +to+ define the following hooks:
|
|
332
|
-
# removing_parent_object(parent, relations)
|
|
333
|
-
# removing_child_object(child, relations)
|
|
334
|
-
# removed_parent_object(parent, relations)
|
|
335
|
-
# removed_child_object(child, relations)
|
|
336
|
-
#
|
|
337
|
-
# then these hooks get respectively called once before and once after
|
|
338
|
-
# having removed the relation, where +relations+ is the set of
|
|
339
|
-
# RelationGraph instances where the edge has been removed. It is always
|
|
340
|
-
# <tt>[self, parent, parent.parent, ...]</tt> up to the root relation
|
|
341
|
-
# which is a superset of +self+.
|
|
342
|
-
def remove_relation(from, to)
|
|
343
|
-
rel = self
|
|
344
|
-
relations = []
|
|
345
|
-
while rel
|
|
346
|
-
relations << rel
|
|
347
|
-
rel = rel.parent
|
|
348
|
-
end
|
|
34
|
+
def self.add_relation(rel)
|
|
35
|
+
sorted_relations = Array.new
|
|
349
36
|
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
to.removing_parent_object(from, relations)
|
|
355
|
-
end
|
|
37
|
+
# Remove from the set of relations the ones that are not leafs
|
|
38
|
+
remaining = self.all_relations
|
|
39
|
+
remaining << rel
|
|
40
|
+
target_size = remaining.size
|
|
356
41
|
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
if from.respond_to?(:removed_child_object)
|
|
362
|
-
from.removed_child_object(to, relations)
|
|
363
|
-
end
|
|
364
|
-
if to.respond_to?(:removed_parent_object)
|
|
365
|
-
to.removed_parent_object(from, relations)
|
|
366
|
-
end
|
|
367
|
-
end
|
|
368
|
-
|
|
369
|
-
# Returns true if +relation+ is included in this relation (i.e. it is
|
|
370
|
-
# either the same relation or one of its children)
|
|
371
|
-
#
|
|
372
|
-
# See also #superset_of
|
|
373
|
-
def subset?(relation)
|
|
374
|
-
self.eql?(relation) || subsets.any? { |subrel| subrel.subset?(relation) }
|
|
375
|
-
end
|
|
376
|
-
|
|
377
|
-
# Returns +true+ if there is an edge +source+ -> +target+ in this graph
|
|
378
|
-
# or in one of its parents
|
|
379
|
-
#
|
|
380
|
-
# See #superset_of for a description of the parent mechanism
|
|
381
|
-
def linked_in_hierarchy?(source, target)
|
|
382
|
-
linked?(source, target) || (parent.linked?(source, target) if parent)
|
|
383
|
-
end
|
|
384
|
-
|
|
385
|
-
# Declare that +self+ is a superset of +relation+. Once this is done,
|
|
386
|
-
# the system manages two constraints:
|
|
387
|
-
# * all new relations added in +relation+ are also added in +self+
|
|
388
|
-
# * it is not allowed for an edge to exist in two different subsets of
|
|
389
|
-
# +self+
|
|
390
|
-
# * of course, if +self+ is a DAG, then in effect +relation+ is constrained
|
|
391
|
-
# to be one as well.
|
|
392
|
-
#
|
|
393
|
-
# One single graph can be the superset of multiple subgraphs (these are
|
|
394
|
-
# stored in the #subsets attribute), but one graph can have only one
|
|
395
|
-
# parent (#parent).
|
|
396
|
-
def superset_of(relation)
|
|
397
|
-
relation.each_edge do |source, target, info|
|
|
398
|
-
if linked_in_hierarchy?(source, target)
|
|
399
|
-
raise ArgumentError, "relation and self already share an edge"
|
|
400
|
-
end
|
|
401
|
-
end
|
|
402
|
-
|
|
403
|
-
relation.parent = self
|
|
404
|
-
subsets << relation
|
|
405
|
-
|
|
406
|
-
# Copy the relations of the child into this graph
|
|
407
|
-
relation.each_edge do |source, target, info|
|
|
408
|
-
source.add_child_object(target, self, info)
|
|
409
|
-
end
|
|
410
|
-
end
|
|
411
|
-
|
|
412
|
-
# The Ruby module that gets included in graph objects
|
|
413
|
-
attr_accessor :support
|
|
414
|
-
end
|
|
415
|
-
|
|
416
|
-
# A relation space is a module which handles a list of relations
|
|
417
|
-
# (RelationGraph instances) and applies them to a set of classes.
|
|
418
|
-
# For instance, the TaskStructure relation space is defined by
|
|
419
|
-
# TaskStructure = RelationSpace(Task)
|
|
420
|
-
#
|
|
421
|
-
# See the files in roby/relations to see example definitions of new
|
|
422
|
-
# relations
|
|
423
|
-
#
|
|
424
|
-
# Use RelationSpace#relation allow to define a new relation in a given
|
|
425
|
-
# space. For instance, one can either do
|
|
426
|
-
#
|
|
427
|
-
# TaskStructure.relation :NewRelation
|
|
428
|
-
#
|
|
429
|
-
# or
|
|
430
|
-
#
|
|
431
|
-
# module TaskStructure
|
|
432
|
-
# relation :NewRelation
|
|
433
|
-
# end
|
|
434
|
-
#
|
|
435
|
-
# This relation can then be referenced by
|
|
436
|
-
# <tt>TaskStructure::NewRelation</tt>
|
|
437
|
-
class RelationSpace < Module
|
|
438
|
-
# The set of relations included in this relation space
|
|
439
|
-
attr_reader :relations
|
|
440
|
-
# The set of classes on which the relations have been applied
|
|
441
|
-
attr_reader :applied
|
|
442
|
-
|
|
443
|
-
def initialize # :nodoc:
|
|
444
|
-
@relations = Array.new
|
|
445
|
-
@applied = Array.new
|
|
446
|
-
super
|
|
447
|
-
end
|
|
448
|
-
|
|
449
|
-
# This relation applies on +klass+. It mainly means that a relation
|
|
450
|
-
# defined on this RelationSpace will define the relation-access methods
|
|
451
|
-
# and include its support module (if any) in +klass+. Note that the
|
|
452
|
-
# DirectedRelationSupport module is automatically included in +klass+
|
|
453
|
-
# as well.
|
|
454
|
-
def apply_on(klass)
|
|
455
|
-
klass.include DirectedRelationSupport
|
|
456
|
-
each_relation do |graph|
|
|
457
|
-
klass.include graph.support
|
|
458
|
-
end
|
|
459
|
-
|
|
460
|
-
applied << klass
|
|
461
|
-
end
|
|
462
|
-
|
|
463
|
-
# Yields the relations that are defined on this space
|
|
464
|
-
def each_relation
|
|
465
|
-
for rel in relations
|
|
466
|
-
yield(rel)
|
|
467
|
-
end
|
|
468
|
-
end
|
|
469
|
-
|
|
470
|
-
# Yields the root relations that are defined on this space. A relation
|
|
471
|
-
# is a root relation when it has no parent relation (i.e. it is the
|
|
472
|
-
# subset of no other relations).
|
|
473
|
-
def each_root_relation
|
|
474
|
-
for rel in relations
|
|
475
|
-
yield(rel) unless rel.parent
|
|
476
|
-
end
|
|
477
|
-
end
|
|
478
|
-
|
|
479
|
-
# Returns the set of objects that are reachable from +obj+ in the union
|
|
480
|
-
# graph of all the relations defined in this space. In other words, it
|
|
481
|
-
# returns the set of vertices so that it exists a path starting at
|
|
482
|
-
# +obj+ and ending at +v+ in the union graph of all the relations.
|
|
483
|
-
#
|
|
484
|
-
# If +strict+ is true, +obj+ is not included in the returned set
|
|
485
|
-
def children_of(obj, strict = true, relations = nil)
|
|
486
|
-
set = compute_children_of([obj].to_value_set, relations || self.relations)
|
|
487
|
-
set.delete(obj) if strict
|
|
488
|
-
set
|
|
489
|
-
end
|
|
490
|
-
|
|
491
|
-
# Internal implementation method for +children_of+
|
|
492
|
-
def compute_children_of(current, relations) # :nodoc:
|
|
493
|
-
old_size = current.size
|
|
494
|
-
for rel in relations
|
|
495
|
-
next if (rel.parent && relations.include?(rel.parent))
|
|
496
|
-
|
|
497
|
-
components = rel.generated_subgraphs(current, false)
|
|
498
|
-
for c in components
|
|
499
|
-
current.merge c
|
|
500
|
-
end
|
|
501
|
-
end
|
|
502
|
-
|
|
503
|
-
if current.size == old_size
|
|
504
|
-
return current
|
|
505
|
-
else
|
|
506
|
-
return compute_children_of(current, relations)
|
|
507
|
-
end
|
|
508
|
-
end
|
|
509
|
-
|
|
510
|
-
# Defines a relation in this relation space. This defines a relation
|
|
511
|
-
# graph, and various iteration methods on the vertices. If a block is
|
|
512
|
-
# given, it defines a set of functions which should additionally be
|
|
513
|
-
# defined on the vertex objects.
|
|
514
|
-
#
|
|
515
|
-
# The valid options are:
|
|
516
|
-
#
|
|
517
|
-
# child_name::
|
|
518
|
-
# define a <tt>each_#{child_name}</tt> method to iterate
|
|
519
|
-
# on the vertex children. Uses the relation name by default (a Child
|
|
520
|
-
# relation would define a <tt>each_child</tt> method)
|
|
521
|
-
# parent_name::
|
|
522
|
-
# define a <tt>each_#{parent_name}</tt> method to iterate
|
|
523
|
-
# on the parent vertices. If none is given, no method is defined.
|
|
524
|
-
# subsets:: a list of subgraphs. See RelationGraph#superset_of [empty set by default]
|
|
525
|
-
# noinfo::
|
|
526
|
-
# wether the relation embeds some additional information. If false,
|
|
527
|
-
# the child iterator method (<tt>each_#{child_name}</tt>) will yield (child,
|
|
528
|
-
# info) instead of only child [false by default]
|
|
529
|
-
# graph:: the relation graph class [RelationGraph by default]
|
|
530
|
-
# distribute:: if true, the relation can be seen by remote peers [true by default]
|
|
531
|
-
# single_child::
|
|
532
|
-
# if the relations accepts only one child per vertex. If this option
|
|
533
|
-
# is set, defines a <tt>#{child_name}</tt> method which returns the
|
|
534
|
-
# only child (or nil if there is no child at all) [false by default]
|
|
535
|
-
# dag::
|
|
536
|
-
# if true, CycleFoundError will be raised if a new vertex would
|
|
537
|
-
# create a cycle in this relation [true by default]
|
|
538
|
-
#
|
|
539
|
-
# For instance,
|
|
540
|
-
# relation :Children
|
|
541
|
-
#
|
|
542
|
-
# defines an instance of RelationGraph which is a DAG, defining the
|
|
543
|
-
# following methods on its vertices:
|
|
544
|
-
# each_children { |v, info| ... } => graph
|
|
545
|
-
# find_children { |v, info| ... } => object or nil
|
|
546
|
-
# add_children(v, info = nil) => graph
|
|
547
|
-
# remove_children(v) => graph
|
|
548
|
-
#
|
|
549
|
-
# and
|
|
550
|
-
#
|
|
551
|
-
# relation :Children, :child_name => :child
|
|
552
|
-
#
|
|
553
|
-
# would define
|
|
554
|
-
#
|
|
555
|
-
# each_child { |v, info| ... } => graph
|
|
556
|
-
# find_child { |v, info| ... } => object or nil
|
|
557
|
-
# add_child(v, info = nil) => graph
|
|
558
|
-
# remove_child(v) => graph
|
|
559
|
-
#
|
|
560
|
-
# * the DirectedRelationSupport module gets included in the vertex classes at the
|
|
561
|
-
# construction of the RelationSpace instance. See #apply_on.
|
|
562
|
-
# * the <tt>:noinfo</tt> option would then remove the 'info' parameter
|
|
563
|
-
# to the various blocks.
|
|
564
|
-
# * if <tt>:single_child</tt> is set to true, then an additional method is defined:
|
|
565
|
-
# child => object or nil
|
|
566
|
-
# * and finally if the following is used
|
|
567
|
-
# relation :Children, :child_name => :child, :parent_name => :parent
|
|
568
|
-
# then the following method is additionally defined
|
|
569
|
-
# each_parent { |v| ... }
|
|
570
|
-
#
|
|
571
|
-
def relation(relation_name, options = {}, &block)
|
|
572
|
-
options = validate_options options,
|
|
573
|
-
:child_name => relation_name.to_s.snakecase,
|
|
574
|
-
:const_name => relation_name,
|
|
575
|
-
:parent_name => nil,
|
|
576
|
-
:subsets => ValueSet.new,
|
|
577
|
-
:noinfo => false,
|
|
578
|
-
:graph => RelationGraph,
|
|
579
|
-
:distribute => true,
|
|
580
|
-
:dag => true,
|
|
581
|
-
:single_child => false,
|
|
582
|
-
:weak => false
|
|
583
|
-
|
|
584
|
-
# Check if this relation is already defined. If it is the case, reuse it.
|
|
585
|
-
# This is needed mostly by the reloading code
|
|
586
|
-
if const_defined?(options[:const_name])
|
|
587
|
-
graph = const_get(options[:const_name])
|
|
588
|
-
mod = graph.support
|
|
589
|
-
|
|
590
|
-
else
|
|
591
|
-
graph = options[:graph].new "#{self.name}::#{options[:const_name]}", options
|
|
592
|
-
mod = Module.new do
|
|
593
|
-
singleton_class.class_eval do
|
|
594
|
-
define_method("__r_#{relation_name}__") { graph }
|
|
595
|
-
end
|
|
596
|
-
class_eval "@@__r_#{relation_name}__ = __r_#{relation_name}__"
|
|
597
|
-
end
|
|
598
|
-
const_set(options[:const_name], graph)
|
|
599
|
-
relations << graph
|
|
600
|
-
end
|
|
601
|
-
|
|
602
|
-
mod.class_eval(&block) if block_given?
|
|
603
|
-
|
|
604
|
-
if parent_enumerator = options[:parent_name]
|
|
605
|
-
mod.class_eval <<-EOD
|
|
606
|
-
def each_#{parent_enumerator}(&iterator)
|
|
607
|
-
if !block_given?
|
|
608
|
-
return enum_parent_objects(@@__r_#{relation_name}__)
|
|
609
|
-
end
|
|
610
|
-
|
|
611
|
-
self.each_parent_object(@@__r_#{relation_name}__, &iterator)
|
|
612
|
-
end
|
|
613
|
-
EOD
|
|
614
|
-
end
|
|
615
|
-
|
|
616
|
-
if options[:noinfo]
|
|
617
|
-
mod.class_eval <<-EOD
|
|
618
|
-
def each_#{options[:child_name]}
|
|
619
|
-
if !block_given?
|
|
620
|
-
return enum_child_objects(@@__r_#{relation_name}__)
|
|
621
|
-
end
|
|
622
|
-
|
|
623
|
-
each_child_object(@@__r_#{relation_name}__) { |child| yield(child) }
|
|
624
|
-
end
|
|
625
|
-
def find_#{options[:child_name]}
|
|
626
|
-
each_child_object(@@__r_#{relation_name}__) do |child|
|
|
627
|
-
return child if yield(child)
|
|
628
|
-
end
|
|
629
|
-
nil
|
|
630
|
-
end
|
|
631
|
-
EOD
|
|
632
|
-
else
|
|
633
|
-
mod.class_eval <<-EOD
|
|
634
|
-
cached_enum("#{options[:child_name]}", "#{options[:child_name]}", true)
|
|
635
|
-
def each_#{options[:child_name]}(with_info = true)
|
|
636
|
-
if !block_given?
|
|
637
|
-
return enum_#{options[:child_name]}(with_info)
|
|
638
|
-
end
|
|
639
|
-
|
|
640
|
-
if with_info
|
|
641
|
-
each_child_object(@@__r_#{relation_name}__) do |child|
|
|
642
|
-
yield(child, self[child, @@__r_#{relation_name}__])
|
|
643
|
-
end
|
|
644
|
-
else
|
|
645
|
-
each_child_object(@@__r_#{relation_name}__) do |child|
|
|
646
|
-
yield(child)
|
|
647
|
-
end
|
|
648
|
-
end
|
|
649
|
-
end
|
|
650
|
-
def find_#{options[:child_name]}
|
|
651
|
-
each_child_object(@@__r_#{relation_name}__) do |child|
|
|
652
|
-
return child if yield(child, self[child, @@__r_#{relation_name}__])
|
|
653
|
-
end
|
|
654
|
-
nil
|
|
655
|
-
end
|
|
656
|
-
EOD
|
|
657
|
-
end
|
|
658
|
-
mod.class_eval <<-EOD
|
|
659
|
-
def add_#{options[:child_name]}(to, info = nil)
|
|
660
|
-
add_child_object(to, @@__r_#{relation_name}__, info)
|
|
661
|
-
self
|
|
662
|
-
end
|
|
663
|
-
def remove_#{options[:child_name]}(to)
|
|
664
|
-
remove_child_object(to, @@__r_#{relation_name}__)
|
|
665
|
-
self
|
|
666
|
-
end
|
|
667
|
-
EOD
|
|
668
|
-
|
|
669
|
-
if options[:single_child]
|
|
670
|
-
mod.class_eval <<-EOD
|
|
671
|
-
def #{options[:child_name]}
|
|
672
|
-
each_child_object(@@__r_#{relation_name}__) do |child_task|
|
|
673
|
-
return child_task
|
|
674
|
-
end
|
|
675
|
-
nil
|
|
676
|
-
end
|
|
677
|
-
EOD
|
|
678
|
-
end
|
|
679
|
-
|
|
680
|
-
graph.support = mod
|
|
681
|
-
applied.each { |klass| klass.include mod }
|
|
42
|
+
while sorted_relations.size != target_size
|
|
43
|
+
queue, remaining = remaining.partition { |g| !g.subsets.intersect?(remaining.to_set) }
|
|
44
|
+
sorted_relations.concat(queue)
|
|
45
|
+
end
|
|
682
46
|
|
|
683
|
-
|
|
684
|
-
|
|
47
|
+
@all_relations = sorted_relations
|
|
48
|
+
end
|
|
685
49
|
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
relations.delete(rel)
|
|
50
|
+
def self.remove_relation(rel)
|
|
51
|
+
all_relations.delete(rel)
|
|
689
52
|
end
|
|
690
53
|
end
|
|
691
54
|
|
|
692
55
|
# Creates a new relation space which applies on +klass+. If a block is
|
|
693
56
|
# given, it is eval'd in the context of the new relation space instance
|
|
694
57
|
def self.RelationSpace(klass)
|
|
695
|
-
|
|
696
|
-
|
|
58
|
+
klass.include Relations::DirectedRelationSupport
|
|
59
|
+
klass.extend Relations::Models::DirectedRelationSupport
|
|
60
|
+
relation_space = Relations::Space.new
|
|
697
61
|
relation_space.apply_on klass
|
|
698
62
|
relation_space
|
|
699
63
|
end
|