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,280 @@
|
|
|
1
|
+
require 'utilrb/hash/map_value'
|
|
2
|
+
|
|
3
|
+
module Roby
|
|
4
|
+
module App
|
|
5
|
+
# Module with helpers to be used in cucumber specifications
|
|
6
|
+
module CucumberHelpers
|
|
7
|
+
# Exception raised when a unit that cannot be interpreted is
|
|
8
|
+
# encountered
|
|
9
|
+
class InvalidUnit < ArgumentError; end
|
|
10
|
+
|
|
11
|
+
# Exception raised when two arguments should have the same set of
|
|
12
|
+
# names but one has a name that the reference does not
|
|
13
|
+
class MissingArgument < ArgumentError; end
|
|
14
|
+
|
|
15
|
+
# Exception raised when two arguments should have the same set of
|
|
16
|
+
# names but one has a name that the reference does not
|
|
17
|
+
class UnexpectedArgument < ArgumentError; end
|
|
18
|
+
|
|
19
|
+
# Exception raised by {.parse_arguments_respectively} when one uses
|
|
20
|
+
# the explicit and implicit syntaxes at the same time
|
|
21
|
+
class MixingOrderAndNames < ArgumentError; end
|
|
22
|
+
|
|
23
|
+
# Parsing of a set of quantities, in the form
|
|
24
|
+
#
|
|
25
|
+
# x=VAL, y=VAL and z=VAL
|
|
26
|
+
#
|
|
27
|
+
# The value can be specified as a numerical value with unit, in
|
|
28
|
+
# which case the value is converted into the corresponding SI unit,
|
|
29
|
+
# as e.g.
|
|
30
|
+
#
|
|
31
|
+
# yaw=10deg
|
|
32
|
+
#
|
|
33
|
+
# will be converted to
|
|
34
|
+
#
|
|
35
|
+
# Hash[yaw: 0.1745] # 10 degrees in radians
|
|
36
|
+
def self.parse_arguments(raw_arguments, expected = Hash.new, strict: true)
|
|
37
|
+
hash = parse_argument_text_to_hash(raw_arguments)
|
|
38
|
+
parse_hash_numerical_values(hash, expected, strict: strict)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def self.parse_hash_numerical_values(hash, expected = Hash.new, strict: true)
|
|
42
|
+
hash.map_value do |key, value|
|
|
43
|
+
expected_quantity = expected[key]
|
|
44
|
+
if strict && !expected_quantity
|
|
45
|
+
raise UnexpectedArgument, "unexpected argument found #{key}"
|
|
46
|
+
elsif value.kind_of?(Hash)
|
|
47
|
+
parse_hash_numerical_values(value, expected_quantity || Hash.new, strict: strict)
|
|
48
|
+
elsif value_with_unit = try_numerical_value_with_unit(value)
|
|
49
|
+
if expected_quantity
|
|
50
|
+
validate_unit(key, *value_with_unit, expected_quantity)
|
|
51
|
+
end
|
|
52
|
+
apply_unit(*value_with_unit)
|
|
53
|
+
elsif expected_quantity
|
|
54
|
+
raise InvalidUnit, "expected #{key}=#{value} to be a #{expected_quantity}, but it got no unit"
|
|
55
|
+
else
|
|
56
|
+
begin
|
|
57
|
+
Integer(value)
|
|
58
|
+
rescue ArgumentError
|
|
59
|
+
begin
|
|
60
|
+
Float(value)
|
|
61
|
+
rescue ArgumentError
|
|
62
|
+
value
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
class UnexpectedArgument < ArgumentError; end
|
|
70
|
+
class InvalidSyntax < ArgumentError; end
|
|
71
|
+
|
|
72
|
+
def self.validate_unit(name, value, unit, quantity)
|
|
73
|
+
if quantity == :length
|
|
74
|
+
if unit != 'm'
|
|
75
|
+
raise InvalidUnit, "expected a length in place of #{name}=#{value}#{unit}"
|
|
76
|
+
end
|
|
77
|
+
elsif quantity == :angle
|
|
78
|
+
if unit != 'deg'
|
|
79
|
+
raise InvalidUnit, "expected an angle in place of #{name}=#{value}#{unit}"
|
|
80
|
+
end
|
|
81
|
+
elsif quantity == :time
|
|
82
|
+
if !%w{h min s}.include?(unit)
|
|
83
|
+
raise InvalidUnit, "expected a time in place of #{name}=#{value}#{unit}"
|
|
84
|
+
end
|
|
85
|
+
else raise ArgumentError, "unknown quantity definition '#{quantity}', expected one of :length, :angle or :time"
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def self.parse_argument_text_to_hash(raw_arguments)
|
|
90
|
+
current = Hash.new
|
|
91
|
+
stack = Array.new
|
|
92
|
+
scanner = StringScanner.new(raw_arguments)
|
|
93
|
+
while !scanner.eos?
|
|
94
|
+
arg_name = scanner.scan_until(/=/)
|
|
95
|
+
if !arg_name
|
|
96
|
+
raise InvalidSyntax, "expected to find '=' in #{raw_arguments}\n#{" " * (24 + scanner.pos)}^"
|
|
97
|
+
end
|
|
98
|
+
arg_name = arg_name[0, arg_name.size - 1].to_sym
|
|
99
|
+
|
|
100
|
+
if scanner.peek(1) == '{'
|
|
101
|
+
scanner.getch
|
|
102
|
+
stack << current
|
|
103
|
+
current[arg_name] = (child = Hash.new)
|
|
104
|
+
current = child
|
|
105
|
+
else
|
|
106
|
+
match = scanner.scan_until(/(\s*,\s*|\s+and\s+|\s*}\s*)/)
|
|
107
|
+
if match && (scanner[1].strip == '}')
|
|
108
|
+
current[arg_name] = match[0, match.size - scanner[1].size]
|
|
109
|
+
|
|
110
|
+
begin
|
|
111
|
+
current = stack.pop
|
|
112
|
+
if !current
|
|
113
|
+
raise InvalidSyntax, "unbalanced closed hash"
|
|
114
|
+
end
|
|
115
|
+
end while scanner.scan(/\s*}\s*/)
|
|
116
|
+
|
|
117
|
+
if !scanner.eos? && !scanner.scan(/\s*,\s*|\s+and\s+/)
|
|
118
|
+
raise InvalidSyntax, "expected comma or 'and' after }"
|
|
119
|
+
end
|
|
120
|
+
elsif match
|
|
121
|
+
current[arg_name] = match[0, match.size - scanner[1].size]
|
|
122
|
+
else
|
|
123
|
+
current[arg_name] = scanner.rest
|
|
124
|
+
scanner.terminate
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
if !stack.empty?
|
|
129
|
+
raise InvalidSyntax, "expected closing } at the end of string"
|
|
130
|
+
end
|
|
131
|
+
current
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# Parsing of a set of quantities that follow another already given
|
|
135
|
+
# set
|
|
136
|
+
#
|
|
137
|
+
# @example pose with tolerance
|
|
138
|
+
# the pose x=10m and y=20m with tolerance 1m and 1m
|
|
139
|
+
#
|
|
140
|
+
def self.parse_arguments_respectively(reference, raw_arguments, expected = Hash.new, strict: true)
|
|
141
|
+
arguments = Hash.new
|
|
142
|
+
has_implicit, has_explicit = false, false
|
|
143
|
+
raw_arguments = raw_arguments.split(/(?:, | and )/)
|
|
144
|
+
|
|
145
|
+
# Same value for all keys
|
|
146
|
+
if raw_arguments.size == 1 && (raw_arguments.first !~ /=/)
|
|
147
|
+
arg_value = raw_arguments.first
|
|
148
|
+
|
|
149
|
+
if strict
|
|
150
|
+
reference.each do |key|
|
|
151
|
+
if !expected[key]
|
|
152
|
+
raise UnexpectedArgument, "unexpected argument found #{key}"
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
if value_with_unit = try_numerical_value_with_unit(arg_value)
|
|
158
|
+
reference.each do |key|
|
|
159
|
+
if expectation = expected[key]
|
|
160
|
+
validate_unit(key, *value_with_unit, expectation)
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
arg_value = apply_unit(*value_with_unit)
|
|
164
|
+
else
|
|
165
|
+
reference.each do |key|
|
|
166
|
+
is_numeric = Float(arg_value) rescue nil
|
|
167
|
+
if expectation = expected[key]
|
|
168
|
+
if is_numeric
|
|
169
|
+
raise InvalidUnit, "expected #{key}=#{arg_value} to be a #{expectation}, but it got no unit"
|
|
170
|
+
else
|
|
171
|
+
raise InvalidUnit, "expected #{key}=#{arg_value} to be a #{expectation}, but it is not even a number"
|
|
172
|
+
end
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
reference.each do |key|
|
|
177
|
+
arguments[key] = arg_value
|
|
178
|
+
end
|
|
179
|
+
return arguments
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
raw_arguments.each_with_index do |arg, arg_i|
|
|
183
|
+
arg_name, arg_value = arg.split('=')
|
|
184
|
+
|
|
185
|
+
if arg_value
|
|
186
|
+
if has_implicit
|
|
187
|
+
raise MixingOrderAndNames, "cannot mix order-based syntax and explicit names"
|
|
188
|
+
end
|
|
189
|
+
has_explicit = true
|
|
190
|
+
else
|
|
191
|
+
if has_explicit
|
|
192
|
+
raise MixingOrderAndNames, "cannot mix order-based syntax and explicit names"
|
|
193
|
+
end
|
|
194
|
+
arg_name, arg_value = reference[arg_i], arg_name
|
|
195
|
+
if !arg_name
|
|
196
|
+
raise UnexpectedArgument, "too many implicit values given, expected #{reference.size} (#{reference.join(", ")})"
|
|
197
|
+
end
|
|
198
|
+
has_implicit = true
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
expected_quantity = expected[arg_name.to_sym]
|
|
202
|
+
if strict && !expected_quantity
|
|
203
|
+
raise UnexpectedArgument, "unexpected argument found #{arg_name}"
|
|
204
|
+
elsif value_with_unit = try_numerical_value_with_unit(arg_value)
|
|
205
|
+
if expected_quantity
|
|
206
|
+
validate_unit(arg_name, *value_with_unit, expected_quantity)
|
|
207
|
+
end
|
|
208
|
+
arg_value = apply_unit(*value_with_unit)
|
|
209
|
+
elsif expected_quantity
|
|
210
|
+
raise InvalidUnit, "expected #{arg_name}=#{arg_value} to be a #{expected_quantity}"
|
|
211
|
+
end
|
|
212
|
+
if !reference.include?(arg_name.to_sym)
|
|
213
|
+
raise UnexpectedArgument, "got '#{arg_name}' but was expecting one of #{reference.map(&:to_s).sort.join(", ")}"
|
|
214
|
+
end
|
|
215
|
+
arguments[arg_name.to_sym] = arg_value
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
if arguments.keys.to_set != reference.to_set
|
|
219
|
+
missing = reference.to_set - arguments.keys
|
|
220
|
+
raise MissingArgument, "missing #{missing.size} argument(s) (for #{missing.map(&:to_s).sort.join(", ")})"
|
|
221
|
+
end
|
|
222
|
+
arguments
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
# Parses a numerical value, possibly with a unit, in which case it
|
|
226
|
+
# is converted to the corresponding "natural" unit (e.g. meters,
|
|
227
|
+
# seconds, ...)
|
|
228
|
+
#
|
|
229
|
+
# @return [(Float,String)] the normalized value and the unit
|
|
230
|
+
def self.parse_numerical_value(text, expected_quantity = nil)
|
|
231
|
+
value, unit = try_numerical_value_with_unit(text)
|
|
232
|
+
if unit
|
|
233
|
+
if expected_quantity
|
|
234
|
+
validate_unit(nil, value, unit, expected_quantity)
|
|
235
|
+
end
|
|
236
|
+
return apply_unit(value, unit), unit
|
|
237
|
+
elsif expected_quantity
|
|
238
|
+
raise InvalidUnit, "expected a #{expected_quantity}, but got #{text}"
|
|
239
|
+
else
|
|
240
|
+
Float(text)
|
|
241
|
+
end
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
# @api private
|
|
245
|
+
#
|
|
246
|
+
# Helper that identifies a value which looks like a numerical value
|
|
247
|
+
# with unit and returns it as (numeric, unit)
|
|
248
|
+
#
|
|
249
|
+
# @return [(Numeric,String),nil]
|
|
250
|
+
def self.try_numerical_value_with_unit(string)
|
|
251
|
+
if string =~ /^(-?\.\d+|-?\d+(?:\.\d+)?)([^\d\.]\w*)$/
|
|
252
|
+
return Float($1), $2
|
|
253
|
+
end
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
# @api private
|
|
257
|
+
#
|
|
258
|
+
# Helper that converts a value with unit into the corresponding
|
|
259
|
+
# normalized value (e.g. degrees to radians)
|
|
260
|
+
#
|
|
261
|
+
# @raise InvalidUnit if the unit parameter is unknown
|
|
262
|
+
def self.apply_unit(value, unit)
|
|
263
|
+
if unit == 'deg'
|
|
264
|
+
value * Math::PI / 180
|
|
265
|
+
elsif unit == 'm'
|
|
266
|
+
value
|
|
267
|
+
elsif unit == 'h'
|
|
268
|
+
value * 3600
|
|
269
|
+
elsif unit == 'min'
|
|
270
|
+
value * 60
|
|
271
|
+
elsif unit == 's'
|
|
272
|
+
value
|
|
273
|
+
else
|
|
274
|
+
raise InvalidUnit, "unknown unit #{unit}, known units are deg, m (meters), h (hour), min (minute) and s (seconds)"
|
|
275
|
+
end
|
|
276
|
+
end
|
|
277
|
+
end
|
|
278
|
+
end
|
|
279
|
+
end
|
|
280
|
+
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
require 'roby/app/cucumber'
|
|
2
|
+
|
|
3
|
+
module Roby
|
|
4
|
+
module App
|
|
5
|
+
module Cucumber
|
|
6
|
+
module World
|
|
7
|
+
attr_reader :roby_controller
|
|
8
|
+
|
|
9
|
+
def roby_world_initialize
|
|
10
|
+
@roby_controller = Controller.new
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def self.extend_object(world)
|
|
14
|
+
super
|
|
15
|
+
world.roby_world_initialize
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
After do |scenario|
|
|
23
|
+
if kind_of?(Roby::App::Cucumber::World)
|
|
24
|
+
if roby_controller.roby_running?
|
|
25
|
+
if !roby_controller.roby_connected? # failed to connect, kill forcefully
|
|
26
|
+
roby_controller.roby_kill
|
|
27
|
+
else
|
|
28
|
+
roby_controller.roby_stop
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
require 'stackprof'
|
|
2
|
+
require 'rbtrace'
|
|
3
|
+
require 'objspace'
|
|
4
|
+
|
|
5
|
+
module Roby
|
|
6
|
+
module App
|
|
7
|
+
# A command library that allows to control StackProf to profile a Roby
|
|
8
|
+
# application
|
|
9
|
+
class Debug < Roby::Interface::CommandLibrary
|
|
10
|
+
# Start profiling
|
|
11
|
+
#
|
|
12
|
+
# @param [Boolean] one_shot automatically stop and save after cycles
|
|
13
|
+
# cycles, or one cycle if cycles is nil
|
|
14
|
+
# @param [Integer] cycles a number of cycles after which the
|
|
15
|
+
# profiling is stopped and saved
|
|
16
|
+
# @param [String] path the path into which results should be saved
|
|
17
|
+
# @param [Symbol] mode one of :cpu, :wall or :object
|
|
18
|
+
# @param [Integer] interval the sampling interval in microseconds
|
|
19
|
+
# for :cpu and :wall (defaults to 1000, that is 1ms), and the
|
|
20
|
+
# sampling rate in objects allocated for :object (defaults to 1)
|
|
21
|
+
# @param [Boolean] raw whether the dump should include raw samples,
|
|
22
|
+
# needed e.g. for flamegraph generation
|
|
23
|
+
def stackprof_start(one_shot: false, cycles: nil, mode: :cpu, interval: nil, raw: false)
|
|
24
|
+
interval ||= if mode == :object then 1
|
|
25
|
+
else 1000
|
|
26
|
+
end
|
|
27
|
+
StackProf.start(mode: mode, interval: interval, raw: raw)
|
|
28
|
+
|
|
29
|
+
if one_shot && !cycles
|
|
30
|
+
cycles = 1
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
if cycles
|
|
34
|
+
remaining_cycles = cycles
|
|
35
|
+
@cycle_counter_handler = execution_engine.at_cycle_begin do
|
|
36
|
+
remaining_cycles -= 1
|
|
37
|
+
if remaining_cycles == 0
|
|
38
|
+
execution_engine.at_cycle_end(once: true) do
|
|
39
|
+
remaining_cycles = cycles
|
|
40
|
+
StackProf.stop
|
|
41
|
+
path = stackprof_save
|
|
42
|
+
app.notify "profiling", 'INFO', "results saved in #{path} after #{cycles} cycles"
|
|
43
|
+
if one_shot
|
|
44
|
+
app.notify "profiling", 'INFO', "stopped"
|
|
45
|
+
execution_engine.remove_propagation_handler(@cycle_counter_handler)
|
|
46
|
+
@cycle_counter_handler = nil
|
|
47
|
+
else
|
|
48
|
+
StackProf.start(mode: mode, interval: interval)
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
nil
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
command 'stackprof_start', "start profiling",
|
|
57
|
+
one_shot: "if true, saves and stops profiling after a certain number of cycles",
|
|
58
|
+
cycles: "a number of cycles after which profiling results are saved, and if one_shot is true, profiling is stopped",
|
|
59
|
+
path: "the directory under which the results should be saved",
|
|
60
|
+
mode: "sampling mode, one of :cpu, :wall or :object",
|
|
61
|
+
interval: "sampling interval. Either microseconds for :cpu and :wall (defaults to 1000, that is 1ms), or a number of objects for :object (defaults to one)",
|
|
62
|
+
raw: "whether the profile should include raw samples, needed for e.g. flamegraph generation"
|
|
63
|
+
|
|
64
|
+
def stackprof_active?
|
|
65
|
+
!!@cycle_counter_handler
|
|
66
|
+
end
|
|
67
|
+
command 'stackprof_active?', "whether stackprof profiling has been started",
|
|
68
|
+
|
|
69
|
+
# Stop profiling
|
|
70
|
+
#
|
|
71
|
+
# This does not save the results, call {#save} for this
|
|
72
|
+
def stackprof_stop
|
|
73
|
+
StackProf.stop
|
|
74
|
+
if @cycle_counter_handler
|
|
75
|
+
execution_engine.remove_propagation_handler(@cycle_counter_handler)
|
|
76
|
+
@cycle_counter_handler = nil
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
command 'stackprof_stop', "stops profiling. This does not save the results to disk, call #save explicitely for that"
|
|
80
|
+
|
|
81
|
+
# @api private
|
|
82
|
+
#
|
|
83
|
+
# The filename that is used by default in {#save}. It is relative to
|
|
84
|
+
# {#path}
|
|
85
|
+
#
|
|
86
|
+
# It is a time tag (down to the milliseconds) followed by the
|
|
87
|
+
# sampling mode and a .dump extension
|
|
88
|
+
def default_path(prefix)
|
|
89
|
+
path = File.join(app.log_dir, 'debug')
|
|
90
|
+
time = Time.now.strftime("%Y-%m-%d.%H%M%S.%3N")
|
|
91
|
+
File.join(path, "#{prefix}-#{time}.dump")
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# Save the current profiling results into the path given to {#start}
|
|
95
|
+
#
|
|
96
|
+
# @param [String]
|
|
97
|
+
def stackprof_save(path: default_path('stackprof-%s'))
|
|
98
|
+
if results = StackProf.results
|
|
99
|
+
path = path % [results[:mode]]
|
|
100
|
+
FileUtils.mkdir_p(File.dirname(path))
|
|
101
|
+
File.open(path, 'wb') do |f|
|
|
102
|
+
f.write Marshal.dump(results)
|
|
103
|
+
end
|
|
104
|
+
path
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
command 'stackprof_save', "saves the profiling results under the path specified in #start, by default is log_dir/stackprof"
|
|
108
|
+
|
|
109
|
+
# Perform a memory dump
|
|
110
|
+
def memdump(path: default_path('memdump'), run_gc: true)
|
|
111
|
+
FileUtils.mkdir_p File.dirname(path)
|
|
112
|
+
File.open(path, 'wb') do |io|
|
|
113
|
+
GC.start(full_mark: true, immediate_sweep: true) if run_gc
|
|
114
|
+
ObjectSpace.dump_all(output: io)
|
|
115
|
+
end
|
|
116
|
+
path
|
|
117
|
+
end
|
|
118
|
+
command 'memdump', 'save a dump of the whole memory space',
|
|
119
|
+
path: "the file path where it should be saved, defaults to an automatically-generated file name in the debug/ subdirectory of the app's log directory"
|
|
120
|
+
|
|
121
|
+
# Enable or disable allocation traces for {#memdump}
|
|
122
|
+
def trace_allocations(enable)
|
|
123
|
+
if enable
|
|
124
|
+
ObjectSpace.trace_object_allocations_start
|
|
125
|
+
else
|
|
126
|
+
ObjectSpace.trace_object_allocations_stop
|
|
127
|
+
ObjectSpace.trace_object_allocations_clear
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
command 'trace_allocations', 'whether location where allocations happen should be traced',
|
|
131
|
+
enable: 'enable (true) or disable (false)'
|
|
132
|
+
end
|
|
133
|
+
Roby::Interface::Interface.subcommand 'debug', Debug, "debug-related commands"
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
|
data/lib/roby/app/gen.rb
ADDED