busser-behave 0.1.3
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/.cane +0 -0
- data/.gitignore +17 -0
- data/.tailor +4 -0
- data/.travis.yml +11 -0
- data/CHANGELOG.md +3 -0
- data/Gemfile +3 -0
- data/LICENSE +15 -0
- data/README.md +41 -0
- data/Rakefile +68 -0
- data/busser-behave.gemspec +30 -0
- data/features/plugin_install_command.feature +11 -0
- data/features/plugin_list_command.feature +8 -0
- data/features/support/env.rb +13 -0
- data/features/test_command.feature +31 -0
- data/lib/busser/behave/version.rb +26 -0
- data/lib/busser/runner_plugin/behave.rb +37 -0
- data/vendor/behave/CHANGES.rst +483 -0
- data/vendor/behave/LICENSE +23 -0
- data/vendor/behave/MANIFEST.in +37 -0
- data/vendor/behave/PROJECT_INFO.rst +21 -0
- data/vendor/behave/README.rst +112 -0
- data/vendor/behave/VERSION.txt +1 -0
- data/vendor/behave/behave.ini +22 -0
- data/vendor/behave/behave/__init__.py +30 -0
- data/vendor/behave/behave/__main__.py +187 -0
- data/vendor/behave/behave/_stepimport.py +185 -0
- data/vendor/behave/behave/_types.py +134 -0
- data/vendor/behave/behave/api/__init__.py +7 -0
- data/vendor/behave/behave/api/async_step.py +283 -0
- data/vendor/behave/behave/capture.py +227 -0
- data/vendor/behave/behave/compat/__init__.py +5 -0
- data/vendor/behave/behave/compat/collections.py +20 -0
- data/vendor/behave/behave/configuration.py +788 -0
- data/vendor/behave/behave/contrib/__init__.py +0 -0
- data/vendor/behave/behave/contrib/scenario_autoretry.py +73 -0
- data/vendor/behave/behave/formatter/__init__.py +12 -0
- data/vendor/behave/behave/formatter/_builtins.py +39 -0
- data/vendor/behave/behave/formatter/_registry.py +135 -0
- data/vendor/behave/behave/formatter/ansi_escapes.py +91 -0
- data/vendor/behave/behave/formatter/base.py +200 -0
- data/vendor/behave/behave/formatter/formatters.py +57 -0
- data/vendor/behave/behave/formatter/json.py +253 -0
- data/vendor/behave/behave/formatter/null.py +12 -0
- data/vendor/behave/behave/formatter/plain.py +158 -0
- data/vendor/behave/behave/formatter/pretty.py +351 -0
- data/vendor/behave/behave/formatter/progress.py +287 -0
- data/vendor/behave/behave/formatter/rerun.py +114 -0
- data/vendor/behave/behave/formatter/sphinx_steps.py +372 -0
- data/vendor/behave/behave/formatter/sphinx_util.py +118 -0
- data/vendor/behave/behave/formatter/steps.py +497 -0
- data/vendor/behave/behave/formatter/tags.py +178 -0
- data/vendor/behave/behave/i18n.py +614 -0
- data/vendor/behave/behave/importer.py +102 -0
- data/vendor/behave/behave/json_parser.py +264 -0
- data/vendor/behave/behave/log_capture.py +233 -0
- data/vendor/behave/behave/matchers.py +402 -0
- data/vendor/behave/behave/model.py +1737 -0
- data/vendor/behave/behave/model_core.py +416 -0
- data/vendor/behave/behave/model_describe.py +105 -0
- data/vendor/behave/behave/parser.py +615 -0
- data/vendor/behave/behave/reporter/__init__.py +0 -0
- data/vendor/behave/behave/reporter/base.py +45 -0
- data/vendor/behave/behave/reporter/junit.py +473 -0
- data/vendor/behave/behave/reporter/summary.py +94 -0
- data/vendor/behave/behave/runner.py +753 -0
- data/vendor/behave/behave/runner_util.py +417 -0
- data/vendor/behave/behave/step_registry.py +112 -0
- data/vendor/behave/behave/tag_expression.py +111 -0
- data/vendor/behave/behave/tag_matcher.py +465 -0
- data/vendor/behave/behave/textutil.py +137 -0
- data/vendor/behave/behave/userdata.py +130 -0
- data/vendor/behave/behave4cmd0/__all_steps__.py +12 -0
- data/vendor/behave/behave4cmd0/__init__.py +5 -0
- data/vendor/behave/behave4cmd0/__setup.py +11 -0
- data/vendor/behave/behave4cmd0/command_shell.py +216 -0
- data/vendor/behave/behave4cmd0/command_shell_proc.py +256 -0
- data/vendor/behave/behave4cmd0/command_steps.py +532 -0
- data/vendor/behave/behave4cmd0/command_util.py +147 -0
- data/vendor/behave/behave4cmd0/failing_steps.py +49 -0
- data/vendor/behave/behave4cmd0/log/__init__.py +1 -0
- data/vendor/behave/behave4cmd0/log/steps.py +395 -0
- data/vendor/behave/behave4cmd0/note_steps.py +29 -0
- data/vendor/behave/behave4cmd0/passing_steps.py +36 -0
- data/vendor/behave/behave4cmd0/pathutil.py +146 -0
- data/vendor/behave/behave4cmd0/setup_command_shell.py +24 -0
- data/vendor/behave/behave4cmd0/textutil.py +304 -0
- data/vendor/behave/bin/behave +44 -0
- data/vendor/behave/bin/behave.cmd +10 -0
- data/vendor/behave/bin/behave.junit_filter.py +85 -0
- data/vendor/behave/bin/behave.step_durations.py +163 -0
- data/vendor/behave/bin/behave2cucumber_json.py +63 -0
- data/vendor/behave/bin/behave_cmd.py +44 -0
- data/vendor/behave/bin/convert_i18n_yaml.py +77 -0
- data/vendor/behave/bin/explore_platform_encoding.py +24 -0
- data/vendor/behave/bin/i18n.yml +621 -0
- data/vendor/behave/bin/invoke +8 -0
- data/vendor/behave/bin/invoke.cmd +9 -0
- data/vendor/behave/bin/json.format.py +167 -0
- data/vendor/behave/bin/jsonschema_validate.py +122 -0
- data/vendor/behave/bin/make_localpi.py +279 -0
- data/vendor/behave/bin/project_bootstrap.sh +30 -0
- data/vendor/behave/bin/toxcmd.py +270 -0
- data/vendor/behave/bin/toxcmd3.py +270 -0
- data/vendor/behave/conftest.py +27 -0
- data/vendor/behave/docs/Makefile +154 -0
- data/vendor/behave/docs/_static/agogo.css +501 -0
- data/vendor/behave/docs/_static/behave_logo.png +0 -0
- data/vendor/behave/docs/_static/behave_logo1.png +0 -0
- data/vendor/behave/docs/_static/behave_logo2.png +0 -0
- data/vendor/behave/docs/_static/behave_logo3.png +0 -0
- data/vendor/behave/docs/_themes/LICENSE +45 -0
- data/vendor/behave/docs/_themes/kr/layout.html +17 -0
- data/vendor/behave/docs/_themes/kr/relations.html +19 -0
- data/vendor/behave/docs/_themes/kr/static/flasky.css_t +480 -0
- data/vendor/behave/docs/_themes/kr/static/small_flask.css +90 -0
- data/vendor/behave/docs/_themes/kr/theme.conf +7 -0
- data/vendor/behave/docs/_themes/kr_small/layout.html +22 -0
- data/vendor/behave/docs/_themes/kr_small/static/flasky.css_t +287 -0
- data/vendor/behave/docs/_themes/kr_small/theme.conf +10 -0
- data/vendor/behave/docs/api.rst +408 -0
- data/vendor/behave/docs/appendix.rst +19 -0
- data/vendor/behave/docs/behave.rst +640 -0
- data/vendor/behave/docs/behave.rst-template +86 -0
- data/vendor/behave/docs/behave_ecosystem.rst +81 -0
- data/vendor/behave/docs/comparison.rst +85 -0
- data/vendor/behave/docs/conf.py +293 -0
- data/vendor/behave/docs/context_attributes.rst +66 -0
- data/vendor/behave/docs/django.rst +192 -0
- data/vendor/behave/docs/formatters.rst +61 -0
- data/vendor/behave/docs/gherkin.rst +673 -0
- data/vendor/behave/docs/index.rst +57 -0
- data/vendor/behave/docs/install.rst +60 -0
- data/vendor/behave/docs/more_info.rst +184 -0
- data/vendor/behave/docs/new_and_noteworthy.rst +18 -0
- data/vendor/behave/docs/new_and_noteworthy_v1.2.4.rst +11 -0
- data/vendor/behave/docs/new_and_noteworthy_v1.2.5.rst +814 -0
- data/vendor/behave/docs/new_and_noteworthy_v1.2.6.rst +255 -0
- data/vendor/behave/docs/parse_builtin_types.rst +59 -0
- data/vendor/behave/docs/philosophy.rst +235 -0
- data/vendor/behave/docs/regular_expressions.rst +71 -0
- data/vendor/behave/docs/related.rst +14 -0
- data/vendor/behave/docs/test_domains.rst +62 -0
- data/vendor/behave/docs/tutorial.rst +636 -0
- data/vendor/behave/docs/update_behave_rst.py +100 -0
- data/vendor/behave/etc/json/behave.json-schema +172 -0
- data/vendor/behave/etc/junit.xml/behave_junit.xsd +103 -0
- data/vendor/behave/etc/junit.xml/junit-4.xsd +92 -0
- data/vendor/behave/examples/async_step/README.txt +8 -0
- data/vendor/behave/examples/async_step/behave.ini +14 -0
- data/vendor/behave/examples/async_step/features/async_dispatch.feature +8 -0
- data/vendor/behave/examples/async_step/features/async_run.feature +6 -0
- data/vendor/behave/examples/async_step/features/environment.py +28 -0
- data/vendor/behave/examples/async_step/features/steps/async_dispatch_steps.py +26 -0
- data/vendor/behave/examples/async_step/features/steps/async_steps34.py +10 -0
- data/vendor/behave/examples/async_step/features/steps/async_steps35.py +10 -0
- data/vendor/behave/examples/async_step/testrun_example.async_dispatch.txt +11 -0
- data/vendor/behave/examples/async_step/testrun_example.async_run.txt +9 -0
- data/vendor/behave/examples/env_vars/README.rst +26 -0
- data/vendor/behave/examples/env_vars/behave.ini +15 -0
- data/vendor/behave/examples/env_vars/behave_run.output_example.txt +12 -0
- data/vendor/behave/examples/env_vars/features/env_var.feature +6 -0
- data/vendor/behave/examples/env_vars/features/steps/env_var_steps.py +38 -0
- data/vendor/behave/features/README.txt +12 -0
- data/vendor/behave/features/background.feature +392 -0
- data/vendor/behave/features/capture_stderr.feature +172 -0
- data/vendor/behave/features/capture_stdout.feature +125 -0
- data/vendor/behave/features/cmdline.lang_list.feature +33 -0
- data/vendor/behave/features/configuration.default_paths.feature +116 -0
- data/vendor/behave/features/context.global_params.feature +35 -0
- data/vendor/behave/features/context.local_params.feature +17 -0
- data/vendor/behave/features/directory_layout.advanced.feature +147 -0
- data/vendor/behave/features/directory_layout.basic.feature +75 -0
- data/vendor/behave/features/directory_layout.basic2.feature +87 -0
- data/vendor/behave/features/environment.py +53 -0
- data/vendor/behave/features/exploratory_testing.with_table.feature +141 -0
- data/vendor/behave/features/feature.description.feature +0 -0
- data/vendor/behave/features/feature.exclude_from_run.feature +96 -0
- data/vendor/behave/features/formatter.help.feature +30 -0
- data/vendor/behave/features/formatter.json.feature +420 -0
- data/vendor/behave/features/formatter.progress3.feature +235 -0
- data/vendor/behave/features/formatter.rerun.feature +296 -0
- data/vendor/behave/features/formatter.steps.feature +181 -0
- data/vendor/behave/features/formatter.steps_catalog.feature +100 -0
- data/vendor/behave/features/formatter.steps_doc.feature +140 -0
- data/vendor/behave/features/formatter.steps_usage.feature +404 -0
- data/vendor/behave/features/formatter.tags.feature +134 -0
- data/vendor/behave/features/formatter.tags_location.feature +183 -0
- data/vendor/behave/features/formatter.user_defined.feature +196 -0
- data/vendor/behave/features/i18n.unicode_problems.feature +445 -0
- data/vendor/behave/features/logcapture.clear_handlers.feature +114 -0
- data/vendor/behave/features/logcapture.feature +188 -0
- data/vendor/behave/features/logcapture.filter.feature +130 -0
- data/vendor/behave/features/logging.no_capture.feature +99 -0
- data/vendor/behave/features/logging.setup_format.feature +157 -0
- data/vendor/behave/features/logging.setup_level.feature +168 -0
- data/vendor/behave/features/logging.setup_with_configfile.feature +137 -0
- data/vendor/behave/features/parser.background.sad_cases.feature +129 -0
- data/vendor/behave/features/parser.feature.sad_cases.feature +144 -0
- data/vendor/behave/features/runner.abort_by_user.feature +305 -0
- data/vendor/behave/features/runner.continue_after_failed_step.feature +136 -0
- data/vendor/behave/features/runner.default_format.feature +175 -0
- data/vendor/behave/features/runner.dry_run.feature +184 -0
- data/vendor/behave/features/runner.feature_listfile.feature +223 -0
- data/vendor/behave/features/runner.hook_errors.feature +382 -0
- data/vendor/behave/features/runner.multiple_formatters.feature +285 -0
- data/vendor/behave/features/runner.scenario_autoretry.feature +131 -0
- data/vendor/behave/features/runner.select_files_by_regexp.example.feature +71 -0
- data/vendor/behave/features/runner.select_files_by_regexp.feature +84 -0
- data/vendor/behave/features/runner.select_scenarios_by_file_location.feature +403 -0
- data/vendor/behave/features/runner.select_scenarios_by_name.feature +289 -0
- data/vendor/behave/features/runner.select_scenarios_by_tag.feature +225 -0
- data/vendor/behave/features/runner.stop_after_failure.feature +122 -0
- data/vendor/behave/features/runner.tag_logic.feature +67 -0
- data/vendor/behave/features/runner.unknown_formatter.feature +23 -0
- data/vendor/behave/features/runner.use_stage_implementations.feature +126 -0
- data/vendor/behave/features/scenario.description.feature +171 -0
- data/vendor/behave/features/scenario.exclude_from_run.feature +217 -0
- data/vendor/behave/features/scenario_outline.basics.feature +100 -0
- data/vendor/behave/features/scenario_outline.improved.feature +177 -0
- data/vendor/behave/features/scenario_outline.name_annotation.feature +157 -0
- data/vendor/behave/features/scenario_outline.parametrized.feature +401 -0
- data/vendor/behave/features/scenario_outline.tagged_examples.feature +118 -0
- data/vendor/behave/features/step.async_steps.feature +225 -0
- data/vendor/behave/features/step.duplicated_step.feature +106 -0
- data/vendor/behave/features/step.execute_steps.feature +59 -0
- data/vendor/behave/features/step.execute_steps.with_table.feature +65 -0
- data/vendor/behave/features/step.import_other_step_module.feature +103 -0
- data/vendor/behave/features/step.pending_steps.feature +128 -0
- data/vendor/behave/features/step.undefined_steps.feature +307 -0
- data/vendor/behave/features/step.use_step_library.feature +44 -0
- data/vendor/behave/features/step_dialect.generic_steps.feature +189 -0
- data/vendor/behave/features/step_dialect.given_when_then.feature +89 -0
- data/vendor/behave/features/step_param.builtin_types.with_float.feature +239 -0
- data/vendor/behave/features/step_param.builtin_types.with_integer.feature +305 -0
- data/vendor/behave/features/step_param.custom_types.feature +134 -0
- data/vendor/behave/features/steps/behave_active_tags_steps.py +86 -0
- data/vendor/behave/features/steps/behave_context_steps.py +67 -0
- data/vendor/behave/features/steps/behave_model_tag_logic_steps.py +105 -0
- data/vendor/behave/features/steps/behave_model_util.py +105 -0
- data/vendor/behave/features/steps/behave_select_files_steps.py +83 -0
- data/vendor/behave/features/steps/behave_tag_expression_steps.py +166 -0
- data/vendor/behave/features/steps/behave_undefined_steps.py +101 -0
- data/vendor/behave/features/steps/use_steplib_behave4cmd.py +12 -0
- data/vendor/behave/features/summary.undefined_steps.feature +114 -0
- data/vendor/behave/features/tags.active_tags.feature +385 -0
- data/vendor/behave/features/tags.default_tags.feature +104 -0
- data/vendor/behave/features/tags.tag_expression.feature +105 -0
- data/vendor/behave/features/userdata.feature +331 -0
- data/vendor/behave/invoke.yaml +21 -0
- data/vendor/behave/issue.features/README.txt +17 -0
- data/vendor/behave/issue.features/environment.py +97 -0
- data/vendor/behave/issue.features/issue0030.feature +21 -0
- data/vendor/behave/issue.features/issue0031.feature +16 -0
- data/vendor/behave/issue.features/issue0032.feature +28 -0
- data/vendor/behave/issue.features/issue0035.feature +74 -0
- data/vendor/behave/issue.features/issue0040.feature +154 -0
- data/vendor/behave/issue.features/issue0041.feature +135 -0
- data/vendor/behave/issue.features/issue0042.feature +230 -0
- data/vendor/behave/issue.features/issue0044.feature +51 -0
- data/vendor/behave/issue.features/issue0046.feature +77 -0
- data/vendor/behave/issue.features/issue0052.feature +66 -0
- data/vendor/behave/issue.features/issue0059.feature +29 -0
- data/vendor/behave/issue.features/issue0063.feature +102 -0
- data/vendor/behave/issue.features/issue0064.feature +97 -0
- data/vendor/behave/issue.features/issue0065.feature +18 -0
- data/vendor/behave/issue.features/issue0066.feature +80 -0
- data/vendor/behave/issue.features/issue0067.feature +90 -0
- data/vendor/behave/issue.features/issue0069.feature +64 -0
- data/vendor/behave/issue.features/issue0072.feature +32 -0
- data/vendor/behave/issue.features/issue0073.feature +228 -0
- data/vendor/behave/issue.features/issue0075.feature +18 -0
- data/vendor/behave/issue.features/issue0077.feature +89 -0
- data/vendor/behave/issue.features/issue0080.feature +49 -0
- data/vendor/behave/issue.features/issue0081.feature +138 -0
- data/vendor/behave/issue.features/issue0083.feature +69 -0
- data/vendor/behave/issue.features/issue0084.feature +69 -0
- data/vendor/behave/issue.features/issue0085.feature +119 -0
- data/vendor/behave/issue.features/issue0092.feature +66 -0
- data/vendor/behave/issue.features/issue0096.feature +173 -0
- data/vendor/behave/issue.features/issue0099.feature +130 -0
- data/vendor/behave/issue.features/issue0109.feature +60 -0
- data/vendor/behave/issue.features/issue0111.feature +53 -0
- data/vendor/behave/issue.features/issue0112.feature +64 -0
- data/vendor/behave/issue.features/issue0114.feature +118 -0
- data/vendor/behave/issue.features/issue0116.feature +71 -0
- data/vendor/behave/issue.features/issue0125.feature +49 -0
- data/vendor/behave/issue.features/issue0127.feature +64 -0
- data/vendor/behave/issue.features/issue0139.feature +67 -0
- data/vendor/behave/issue.features/issue0142.feature +37 -0
- data/vendor/behave/issue.features/issue0143.feature +54 -0
- data/vendor/behave/issue.features/issue0145.feature +63 -0
- data/vendor/behave/issue.features/issue0148.feature +105 -0
- data/vendor/behave/issue.features/issue0152.feature +52 -0
- data/vendor/behave/issue.features/issue0159.feature +74 -0
- data/vendor/behave/issue.features/issue0162.feature +86 -0
- data/vendor/behave/issue.features/issue0171.feature +16 -0
- data/vendor/behave/issue.features/issue0172.feature +51 -0
- data/vendor/behave/issue.features/issue0175.feature +91 -0
- data/vendor/behave/issue.features/issue0177.feature +40 -0
- data/vendor/behave/issue.features/issue0181.feature +36 -0
- data/vendor/behave/issue.features/issue0184.feature +144 -0
- data/vendor/behave/issue.features/issue0186.feature +12 -0
- data/vendor/behave/issue.features/issue0188.feature +60 -0
- data/vendor/behave/issue.features/issue0191.feature +178 -0
- data/vendor/behave/issue.features/issue0194.feature +215 -0
- data/vendor/behave/issue.features/issue0197.feature +11 -0
- data/vendor/behave/issue.features/issue0216.feature +129 -0
- data/vendor/behave/issue.features/issue0226.feature +51 -0
- data/vendor/behave/issue.features/issue0228.feature +41 -0
- data/vendor/behave/issue.features/issue0230.feature +46 -0
- data/vendor/behave/issue.features/issue0231.feature +77 -0
- data/vendor/behave/issue.features/issue0238.feature +52 -0
- data/vendor/behave/issue.features/issue0251.feature +15 -0
- data/vendor/behave/issue.features/issue0280.feature +118 -0
- data/vendor/behave/issue.features/issue0288.feature +95 -0
- data/vendor/behave/issue.features/issue0300.feature +49 -0
- data/vendor/behave/issue.features/issue0302.feature +91 -0
- data/vendor/behave/issue.features/issue0309.feature +52 -0
- data/vendor/behave/issue.features/issue0330.feature +124 -0
- data/vendor/behave/issue.features/issue0349.feature +9 -0
- data/vendor/behave/issue.features/issue0361.feature +79 -0
- data/vendor/behave/issue.features/issue0383.feature +76 -0
- data/vendor/behave/issue.features/issue0384.feature +103 -0
- data/vendor/behave/issue.features/issue0385.feature +109 -0
- data/vendor/behave/issue.features/issue0424.feature +66 -0
- data/vendor/behave/issue.features/issue0446.feature +116 -0
- data/vendor/behave/issue.features/issue0449.feature +42 -0
- data/vendor/behave/issue.features/issue0453.feature +42 -0
- data/vendor/behave/issue.features/issue0457.feature +65 -0
- data/vendor/behave/issue.features/issue0462.feature +38 -0
- data/vendor/behave/issue.features/issue0476.feature +39 -0
- data/vendor/behave/issue.features/issue0487.feature +92 -0
- data/vendor/behave/issue.features/issue0506.feature +77 -0
- data/vendor/behave/issue.features/issue0510.feature +51 -0
- data/vendor/behave/issue.features/requirements.txt +12 -0
- data/vendor/behave/issue.features/steps/ansi_steps.py +20 -0
- data/vendor/behave/issue.features/steps/behave_hooks_steps.py +10 -0
- data/vendor/behave/issue.features/steps/use_steplib_behave4cmd.py +13 -0
- data/vendor/behave/more.features/formatter.json.validate_output.feature +37 -0
- data/vendor/behave/more.features/steps/tutorial_steps.py +16 -0
- data/vendor/behave/more.features/steps/use_steplib_behave4cmd.py +7 -0
- data/vendor/behave/more.features/tutorial.feature +6 -0
- data/vendor/behave/py.requirements/README.txt +5 -0
- data/vendor/behave/py.requirements/all.txt +16 -0
- data/vendor/behave/py.requirements/basic.txt +21 -0
- data/vendor/behave/py.requirements/develop.txt +28 -0
- data/vendor/behave/py.requirements/docs.txt +6 -0
- data/vendor/behave/py.requirements/json.txt +7 -0
- data/vendor/behave/py.requirements/more_py26.txt +8 -0
- data/vendor/behave/py.requirements/testing.txt +10 -0
- data/vendor/behave/pytest.ini +24 -0
- data/vendor/behave/setup.cfg +29 -0
- data/vendor/behave/setup.py +118 -0
- data/vendor/behave/setuptools_behave.py +130 -0
- data/vendor/behave/tasks/__behave.py +45 -0
- data/vendor/behave/tasks/__init__.py +55 -0
- data/vendor/behave/tasks/__main__.py +70 -0
- data/vendor/behave/tasks/_setup.py +135 -0
- data/vendor/behave/tasks/_vendor/README.rst +35 -0
- data/vendor/behave/tasks/_vendor/invoke.zip +0 -0
- data/vendor/behave/tasks/_vendor/path.py +1725 -0
- data/vendor/behave/tasks/_vendor/pathlib.py +1280 -0
- data/vendor/behave/tasks/_vendor/six.py +868 -0
- data/vendor/behave/tasks/clean.py +246 -0
- data/vendor/behave/tasks/docs.py +97 -0
- data/vendor/behave/tasks/requirements.txt +17 -0
- data/vendor/behave/tasks/test.py +192 -0
- data/vendor/behave/test/__init__.py +0 -0
- data/vendor/behave/test/_importer_candidate.py +3 -0
- data/vendor/behave/test/reporters/__init__.py +0 -0
- data/vendor/behave/test/reporters/test_summary.py +240 -0
- data/vendor/behave/test/test_ansi_escapes.py +73 -0
- data/vendor/behave/test/test_configuration.py +172 -0
- data/vendor/behave/test/test_formatter.py +265 -0
- data/vendor/behave/test/test_formatter_progress.py +39 -0
- data/vendor/behave/test/test_formatter_rerun.py +97 -0
- data/vendor/behave/test/test_formatter_tags.py +57 -0
- data/vendor/behave/test/test_importer.py +151 -0
- data/vendor/behave/test/test_log_capture.py +29 -0
- data/vendor/behave/test/test_matchers.py +236 -0
- data/vendor/behave/test/test_model.py +871 -0
- data/vendor/behave/test/test_parser.py +1590 -0
- data/vendor/behave/test/test_runner.py +1074 -0
- data/vendor/behave/test/test_step_registry.py +96 -0
- data/vendor/behave/test/test_tag_expression.py +506 -0
- data/vendor/behave/test/test_tag_expression2.py +462 -0
- data/vendor/behave/test/test_tag_matcher.py +729 -0
- data/vendor/behave/test/test_userdata.py +184 -0
- data/vendor/behave/tests/README.txt +12 -0
- data/vendor/behave/tests/__init__.py +0 -0
- data/vendor/behave/tests/api/__ONLY_PY34_or_newer.txt +0 -0
- data/vendor/behave/tests/api/__init__.py +0 -0
- data/vendor/behave/tests/api/_test_async_step34.py +130 -0
- data/vendor/behave/tests/api/_test_async_step35.py +75 -0
- data/vendor/behave/tests/api/test_async_step.py +18 -0
- data/vendor/behave/tests/api/testing_support.py +94 -0
- data/vendor/behave/tests/api/testing_support_async.py +21 -0
- data/vendor/behave/tests/issues/test_issue0336.py +66 -0
- data/vendor/behave/tests/issues/test_issue0449.py +55 -0
- data/vendor/behave/tests/issues/test_issue0453.py +62 -0
- data/vendor/behave/tests/issues/test_issue0458.py +54 -0
- data/vendor/behave/tests/issues/test_issue0495.py +65 -0
- data/vendor/behave/tests/unit/__init__.py +0 -0
- data/vendor/behave/tests/unit/test_behave4cmd_command_shell_proc.py +135 -0
- data/vendor/behave/tests/unit/test_capture.py +280 -0
- data/vendor/behave/tests/unit/test_model_core.py +56 -0
- data/vendor/behave/tests/unit/test_textutil.py +267 -0
- data/vendor/behave/tools/test-features/background.feature +9 -0
- data/vendor/behave/tools/test-features/environment.py +8 -0
- data/vendor/behave/tools/test-features/french.feature +11 -0
- data/vendor/behave/tools/test-features/outline.feature +39 -0
- data/vendor/behave/tools/test-features/parse.feature +10 -0
- data/vendor/behave/tools/test-features/step-data.feature +60 -0
- data/vendor/behave/tools/test-features/steps/steps.py +120 -0
- data/vendor/behave/tools/test-features/tags.feature +18 -0
- data/vendor/behave/tox.ini +159 -0
- metadata +562 -0
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
Provides some utility functions related to text processing.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from __future__ import absolute_import, print_function
|
|
7
|
+
import codecs
|
|
8
|
+
import os
|
|
9
|
+
import sys
|
|
10
|
+
import six
|
|
11
|
+
|
|
12
|
+
# -----------------------------------------------------------------------------
|
|
13
|
+
# CONSTANTS:
|
|
14
|
+
# -----------------------------------------------------------------------------
|
|
15
|
+
# DEFAULT STRATEGY: For error handling when unicode-strings are converted.
|
|
16
|
+
BEHAVE_UNICODE_ERRORS = os.environ.get("BEHAVE_UNICODE_ERRORS", "replace")
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
# -----------------------------------------------------------------------------
|
|
20
|
+
# FUNCTIONS:
|
|
21
|
+
# -----------------------------------------------------------------------------
|
|
22
|
+
def make_indentation(indent_size, part=u" "):
|
|
23
|
+
"""Creates an indentation prefix string of the given size."""
|
|
24
|
+
return indent_size * part
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def indent(text, prefix): # pylint: disable=redefined-outer-name
|
|
28
|
+
"""Indent text or a number of text lines (with newline).
|
|
29
|
+
|
|
30
|
+
:param lines: Text lines to indent (as string or list of strings).
|
|
31
|
+
:param prefix: Line prefix to use (as string).
|
|
32
|
+
:return: Indented text (as unicode string).
|
|
33
|
+
"""
|
|
34
|
+
lines = text
|
|
35
|
+
newline = u""
|
|
36
|
+
if isinstance(text, six.string_types):
|
|
37
|
+
lines = text.splitlines(True)
|
|
38
|
+
elif lines and not lines[0].endswith("\n"):
|
|
39
|
+
# -- TEXT LINES: Without trailing new-line.
|
|
40
|
+
newline = u"\n"
|
|
41
|
+
# MAYBE: return newline.join([prefix + six.text_type(line, errors="replace")
|
|
42
|
+
return newline.join([prefix + six.text_type(line) for line in lines])
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def compute_words_maxsize(words):
|
|
46
|
+
"""Compute the maximum word size from a list of words (or strings).
|
|
47
|
+
|
|
48
|
+
:param words: List of words (or strings) to use.
|
|
49
|
+
:return: Maximum size of all words.
|
|
50
|
+
"""
|
|
51
|
+
max_size = 0
|
|
52
|
+
for word in words:
|
|
53
|
+
if len(word) > max_size:
|
|
54
|
+
max_size = len(word)
|
|
55
|
+
return max_size
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def is_ascii_encoding(encoding):
|
|
59
|
+
"""Checks if a given encoding is ASCII."""
|
|
60
|
+
try:
|
|
61
|
+
return codecs.lookup(encoding).name == "ascii"
|
|
62
|
+
except LookupError:
|
|
63
|
+
return False
|
|
64
|
+
|
|
65
|
+
def select_best_encoding(outstream=None):
|
|
66
|
+
"""Select the *best* encoding for an output stream/file.
|
|
67
|
+
Uses:
|
|
68
|
+
* ``outstream.encoding`` (if available)
|
|
69
|
+
* ``sys.getdefaultencoding()`` (otherwise)
|
|
70
|
+
|
|
71
|
+
Note: If encoding=ascii, uses encoding=UTF-8
|
|
72
|
+
|
|
73
|
+
:param outstream: Output stream to select encoding for (or: stdout)
|
|
74
|
+
:return: Unicode encoding name (as string) to use (for output stream).
|
|
75
|
+
"""
|
|
76
|
+
outstream = outstream or sys.stdout
|
|
77
|
+
encoding = getattr(outstream, "encoding", None) or sys.getdefaultencoding()
|
|
78
|
+
if is_ascii_encoding(encoding):
|
|
79
|
+
# -- REQUIRED-FOR: Python2
|
|
80
|
+
# MAYBE: locale.getpreferredencoding()
|
|
81
|
+
return "utf-8"
|
|
82
|
+
return encoding
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def text(value, encoding=None, errors=None):
|
|
86
|
+
"""Convert into a unicode string.
|
|
87
|
+
|
|
88
|
+
:param value: Value to convert into a unicode string (bytes, str, object).
|
|
89
|
+
:return: Unicode string
|
|
90
|
+
|
|
91
|
+
SYNDROMES:
|
|
92
|
+
* Convert object to unicode: Has only __str__() method (Python2)
|
|
93
|
+
* Windows: exception-traceback and encoding=unicode-escape are BAD
|
|
94
|
+
* exception-traceback w/ weird encoding or bytes
|
|
95
|
+
|
|
96
|
+
ALTERNATIVES:
|
|
97
|
+
* Use traceback2 for Python2: Provides unicode tracebacks
|
|
98
|
+
"""
|
|
99
|
+
if encoding is None:
|
|
100
|
+
encoding = select_best_encoding()
|
|
101
|
+
if errors is None:
|
|
102
|
+
errors = BEHAVE_UNICODE_ERRORS
|
|
103
|
+
|
|
104
|
+
if isinstance(value, six.text_type):
|
|
105
|
+
# -- CASE: ALREADY UNICODE (pass-through, efficiency):
|
|
106
|
+
return value
|
|
107
|
+
elif isinstance(value, six.binary_type):
|
|
108
|
+
# -- CASE: bytes/binary_type (Python2: str)
|
|
109
|
+
try:
|
|
110
|
+
return six.text_type(value, encoding, errors)
|
|
111
|
+
except UnicodeError:
|
|
112
|
+
# -- BEST-EFFORT:
|
|
113
|
+
return six.u(value)
|
|
114
|
+
# elif isinstance(value, bytes):
|
|
115
|
+
# # -- MAYBE: filename, path, etc.
|
|
116
|
+
# try:
|
|
117
|
+
# return value.decode(sys.getfilesystemencoding())
|
|
118
|
+
# except UnicodeError:
|
|
119
|
+
# return value.decode("utf-8", "replace") # MAYBE: "ignore"
|
|
120
|
+
else:
|
|
121
|
+
# -- CASE: CONVERT/CAST OBJECT TO TEXT/STRING
|
|
122
|
+
try:
|
|
123
|
+
if six.PY2:
|
|
124
|
+
try:
|
|
125
|
+
text2 = six.text_type(value)
|
|
126
|
+
except UnicodeError as e:
|
|
127
|
+
# -- NOTE: value has no sane unicode conversion
|
|
128
|
+
# encoding=unicode-escape helps recover from errors.
|
|
129
|
+
data = str(value)
|
|
130
|
+
text2 = six.text_type(data, "unicode-escape", "replace")
|
|
131
|
+
else:
|
|
132
|
+
# PY3: Cast to string/unicode
|
|
133
|
+
text2 = six.text_type(value)
|
|
134
|
+
except UnicodeError as e:
|
|
135
|
+
# Python3: multi-arg call supports only string-like object: str, bytes
|
|
136
|
+
text2 = six.text_type(e)
|
|
137
|
+
return text2
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
Functionality to support user-specific configuration data (userdata).
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from __future__ import absolute_import
|
|
7
|
+
from behave._types import Unknown
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
# -----------------------------------------------------------------------------
|
|
11
|
+
# FUNCTIONS:
|
|
12
|
+
# -----------------------------------------------------------------------------
|
|
13
|
+
def parse_bool(text):
|
|
14
|
+
"""Parses a boolean text and converts it into boolean value (if possible).
|
|
15
|
+
Supported truth string values:
|
|
16
|
+
|
|
17
|
+
* true: "true", "yes", "on", "1"
|
|
18
|
+
* false: "false", "no", "off", "0"
|
|
19
|
+
|
|
20
|
+
:raises: ValueError, if text is invalid
|
|
21
|
+
"""
|
|
22
|
+
from distutils.util import strtobool
|
|
23
|
+
return bool(strtobool(text))
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def parse_user_define(text):
|
|
27
|
+
"""Parse "{name}={value}" text and return parts as tuple.
|
|
28
|
+
Used for command-line definitions, like "... -D name=value".
|
|
29
|
+
|
|
30
|
+
SUPPORTED SCHEMA:
|
|
31
|
+
|
|
32
|
+
* "{name}={value}"
|
|
33
|
+
* "{name}" (boolean flag; value="true")
|
|
34
|
+
* '"{name}={value}"' (double-quoted name-value pair)
|
|
35
|
+
* "'{name}={value}'" (single-quoted name-value pair)
|
|
36
|
+
* '{name}="{value}"' (double-quoted value)
|
|
37
|
+
* "{name}='{value}'" (single-quoted value)
|
|
38
|
+
* " {name} = {value} " (whitespace padded)
|
|
39
|
+
|
|
40
|
+
.. note:: Leading/trailing Quotes are stripped.
|
|
41
|
+
|
|
42
|
+
:param text: Text to parse (as string).
|
|
43
|
+
:return: (name, value) pair as tuple.
|
|
44
|
+
"""
|
|
45
|
+
text = text.strip()
|
|
46
|
+
if "=" in text:
|
|
47
|
+
text = unqote(text)
|
|
48
|
+
name, value = text.split("=", 1)
|
|
49
|
+
name = name.strip()
|
|
50
|
+
value = unqote(value.strip())
|
|
51
|
+
else:
|
|
52
|
+
# -- ASSUMPTION: Boolean definition (as flag)
|
|
53
|
+
name = text
|
|
54
|
+
value = "true"
|
|
55
|
+
return (name, value)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def unqote(text):
|
|
59
|
+
"""Strip pair of leading and trailing quotes from text."""
|
|
60
|
+
# -- QUOTED: Strip single-quote or double-quote pair.
|
|
61
|
+
if ((text.startswith('"') and text.endswith('"')) or
|
|
62
|
+
(text.startswith("'") and text.endswith("'"))):
|
|
63
|
+
text = text[1:-1]
|
|
64
|
+
return text
|
|
65
|
+
|
|
66
|
+
# -----------------------------------------------------------------------------
|
|
67
|
+
# CLASSES:
|
|
68
|
+
# -----------------------------------------------------------------------------
|
|
69
|
+
class UserData(dict):
|
|
70
|
+
"""Dictionary-like user-data with some additional features:
|
|
71
|
+
|
|
72
|
+
* type-converter methods, similar to configparser.ConfigParser.getint()
|
|
73
|
+
|
|
74
|
+
"""
|
|
75
|
+
|
|
76
|
+
def getas(self, convert, name, default=None, valuetype=None):
|
|
77
|
+
"""Converts the value of user-data parameter from a string into a
|
|
78
|
+
specific value type.
|
|
79
|
+
|
|
80
|
+
:param convert: Converter function to use (string to value-type).
|
|
81
|
+
:param name: Variable name to use.
|
|
82
|
+
:param default: Default value, used if parameter is not found.
|
|
83
|
+
:param valuetype: Value type(s), needed if convert != valuetype()
|
|
84
|
+
:return: Converted textual value (type: valuetype)
|
|
85
|
+
:return: Default value, if parameter is unknown.
|
|
86
|
+
:raises ValueError: If type conversion fails.
|
|
87
|
+
"""
|
|
88
|
+
if valuetype is None:
|
|
89
|
+
# -- ASSUME: Converter function is the type constructor.
|
|
90
|
+
valuetype = convert
|
|
91
|
+
|
|
92
|
+
value = self.get(name, Unknown)
|
|
93
|
+
if value is Unknown:
|
|
94
|
+
return default
|
|
95
|
+
elif isinstance(value, valuetype):
|
|
96
|
+
# -- PRESERVE: Pre-converted value if type matches.
|
|
97
|
+
return value
|
|
98
|
+
else:
|
|
99
|
+
# -- CASE: Textual value (expected)
|
|
100
|
+
# Raise ValueError if parse/conversion fails.
|
|
101
|
+
assert callable(convert)
|
|
102
|
+
return convert(value)
|
|
103
|
+
|
|
104
|
+
def getint(self, name, default=0):
|
|
105
|
+
"""Convert parameter value (as string) into a integer value.
|
|
106
|
+
:return: Parameter value as integer number (on success).
|
|
107
|
+
:raises: ValueError, if type conversion fails.
|
|
108
|
+
"""
|
|
109
|
+
return self.getas(int, name, default)
|
|
110
|
+
|
|
111
|
+
def getfloat(self, name, default=0.0):
|
|
112
|
+
"""Convert parameter value (as string) into a float value.
|
|
113
|
+
:return: Parameter value as float number (on success).
|
|
114
|
+
:raises: ValueError, if type conversion fails.
|
|
115
|
+
"""
|
|
116
|
+
return self.getas(float, name, default)
|
|
117
|
+
|
|
118
|
+
def getbool(self, name, default=False):
|
|
119
|
+
"""Converts user-data string-value into boolean value (if possible).
|
|
120
|
+
Supported truth string values:
|
|
121
|
+
|
|
122
|
+
* true: "true", "yes", "on", "1"
|
|
123
|
+
* false: "false", "no", "off", "0"
|
|
124
|
+
|
|
125
|
+
:param name: Parameter name (as string).
|
|
126
|
+
:param default: Default value, if parameter is unknown (=False).
|
|
127
|
+
:return: Boolean value of parameter
|
|
128
|
+
:raises: ValueError, if type conversion fails.
|
|
129
|
+
"""
|
|
130
|
+
return self.getas(parse_bool, name, default, valuetype=bool)
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
Import all step definitions of this step-library.
|
|
4
|
+
Step definitions are automatically registered in "behave.step_registry".
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import absolute_import
|
|
8
|
+
|
|
9
|
+
# -- IMPORT STEP-LIBRARY: behave4cmd0
|
|
10
|
+
import behave4cmd0.command_steps
|
|
11
|
+
import behave4cmd0.note_steps
|
|
12
|
+
import behave4cmd0.log.steps
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
from __future__ import absolute_import
|
|
4
|
+
import os.path
|
|
5
|
+
|
|
6
|
+
# -----------------------------------------------------------------------------
|
|
7
|
+
# CONSTANTS:
|
|
8
|
+
# -----------------------------------------------------------------------------
|
|
9
|
+
HERE = os.path.dirname(__file__)
|
|
10
|
+
TOP = os.path.join(HERE, "..")
|
|
11
|
+
TOPA = os.path.abspath(TOP)
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""
|
|
4
|
+
Provide a behave shell to simplify creation of feature files
|
|
5
|
+
and running features, etc.
|
|
6
|
+
|
|
7
|
+
context.command_result = behave_shell.behave(cmdline, cwd=context.workdir)
|
|
8
|
+
behave_shell.create_scenario(scenario_text, cwd=context.workdir)
|
|
9
|
+
behave_shell.create_step_definition(context.text, cwd=context.workdir)
|
|
10
|
+
context.command_result = behave_shell.run_feature_with_formatter(
|
|
11
|
+
context.features[0], formatter=formatter, cwd=context.workdir)
|
|
12
|
+
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from __future__ import absolute_import, print_function, with_statement
|
|
16
|
+
from behave4cmd0.__setup import TOP
|
|
17
|
+
from behave.textutil import text as _text
|
|
18
|
+
import os.path
|
|
19
|
+
import six
|
|
20
|
+
import subprocess
|
|
21
|
+
import sys
|
|
22
|
+
import shlex
|
|
23
|
+
if six.PY2:
|
|
24
|
+
import codecs
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
# HERE = os.path.dirname(__file__)
|
|
28
|
+
# TOP = os.path.join(HERE, "..")
|
|
29
|
+
|
|
30
|
+
# -----------------------------------------------------------------------------
|
|
31
|
+
# CLASSES:
|
|
32
|
+
# -----------------------------------------------------------------------------
|
|
33
|
+
class CommandResult(object):
|
|
34
|
+
"""
|
|
35
|
+
ValueObject to store the results of a subprocess command call.
|
|
36
|
+
"""
|
|
37
|
+
def __init__(self, **kwargs):
|
|
38
|
+
self.command = kwargs.pop("command", None)
|
|
39
|
+
self.returncode = kwargs.pop("returncode", 0)
|
|
40
|
+
self.stdout = kwargs.pop("stdout", "")
|
|
41
|
+
self.stderr = kwargs.pop("stderr", "")
|
|
42
|
+
self._output = None
|
|
43
|
+
if kwargs:
|
|
44
|
+
names = ", ".join(kwargs.keys())
|
|
45
|
+
raise ValueError("Unexpected: %s" % names)
|
|
46
|
+
|
|
47
|
+
@property
|
|
48
|
+
def output(self):
|
|
49
|
+
if self._output is None:
|
|
50
|
+
output = self.stdout
|
|
51
|
+
if self.stderr:
|
|
52
|
+
if self.stdout:
|
|
53
|
+
output += "\n"
|
|
54
|
+
output += self.stderr
|
|
55
|
+
self._output = output
|
|
56
|
+
return self._output
|
|
57
|
+
|
|
58
|
+
@property
|
|
59
|
+
def failed(self):
|
|
60
|
+
return self.returncode != 0
|
|
61
|
+
|
|
62
|
+
def clear(self):
|
|
63
|
+
self.command = None
|
|
64
|
+
self.returncode = 0
|
|
65
|
+
self.stdout = ""
|
|
66
|
+
self.stderr = ""
|
|
67
|
+
self._output = None
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
class Command(object):
|
|
71
|
+
"""
|
|
72
|
+
Helper class to run commands as subprocess,
|
|
73
|
+
collect their output and subprocess returncode.
|
|
74
|
+
"""
|
|
75
|
+
DEBUG = False
|
|
76
|
+
COMMAND_MAP = {
|
|
77
|
+
"behave": os.path.normpath("{0}/bin/behave".format(TOP))
|
|
78
|
+
}
|
|
79
|
+
PREPROCESSOR_MAP = {}
|
|
80
|
+
POSTPROCESSOR_MAP = {}
|
|
81
|
+
USE_SHELL = sys.platform.startswith("win")
|
|
82
|
+
|
|
83
|
+
@staticmethod
|
|
84
|
+
def preprocess_command(preprocessors, cmdargs, command=None, cwd="."):
|
|
85
|
+
if not os.path.isdir(cwd):
|
|
86
|
+
return cmdargs
|
|
87
|
+
elif not command:
|
|
88
|
+
command = " ".join(cmdargs)
|
|
89
|
+
|
|
90
|
+
for preprocess in preprocessors:
|
|
91
|
+
cmdargs = preprocess(command, cmdargs, cwd)
|
|
92
|
+
return cmdargs
|
|
93
|
+
|
|
94
|
+
@staticmethod
|
|
95
|
+
def postprocess_command(postprocessors, command_result):
|
|
96
|
+
for postprocess in postprocessors:
|
|
97
|
+
command_result = postprocess(command_result)
|
|
98
|
+
return command_result
|
|
99
|
+
|
|
100
|
+
@classmethod
|
|
101
|
+
def run(cls, command, cwd=".", **kwargs):
|
|
102
|
+
"""
|
|
103
|
+
Make a subprocess call, collect its output and returncode.
|
|
104
|
+
Returns CommandResult instance as ValueObject.
|
|
105
|
+
"""
|
|
106
|
+
assert isinstance(command, six.string_types)
|
|
107
|
+
command_result = CommandResult()
|
|
108
|
+
command_result.command = command
|
|
109
|
+
use_shell = cls.USE_SHELL
|
|
110
|
+
if "shell" in kwargs:
|
|
111
|
+
use_shell = kwargs.pop("shell")
|
|
112
|
+
|
|
113
|
+
# -- BUILD COMMAND ARGS:
|
|
114
|
+
if six.PY2 and isinstance(command, six.text_type):
|
|
115
|
+
# -- PREPARE-FOR: shlex.split()
|
|
116
|
+
# In PY2, shlex.split() requires bytes string (non-unicode).
|
|
117
|
+
# In PY3, shlex.split() accepts unicode string.
|
|
118
|
+
command = codecs.encode(command, "utf-8")
|
|
119
|
+
cmdargs = shlex.split(command)
|
|
120
|
+
|
|
121
|
+
# -- TRANSFORM COMMAND (optional)
|
|
122
|
+
command0 = cmdargs[0]
|
|
123
|
+
real_command = cls.COMMAND_MAP.get(command0, None)
|
|
124
|
+
if real_command:
|
|
125
|
+
cmdargs0 = real_command.split()
|
|
126
|
+
cmdargs = cmdargs0 + cmdargs[1:]
|
|
127
|
+
preprocessors = cls.PREPROCESSOR_MAP.get(command0)
|
|
128
|
+
if preprocessors:
|
|
129
|
+
cmdargs = cls.preprocess_command(preprocessors, cmdargs, command, cwd)
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
# -- RUN COMMAND:
|
|
133
|
+
try:
|
|
134
|
+
process = subprocess.Popen(cmdargs,
|
|
135
|
+
stdout=subprocess.PIPE,
|
|
136
|
+
stderr=subprocess.PIPE,
|
|
137
|
+
universal_newlines=True,
|
|
138
|
+
shell=use_shell,
|
|
139
|
+
cwd=cwd, **kwargs)
|
|
140
|
+
out, err = process.communicate()
|
|
141
|
+
if six.PY2: # py3: we get unicode strings, py2 not
|
|
142
|
+
# default_encoding = "UTF-8"
|
|
143
|
+
out = _text(out, process.stdout.encoding)
|
|
144
|
+
err = _text(err, process.stderr.encoding)
|
|
145
|
+
process.poll()
|
|
146
|
+
assert process.returncode is not None
|
|
147
|
+
command_result.stdout = out
|
|
148
|
+
command_result.stderr = err
|
|
149
|
+
command_result.returncode = process.returncode
|
|
150
|
+
if cls.DEBUG:
|
|
151
|
+
print("shell.cwd={0}".format(kwargs.get("cwd", None)))
|
|
152
|
+
print("shell.command: {0}".format(" ".join(cmdargs)))
|
|
153
|
+
print("shell.command.output:\n{0};".format(command_result.output))
|
|
154
|
+
except OSError as e:
|
|
155
|
+
command_result.stderr = u"OSError: %s" % e
|
|
156
|
+
command_result.returncode = e.errno
|
|
157
|
+
assert e.errno != 0
|
|
158
|
+
|
|
159
|
+
postprocessors = cls.POSTPROCESSOR_MAP.get(command0)
|
|
160
|
+
if postprocessors:
|
|
161
|
+
command_result = cls.postprocess_command(postprocessors, command_result)
|
|
162
|
+
return command_result
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
# -----------------------------------------------------------------------------
|
|
166
|
+
# PREPROCESSOR:
|
|
167
|
+
# -----------------------------------------------------------------------------
|
|
168
|
+
def path_glob(command, cmdargs, cwd="."):
|
|
169
|
+
import glob
|
|
170
|
+
if not glob.has_magic(command):
|
|
171
|
+
return cmdargs
|
|
172
|
+
|
|
173
|
+
assert os.path.isdir(cwd)
|
|
174
|
+
try:
|
|
175
|
+
current_cwd = os.getcwd()
|
|
176
|
+
os.chdir(cwd)
|
|
177
|
+
new_cmdargs = []
|
|
178
|
+
for cmdarg in cmdargs:
|
|
179
|
+
if not glob.has_magic(cmdarg):
|
|
180
|
+
new_cmdargs.append(cmdarg)
|
|
181
|
+
continue
|
|
182
|
+
|
|
183
|
+
more_args = glob.glob(cmdarg)
|
|
184
|
+
if more_args:
|
|
185
|
+
new_cmdargs.extend(more_args)
|
|
186
|
+
else:
|
|
187
|
+
# -- BAD-CASE: Require at least one match.
|
|
188
|
+
# Otherwise, restore original arg.
|
|
189
|
+
new_cmdargs.append(cmdarg)
|
|
190
|
+
|
|
191
|
+
cmdargs = new_cmdargs
|
|
192
|
+
finally:
|
|
193
|
+
os.chdir(current_cwd)
|
|
194
|
+
return cmdargs
|
|
195
|
+
|
|
196
|
+
# -----------------------------------------------------------------------------
|
|
197
|
+
# FUNCTIONS:
|
|
198
|
+
# -----------------------------------------------------------------------------
|
|
199
|
+
def run(command, cwd=".", **kwargs):
|
|
200
|
+
return Command.run(command, cwd=cwd, **kwargs)
|
|
201
|
+
|
|
202
|
+
def behave(cmdline, cwd=".", **kwargs):
|
|
203
|
+
"""
|
|
204
|
+
Run behave as subprocess command and return process/shell instance
|
|
205
|
+
with results (collected output, returncode).
|
|
206
|
+
"""
|
|
207
|
+
assert isinstance(cmdline, six.string_types)
|
|
208
|
+
return run("behave " + cmdline, cwd=cwd, **kwargs)
|
|
209
|
+
|
|
210
|
+
# -----------------------------------------------------------------------------
|
|
211
|
+
# TEST MAIN:
|
|
212
|
+
# -----------------------------------------------------------------------------
|
|
213
|
+
if __name__ == "__main__":
|
|
214
|
+
command = " ".join(sys.argv[1:])
|
|
215
|
+
output = Command.run(sys.argv[1:])
|
|
216
|
+
print("command: {0}\n{1}\n".format(command, output))
|