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,184 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
from __future__ import absolute_import
|
|
4
|
+
from behave.configuration import Configuration
|
|
5
|
+
from behave.userdata import UserData, parse_user_define
|
|
6
|
+
from behave._types import Unknown
|
|
7
|
+
from unittest import TestCase
|
|
8
|
+
from nose.tools import eq_
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class TestParseUserDefine(TestCase):
|
|
12
|
+
"""Test parse_user_define() function."""
|
|
13
|
+
|
|
14
|
+
def test_parse__name_value(self):
|
|
15
|
+
parts = parse_user_define("person=Alice")
|
|
16
|
+
self.assertEqual(parts, ("person", "Alice"))
|
|
17
|
+
|
|
18
|
+
def test_parse__name_only_for_boolean_flag(self):
|
|
19
|
+
parts = parse_user_define("boolean_flag")
|
|
20
|
+
self.assertEqual(parts, ("boolean_flag", "true"))
|
|
21
|
+
|
|
22
|
+
def test_parse__name_value_with_padded_whitespace(self):
|
|
23
|
+
texts = [
|
|
24
|
+
" person=Alice",
|
|
25
|
+
"person=Alice ",
|
|
26
|
+
"person = Alice",
|
|
27
|
+
]
|
|
28
|
+
for text in texts:
|
|
29
|
+
parts = parse_user_define(text)
|
|
30
|
+
self.assertEqual(parts, ("person", "Alice"))
|
|
31
|
+
|
|
32
|
+
def test_parse__name_value_with_quoted_name_value_pair(self):
|
|
33
|
+
texts = [
|
|
34
|
+
'"person=Alice and Bob"',
|
|
35
|
+
"'person=Alice and Bob'",
|
|
36
|
+
]
|
|
37
|
+
for text in texts:
|
|
38
|
+
parts = parse_user_define(text)
|
|
39
|
+
self.assertEqual(parts, ("person", "Alice and Bob"))
|
|
40
|
+
|
|
41
|
+
def test_parse__name_value_with_quoted_value(self):
|
|
42
|
+
texts = [
|
|
43
|
+
'person="Alice and Bob"',
|
|
44
|
+
"person='Alice and Bob'",
|
|
45
|
+
]
|
|
46
|
+
for text in texts:
|
|
47
|
+
parts = parse_user_define(text)
|
|
48
|
+
self.assertEqual(parts, ("person", "Alice and Bob"))
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class TestUserData(TestCase):
|
|
54
|
+
"""Test UserData class."""
|
|
55
|
+
|
|
56
|
+
def test_userdata_is_dictlike(self):
|
|
57
|
+
userdata = UserData(name="Foo", number=42)
|
|
58
|
+
value1 = userdata["name"]
|
|
59
|
+
value2 = userdata.get("number")
|
|
60
|
+
value3 = userdata.get("unknown", Unknown)
|
|
61
|
+
assert isinstance(userdata, dict)
|
|
62
|
+
self.assertEqual(value1, "Foo")
|
|
63
|
+
self.assertEqual(value2, 42)
|
|
64
|
+
assert value3 is Unknown
|
|
65
|
+
|
|
66
|
+
def test_getas__with_known_param_and_valid_text(self):
|
|
67
|
+
userdata = UserData(param="42")
|
|
68
|
+
assert "param" in userdata, "ENSURE: known param"
|
|
69
|
+
|
|
70
|
+
value = userdata.getas(int, "param")
|
|
71
|
+
assert isinstance(value, int)
|
|
72
|
+
self.assertEqual(value, 42)
|
|
73
|
+
|
|
74
|
+
def test_getas__with_known_param_and_invalid_text_raises_ValueError(self):
|
|
75
|
+
userdata = UserData(param="__BAD_NUMBER__")
|
|
76
|
+
assert "param" in userdata, "ENSURE: known param"
|
|
77
|
+
self.assertRaises(ValueError, userdata.getas, int, "param")
|
|
78
|
+
|
|
79
|
+
def test_getas__with_known_param_and_preconverted_value(self):
|
|
80
|
+
userdata = UserData(param=42)
|
|
81
|
+
assert "param" in userdata, "ENSURE: known param"
|
|
82
|
+
|
|
83
|
+
value = userdata.getas(int, "param")
|
|
84
|
+
assert isinstance(value, int)
|
|
85
|
+
self.assertEqual(value, 42)
|
|
86
|
+
|
|
87
|
+
def test_getas__with_known_param_and_preconverted_value_and_valuetype(self):
|
|
88
|
+
userdata = UserData(param=42)
|
|
89
|
+
assert "param" in userdata, "ENSURE: known param"
|
|
90
|
+
|
|
91
|
+
def parse_int(text):
|
|
92
|
+
return int(text)
|
|
93
|
+
|
|
94
|
+
value = userdata.getas(parse_int, "param", valuetype=int)
|
|
95
|
+
assert isinstance(value, int)
|
|
96
|
+
self.assertEqual(value, 42)
|
|
97
|
+
|
|
98
|
+
def test_getas__with_unknown_param_without_default_returns_none(self):
|
|
99
|
+
userdata = UserData()
|
|
100
|
+
assert "param" not in userdata, "ENSURE: unknown param"
|
|
101
|
+
|
|
102
|
+
value = userdata.getas(int, "param")
|
|
103
|
+
assert value is None
|
|
104
|
+
|
|
105
|
+
def test_getas__with_unknown_param_returns_default_value(self):
|
|
106
|
+
userdata = UserData()
|
|
107
|
+
assert "param" not in userdata, "ENSURE: unknown param"
|
|
108
|
+
|
|
109
|
+
value = userdata.getas(int, "param", 123)
|
|
110
|
+
assert isinstance(value, int)
|
|
111
|
+
self.assertEqual(value, 123)
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def test_getint__with_known_param_and_valid_text(self):
|
|
115
|
+
userdata = UserData(param="42")
|
|
116
|
+
value = userdata.getint("param")
|
|
117
|
+
assert isinstance(value, int)
|
|
118
|
+
self.assertEqual(value, 42)
|
|
119
|
+
|
|
120
|
+
def test_getint__with_known_param_and_invalid_text_raises_ValueError(self):
|
|
121
|
+
userdata = UserData(param="__BAD_NUMBER__")
|
|
122
|
+
self.assertRaises(ValueError, userdata.getint, "param")
|
|
123
|
+
|
|
124
|
+
def test_getint__with_unknown_param_without_default_returns_zero(self):
|
|
125
|
+
userdata = UserData()
|
|
126
|
+
value = userdata.getint("param")
|
|
127
|
+
self.assertEqual(value, 0)
|
|
128
|
+
|
|
129
|
+
def test_getint__with_unknown_param_returns_default_value(self):
|
|
130
|
+
userdata = UserData()
|
|
131
|
+
value = userdata.getint("param", 123)
|
|
132
|
+
assert isinstance(value, int)
|
|
133
|
+
self.assertEqual(value, 123)
|
|
134
|
+
|
|
135
|
+
def test_getfloat__with_known_param_and_valid_text(self):
|
|
136
|
+
for valid_text in ["1.2", "2", "-1E+3", "+2.34E-5"]:
|
|
137
|
+
userdata = UserData(param=valid_text)
|
|
138
|
+
value = userdata.getfloat("param")
|
|
139
|
+
assert isinstance(value, float)
|
|
140
|
+
self.assertEqual(value, float(valid_text))
|
|
141
|
+
|
|
142
|
+
def test_getfloat__with_known_param_and_invalid_text_raises_ValueError(self):
|
|
143
|
+
userdata = UserData(param="__BAD_NUMBER__")
|
|
144
|
+
self.assertRaises(ValueError, userdata.getfloat, "param")
|
|
145
|
+
|
|
146
|
+
def test_getfloat__with_unknown_param_without_default_returns_zero(self):
|
|
147
|
+
userdata = UserData()
|
|
148
|
+
value = userdata.getfloat("param")
|
|
149
|
+
self.assertEqual(value, 0.0)
|
|
150
|
+
|
|
151
|
+
def test_getfloat__with_unknown_param_returns_default_value(self):
|
|
152
|
+
userdata = UserData()
|
|
153
|
+
value = userdata.getint("param", 1.2)
|
|
154
|
+
assert isinstance(value, float)
|
|
155
|
+
self.assertEqual(value, 1.2)
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
def test_getbool__with_known_param_and_valid_text(self):
|
|
159
|
+
for true_text in ["true", "TRUE", "True", "yes", "on", "1"]:
|
|
160
|
+
userdata = UserData(param=true_text)
|
|
161
|
+
value = userdata.getbool("param")
|
|
162
|
+
assert isinstance(value, bool), "text=%s" % true_text
|
|
163
|
+
self.assertEqual(value, True)
|
|
164
|
+
|
|
165
|
+
for false_text in ["false", "FALSE", "False", "no", "off", "0"]:
|
|
166
|
+
userdata = UserData(param=false_text)
|
|
167
|
+
value = userdata.getbool("param")
|
|
168
|
+
assert isinstance(value, bool), "text=%s" % false_text
|
|
169
|
+
self.assertEqual(value, False)
|
|
170
|
+
|
|
171
|
+
def test_getbool__with_known_param_and_invalid_text_raises_ValueError(self):
|
|
172
|
+
userdata = UserData(param="__BAD_VALUE__")
|
|
173
|
+
self.assertRaises(ValueError, userdata.getbool, "param")
|
|
174
|
+
|
|
175
|
+
def test_getbool__with_unknown_param_without_default_returns_false(self):
|
|
176
|
+
userdata = UserData()
|
|
177
|
+
value = userdata.getfloat("param")
|
|
178
|
+
self.assertEqual(value, False)
|
|
179
|
+
|
|
180
|
+
def test_getbool__with_unknown_param_returns_default_value(self):
|
|
181
|
+
userdata = UserData()
|
|
182
|
+
value = userdata.getint("param", 1.2)
|
|
183
|
+
assert isinstance(value, float)
|
|
184
|
+
self.assertEqual(value, 1.2)
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
This is the new directory root for:
|
|
2
|
+
|
|
3
|
+
* unit tests
|
|
4
|
+
* functional tests (that do not use feature files)
|
|
5
|
+
|
|
6
|
+
The tests here use the :pypi:`pytest` test framework for testing.
|
|
7
|
+
|
|
8
|
+
.. note::
|
|
9
|
+
|
|
10
|
+
Other tests in the collocated "../test/" directory will be eventually
|
|
11
|
+
cleaned and converted in (clean) pytests ;-)
|
|
12
|
+
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
Unit tests for :mod:`behave.api.async_test`.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
# -- IMPORTS:
|
|
7
|
+
from __future__ import absolute_import, print_function
|
|
8
|
+
from behave.api.async_step import AsyncContext, use_or_create_async_context
|
|
9
|
+
from behave._stepimport import use_step_import_modules
|
|
10
|
+
from behave.runner import Context, Runner
|
|
11
|
+
import sys
|
|
12
|
+
from mock import Mock
|
|
13
|
+
import pytest
|
|
14
|
+
|
|
15
|
+
from .testing_support import StopWatch, SimpleStepContainer
|
|
16
|
+
from .testing_support_async import AsyncStepTheory
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
# -----------------------------------------------------------------------------
|
|
20
|
+
# ASYNC STEP EXAMPLES:
|
|
21
|
+
# -----------------------------------------------------------------------------
|
|
22
|
+
# if python_version >= 3.5:
|
|
23
|
+
# @step('an async coroutine step waits "{duration:f}" seconds')
|
|
24
|
+
# @async_run_until_complete
|
|
25
|
+
# async def step_async_step_waits_seconds(context, duration):
|
|
26
|
+
# print("async_step: Should sleep for %.3f seconds" % duration)
|
|
27
|
+
# await asyncio.sleep(duration)
|
|
28
|
+
#
|
|
29
|
+
# if python_version >= 3.4:
|
|
30
|
+
# @step('a tagged-coroutine async step waits "{duration:f}" seconds')
|
|
31
|
+
# @async_run_until_complete
|
|
32
|
+
# @asyncio.coroutine
|
|
33
|
+
# def step_async_step_waits_seconds2(context, duration):
|
|
34
|
+
# print("async_step2: Should sleep for %.3f seconds" % duration)
|
|
35
|
+
# yield from asyncio.sleep(duration)
|
|
36
|
+
#
|
|
37
|
+
# -----------------------------------------------------------------------------
|
|
38
|
+
# TEST MARKERS:
|
|
39
|
+
# -----------------------------------------------------------------------------
|
|
40
|
+
python_version = float("%s.%s" % sys.version_info[:2])
|
|
41
|
+
|
|
42
|
+
# xfail = pytest.mark.xfail
|
|
43
|
+
py34_or_newer = pytest.mark.skipif(python_version < 3.4, reason="Needs Python >= 3.4")
|
|
44
|
+
|
|
45
|
+
# -----------------------------------------------------------------------------
|
|
46
|
+
# TESTSUITE:
|
|
47
|
+
# -----------------------------------------------------------------------------
|
|
48
|
+
@py34_or_newer
|
|
49
|
+
class TestAsyncStepDecorator34(object):
|
|
50
|
+
|
|
51
|
+
def test_step_decorator_async_run_until_complete2(self):
|
|
52
|
+
step_container = SimpleStepContainer()
|
|
53
|
+
with use_step_import_modules(step_container):
|
|
54
|
+
# -- STEP-DEFINITIONS EXAMPLE (as MODULE SNIPPET):
|
|
55
|
+
# VARIANT 2: Use @asyncio.coroutine def step_impl()
|
|
56
|
+
from behave import step
|
|
57
|
+
from behave.api.async_step import async_run_until_complete
|
|
58
|
+
import asyncio
|
|
59
|
+
|
|
60
|
+
@step('a tagged-coroutine async step waits "{duration:f}" seconds')
|
|
61
|
+
@async_run_until_complete
|
|
62
|
+
@asyncio.coroutine
|
|
63
|
+
def step_async_step_waits_seconds2(context, duration):
|
|
64
|
+
yield from asyncio.sleep(duration)
|
|
65
|
+
|
|
66
|
+
# -- USES: async def step_impl(...) as async-step (coroutine)
|
|
67
|
+
AsyncStepTheory.validate(step_async_step_waits_seconds2)
|
|
68
|
+
|
|
69
|
+
# -- RUN ASYNC-STEP: Verify that it is behaving correctly.
|
|
70
|
+
# ENSURE: Execution of async-step matches expected duration.
|
|
71
|
+
context = Context(runner=Runner(config={}))
|
|
72
|
+
with StopWatch() as stop_watch:
|
|
73
|
+
step_async_step_waits_seconds2(context, duration=0.2)
|
|
74
|
+
assert abs(stop_watch.duration - 0.2) <= 0.05
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
class TestAsyncContext(object):
|
|
78
|
+
@staticmethod
|
|
79
|
+
def make_context():
|
|
80
|
+
return Context(runner=Runner(config={}))
|
|
81
|
+
|
|
82
|
+
def test_use_or_create_async_context__when_missing(self):
|
|
83
|
+
# -- CASE: AsynContext attribute is created with default_name
|
|
84
|
+
context = self.make_context()
|
|
85
|
+
context._push()
|
|
86
|
+
|
|
87
|
+
async_context = use_or_create_async_context(context)
|
|
88
|
+
assert isinstance(async_context, AsyncContext)
|
|
89
|
+
assert async_context.name == "async_context"
|
|
90
|
+
assert getattr(context, "async_context", None) is async_context
|
|
91
|
+
|
|
92
|
+
context._pop()
|
|
93
|
+
assert getattr(context, "async_context", None) is None
|
|
94
|
+
|
|
95
|
+
def test_use_or_create_async_context__when_exists(self):
|
|
96
|
+
# -- CASE: AsynContext attribute exists with default_name
|
|
97
|
+
context = self.make_context()
|
|
98
|
+
async_context0 = context.async_context = AsyncContext()
|
|
99
|
+
assert context.async_context.name == "async_context"
|
|
100
|
+
assert hasattr(context, AsyncContext.default_name)
|
|
101
|
+
|
|
102
|
+
async_context = use_or_create_async_context(context)
|
|
103
|
+
assert isinstance(async_context, AsyncContext)
|
|
104
|
+
assert async_context.name == "async_context"
|
|
105
|
+
assert getattr(context, "async_context", None) is async_context
|
|
106
|
+
assert async_context is async_context0
|
|
107
|
+
|
|
108
|
+
def test_use_or_create_async_context__when_missing_with_name(self):
|
|
109
|
+
# -- CASE: AsynContext attribute is created with own name
|
|
110
|
+
loop0 = Mock()
|
|
111
|
+
context = self.make_context()
|
|
112
|
+
async_context = use_or_create_async_context(context, "acontext", loop=loop0)
|
|
113
|
+
assert isinstance(async_context, AsyncContext)
|
|
114
|
+
assert async_context.name == "acontext"
|
|
115
|
+
assert getattr(context, "acontext", None) is async_context
|
|
116
|
+
assert async_context.loop is loop0
|
|
117
|
+
|
|
118
|
+
def test_use_or_create_async_context__when_exists_with_name(self):
|
|
119
|
+
# -- CASE: AsynContext attribute exists with own name
|
|
120
|
+
loop0 = Mock()
|
|
121
|
+
context = self.make_context()
|
|
122
|
+
async_context0 = context.acontext = AsyncContext(name="acontext", loop=loop0)
|
|
123
|
+
assert context.acontext.name == "acontext"
|
|
124
|
+
|
|
125
|
+
loop1 = Mock()
|
|
126
|
+
async_context = use_or_create_async_context(context, "acontext", loop=loop1)
|
|
127
|
+
assert isinstance(async_context, AsyncContext)
|
|
128
|
+
assert async_context is async_context0
|
|
129
|
+
assert getattr(context, "acontext", None) is async_context
|
|
130
|
+
assert async_context.loop is loop0
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
Unit tests for :mod:`behave.api.async_test` for Python 3.5 (or newer).
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
# -- IMPORTS:
|
|
7
|
+
from __future__ import absolute_import, print_function
|
|
8
|
+
import sys
|
|
9
|
+
from behave._stepimport import use_step_import_modules
|
|
10
|
+
from behave.runner import Context, Runner
|
|
11
|
+
import pytest
|
|
12
|
+
|
|
13
|
+
from .testing_support import StopWatch, SimpleStepContainer
|
|
14
|
+
from .testing_support_async import AsyncStepTheory
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
# -----------------------------------------------------------------------------
|
|
18
|
+
# SUPPORT:
|
|
19
|
+
# -----------------------------------------------------------------------------
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
# -----------------------------------------------------------------------------
|
|
23
|
+
# ASYNC STEP EXAMPLES:
|
|
24
|
+
# -----------------------------------------------------------------------------
|
|
25
|
+
# if python_version >= 3.5:
|
|
26
|
+
# @step('an async coroutine step waits "{duration:f}" seconds')
|
|
27
|
+
# @async_run_until_complete
|
|
28
|
+
# async def step_async_step_waits_seconds(context, duration):
|
|
29
|
+
# print("async_step: Should sleep for %.3f seconds" % duration)
|
|
30
|
+
# await asyncio.sleep(duration)
|
|
31
|
+
#
|
|
32
|
+
# if python_version >= 3.4:
|
|
33
|
+
# @step('a tagged-coroutine async step waits "{duration:f}" seconds')
|
|
34
|
+
# @async_run_until_complete
|
|
35
|
+
# @asyncio.coroutine
|
|
36
|
+
# def step_async_step_waits_seconds2(context, duration):
|
|
37
|
+
# print("async_step2: Should sleep for %.3f seconds" % duration)
|
|
38
|
+
# yield from asyncio.sleep(duration)
|
|
39
|
+
#
|
|
40
|
+
# -----------------------------------------------------------------------------
|
|
41
|
+
# TEST MARKERS:
|
|
42
|
+
# -----------------------------------------------------------------------------
|
|
43
|
+
# xfail = pytest.mark.xfail
|
|
44
|
+
python_version = float("%s.%s" % sys.version_info[:2])
|
|
45
|
+
py35_or_newer = pytest.mark.skipif(python_version < 3.5, reason="Needs Python >= 3.5")
|
|
46
|
+
|
|
47
|
+
# -----------------------------------------------------------------------------
|
|
48
|
+
# TESTSUITE:
|
|
49
|
+
# -----------------------------------------------------------------------------
|
|
50
|
+
@py35_or_newer
|
|
51
|
+
class TestAsyncStepDecorator35(object):
|
|
52
|
+
|
|
53
|
+
def test_step_decorator_async_run_until_complete1(self):
|
|
54
|
+
step_container = SimpleStepContainer()
|
|
55
|
+
with use_step_import_modules(step_container):
|
|
56
|
+
# -- STEP-DEFINITIONS EXAMPLE (as MODULE SNIPPET):
|
|
57
|
+
# VARIANT 1: Use async def step_impl()
|
|
58
|
+
from behave import step
|
|
59
|
+
from behave.api.async_step import async_run_until_complete
|
|
60
|
+
import asyncio
|
|
61
|
+
|
|
62
|
+
@step('an async coroutine step waits "{duration:f}" seconds')
|
|
63
|
+
@async_run_until_complete
|
|
64
|
+
async def step_async_step_waits_seconds(context, duration):
|
|
65
|
+
await asyncio.sleep(duration)
|
|
66
|
+
|
|
67
|
+
# -- USES: async def step_impl(...) as async-step (coroutine)
|
|
68
|
+
AsyncStepTheory.validate(step_async_step_waits_seconds)
|
|
69
|
+
|
|
70
|
+
# -- RUN ASYNC-STEP: Verify that it is behaving correctly.
|
|
71
|
+
# ENSURE: Execution of async-step matches expected duration.
|
|
72
|
+
context = Context(runner=Runner(config={}))
|
|
73
|
+
with StopWatch() as stop_watch:
|
|
74
|
+
step_async_step_waits_seconds(context, 0.2)
|
|
75
|
+
assert abs(stop_watch.duration - 0.2) <= 0.05
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
Unit test facade to protect py.test runner from Python 3.4/3.5 grammar changes.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from __future__ import absolute_import
|
|
7
|
+
import sys
|
|
8
|
+
|
|
9
|
+
python_version = sys.version_info[:2]
|
|
10
|
+
if python_version >= (3, 5):
|
|
11
|
+
# -- PROTECTED-IMPORT:
|
|
12
|
+
# Older Python version have problems with grammer extensions (async/await).
|
|
13
|
+
from ._test_async_step35 import TestAsyncStepDecorator35
|
|
14
|
+
from ._test_async_step34 import TestAsyncStepDecorator34, TestAsyncContext
|
|
15
|
+
elif (3, 4) <= python_version < (3, 5):
|
|
16
|
+
# -- PROTECTED-IMPORT:
|
|
17
|
+
# Older Python version have problems with grammer extensions (yield-from).
|
|
18
|
+
from ._test_async_step34 import TestAsyncStepDecorator34, TestAsyncContext
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
Test support functionality for other tests.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
# -- IMPORTS:
|
|
7
|
+
from __future__ import absolute_import
|
|
8
|
+
from behave.step_registry import StepRegistry
|
|
9
|
+
from behave.matchers import ParseMatcher, CFParseMatcher, RegexMatcher
|
|
10
|
+
import time
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
# -----------------------------------------------------------------------------
|
|
14
|
+
# TEST SUPPORT:
|
|
15
|
+
# -----------------------------------------------------------------------------
|
|
16
|
+
class StopWatch(object):
|
|
17
|
+
def __init__(self):
|
|
18
|
+
self.start_time = None
|
|
19
|
+
self.duration = None
|
|
20
|
+
|
|
21
|
+
def start(self):
|
|
22
|
+
self.start_time = self.now()
|
|
23
|
+
self.duration = None
|
|
24
|
+
|
|
25
|
+
def stop(self):
|
|
26
|
+
self.duration = self.now() - self.start_time
|
|
27
|
+
|
|
28
|
+
@staticmethod
|
|
29
|
+
def now():
|
|
30
|
+
return time.time()
|
|
31
|
+
|
|
32
|
+
@property
|
|
33
|
+
def elapsed(self):
|
|
34
|
+
assert self.start_time is not None
|
|
35
|
+
return self.now() - self.start_time
|
|
36
|
+
|
|
37
|
+
def __enter__(self):
|
|
38
|
+
self.start()
|
|
39
|
+
return self
|
|
40
|
+
|
|
41
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
42
|
+
self.stop()
|
|
43
|
+
|
|
44
|
+
# -- NEEDED-UNTIL: stepimport functionality is completly provided.
|
|
45
|
+
class MatcherFactory(object):
|
|
46
|
+
matcher_mapping = {
|
|
47
|
+
"parse": ParseMatcher,
|
|
48
|
+
"cfparse": CFParseMatcher,
|
|
49
|
+
"re": RegexMatcher,
|
|
50
|
+
}
|
|
51
|
+
default_matcher = ParseMatcher
|
|
52
|
+
|
|
53
|
+
def __init__(self, matcher_mapping=None, default_matcher=None):
|
|
54
|
+
self.matcher_mapping = matcher_mapping or self.matcher_mapping
|
|
55
|
+
self.default_matcher = default_matcher or self.default_matcher
|
|
56
|
+
self.current_matcher = self.default_matcher
|
|
57
|
+
self.type_registry = {}
|
|
58
|
+
# self.type_registry = ParseMatcher.custom_types.copy()
|
|
59
|
+
|
|
60
|
+
def register_type(self, **kwargs):
|
|
61
|
+
self.type_registry.update(**kwargs)
|
|
62
|
+
|
|
63
|
+
def use_step_matcher(self, name):
|
|
64
|
+
self.current_matcher = self.matcher_mapping[name]
|
|
65
|
+
|
|
66
|
+
def use_default_step_matcher(self, name=None):
|
|
67
|
+
if name:
|
|
68
|
+
self.default_matcher = self.matcher_mapping[name]
|
|
69
|
+
self.current_matcher = self.default_matcher
|
|
70
|
+
|
|
71
|
+
def make_matcher(self, func, step_text, step_type=None):
|
|
72
|
+
return self.current_matcher(func, step_text, step_type=step_type,
|
|
73
|
+
custom_types=self.type_registry)
|
|
74
|
+
|
|
75
|
+
def step_matcher(self, name):
|
|
76
|
+
"""
|
|
77
|
+
DEPRECATED, use :method:`~MatcherFactory.use_step_matcher()` instead.
|
|
78
|
+
"""
|
|
79
|
+
# -- BACKWARD-COMPATIBLE NAME: Mark as deprecated.
|
|
80
|
+
import warnings
|
|
81
|
+
warnings.warn("Use 'use_step_matcher()' instead",
|
|
82
|
+
PendingDeprecationWarning, stacklevel=2)
|
|
83
|
+
self.use_step_matcher(name)
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
class SimpleStepContainer(object):
|
|
87
|
+
def __init__(self, step_registry=None):
|
|
88
|
+
if step_registry is None:
|
|
89
|
+
step_registry = StepRegistry()
|
|
90
|
+
matcher_factory = MatcherFactory()
|
|
91
|
+
|
|
92
|
+
self.step_registry = step_registry
|
|
93
|
+
self.step_registry.matcher_factory = matcher_factory
|
|
94
|
+
self.matcher_factory = matcher_factory
|