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,114 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
Provides a formatter that simplifies to rerun the failing scenarios
|
|
4
|
+
of the last test run. It writes a text file with the file locations of
|
|
5
|
+
the failing scenarios, like:
|
|
6
|
+
|
|
7
|
+
# -- file:rerun.features
|
|
8
|
+
# RERUN: Failing scenarios during last test run.
|
|
9
|
+
features/alice.feature:10
|
|
10
|
+
features/alice.feature:42
|
|
11
|
+
features/bob.feature:67
|
|
12
|
+
|
|
13
|
+
To rerun the failing scenarios, use:
|
|
14
|
+
|
|
15
|
+
behave @rerun_failing.features
|
|
16
|
+
|
|
17
|
+
Normally, you put the RerunFormatter into the behave configuration file:
|
|
18
|
+
|
|
19
|
+
# -- file:behave.ini
|
|
20
|
+
[behave]
|
|
21
|
+
format = rerun
|
|
22
|
+
outfiles = rerun_failing.features
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
from __future__ import absolute_import
|
|
26
|
+
from datetime import datetime
|
|
27
|
+
from os.path import relpath
|
|
28
|
+
import os
|
|
29
|
+
from behave.formatter.base import Formatter
|
|
30
|
+
from behave.model_core import Status
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
# -----------------------------------------------------------------------------
|
|
34
|
+
# CLASS: RerunFormatter
|
|
35
|
+
# -----------------------------------------------------------------------------
|
|
36
|
+
class RerunFormatter(Formatter):
|
|
37
|
+
"""
|
|
38
|
+
Provides formatter class that emits a summary which scenarios failed
|
|
39
|
+
during the last test run. This output can be used to rerun the tests
|
|
40
|
+
with the failed scenarios.
|
|
41
|
+
"""
|
|
42
|
+
name = "rerun"
|
|
43
|
+
description = "Emits scenario file locations of failing scenarios"
|
|
44
|
+
|
|
45
|
+
show_timestamp = False
|
|
46
|
+
show_failed_scenarios_descriptions = False
|
|
47
|
+
|
|
48
|
+
def __init__(self, stream_opener, config):
|
|
49
|
+
super(RerunFormatter, self).__init__(stream_opener, config)
|
|
50
|
+
self.failed_scenarios = []
|
|
51
|
+
self.current_feature = None
|
|
52
|
+
|
|
53
|
+
def reset(self):
|
|
54
|
+
self.failed_scenarios = []
|
|
55
|
+
self.current_feature = None
|
|
56
|
+
|
|
57
|
+
# -- FORMATTER API:
|
|
58
|
+
def feature(self, feature):
|
|
59
|
+
self.current_feature = feature
|
|
60
|
+
|
|
61
|
+
def eof(self):
|
|
62
|
+
"""Called at end of a feature."""
|
|
63
|
+
if self.current_feature and self.current_feature.status == Status.failed:
|
|
64
|
+
# -- COLLECT SCENARIO FAILURES:
|
|
65
|
+
for scenario in self.current_feature.walk_scenarios():
|
|
66
|
+
if scenario.status == Status.failed:
|
|
67
|
+
self.failed_scenarios.append(scenario)
|
|
68
|
+
|
|
69
|
+
# -- RESET:
|
|
70
|
+
self.current_feature = None
|
|
71
|
+
assert self.current_feature is None
|
|
72
|
+
|
|
73
|
+
def close(self):
|
|
74
|
+
"""Called at end of test run."""
|
|
75
|
+
stream_name = self.stream_opener.name
|
|
76
|
+
if self.failed_scenarios:
|
|
77
|
+
# -- ENSURE: Output stream is open.
|
|
78
|
+
self.stream = self.open()
|
|
79
|
+
self.report_scenario_failures()
|
|
80
|
+
elif stream_name and os.path.exists(stream_name):
|
|
81
|
+
# -- ON SUCCESS: Remove last rerun file with its failures.
|
|
82
|
+
os.remove(self.stream_opener.name)
|
|
83
|
+
|
|
84
|
+
# -- FINALLY:
|
|
85
|
+
self.close_stream()
|
|
86
|
+
|
|
87
|
+
# -- SPECIFIC-API:
|
|
88
|
+
def report_scenario_failures(self):
|
|
89
|
+
assert self.failed_scenarios
|
|
90
|
+
# -- SECTION: Banner
|
|
91
|
+
message = u"# -- RERUN: %d failing scenarios during last test run.\n"
|
|
92
|
+
self.stream.write(message % len(self.failed_scenarios))
|
|
93
|
+
if self.show_timestamp:
|
|
94
|
+
now = datetime.now().replace(microsecond=0)
|
|
95
|
+
self.stream.write("# NOW: %s\n"% now.isoformat(" "))
|
|
96
|
+
|
|
97
|
+
# -- SECTION: Textual summary in comments.
|
|
98
|
+
if self.show_failed_scenarios_descriptions:
|
|
99
|
+
current_feature = None
|
|
100
|
+
for index, scenario in enumerate(self.failed_scenarios):
|
|
101
|
+
if current_feature != scenario.filename:
|
|
102
|
+
if current_feature is not None:
|
|
103
|
+
self.stream.write(u"#\n")
|
|
104
|
+
current_feature = scenario.filename
|
|
105
|
+
short_filename = relpath(scenario.filename, os.getcwd())
|
|
106
|
+
self.stream.write(u"# %s\n" % short_filename)
|
|
107
|
+
self.stream.write(u"# %4d: %s\n" % \
|
|
108
|
+
(scenario.line, scenario.name))
|
|
109
|
+
self.stream.write("\n")
|
|
110
|
+
|
|
111
|
+
# -- SECTION: Scenario file locations, ala: "alice.feature:10"
|
|
112
|
+
for scenario in self.failed_scenarios:
|
|
113
|
+
self.stream.write(u"%s\n" % scenario.location)
|
|
114
|
+
self.stream.write("\n")
|
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
Provides a formatter that generates Sphinx-based documentation
|
|
4
|
+
of available step definitions (step implementations).
|
|
5
|
+
|
|
6
|
+
TODO:
|
|
7
|
+
* Post-processor for step docstrings.
|
|
8
|
+
* Solution for requires: table, text
|
|
9
|
+
* i18n keywords
|
|
10
|
+
|
|
11
|
+
.. seealso::
|
|
12
|
+
http://sphinx-doc.org/
|
|
13
|
+
|
|
14
|
+
.. note:: REQUIRES docutils
|
|
15
|
+
:mod:`docutils` are needed to generate step-label for step references.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
from __future__ import absolute_import, print_function
|
|
19
|
+
from operator import attrgetter
|
|
20
|
+
import inspect
|
|
21
|
+
import os.path
|
|
22
|
+
import sys
|
|
23
|
+
from behave.formatter.steps import AbstractStepsFormatter
|
|
24
|
+
from behave.formatter import sphinx_util
|
|
25
|
+
from behave.model import Table
|
|
26
|
+
try:
|
|
27
|
+
# -- NEEDED FOR: step-labels (and step-refs)
|
|
28
|
+
from docutils.nodes import fully_normalize_name
|
|
29
|
+
has_docutils = True
|
|
30
|
+
except ImportError:
|
|
31
|
+
has_docutils = False
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
# -----------------------------------------------------------------------------
|
|
35
|
+
# HELPER CLASS:
|
|
36
|
+
# -----------------------------------------------------------------------------
|
|
37
|
+
class StepsModule(object):
|
|
38
|
+
"""
|
|
39
|
+
Value object to keep track of step definitions that belong to same module.
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
def __init__(self, module_name, step_definitions=None):
|
|
43
|
+
self.module_name = module_name
|
|
44
|
+
self.step_definitions = step_definitions or []
|
|
45
|
+
self._name = None
|
|
46
|
+
self._filename = None
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
@property
|
|
50
|
+
def name(self):
|
|
51
|
+
if self._name is None:
|
|
52
|
+
# -- DISCOVER ON DEMAND: From step definitions (module).
|
|
53
|
+
# REQUIRED: To discover complete canonical module name.
|
|
54
|
+
module = self.module
|
|
55
|
+
if module:
|
|
56
|
+
# -- USED-BY: Imported step libraries.
|
|
57
|
+
module_name = self.module.__name__
|
|
58
|
+
else:
|
|
59
|
+
# -- USED-BY: features/steps/*.py (without __init__.py)
|
|
60
|
+
module_name = self.module_name
|
|
61
|
+
self._name = module_name
|
|
62
|
+
return self._name
|
|
63
|
+
|
|
64
|
+
@property
|
|
65
|
+
def filename(self):
|
|
66
|
+
if not self._filename:
|
|
67
|
+
if self.step_definitions:
|
|
68
|
+
filename = inspect.getfile(self.step_definitions[0].func)
|
|
69
|
+
self._filename = os.path.relpath(filename)
|
|
70
|
+
return self._filename
|
|
71
|
+
|
|
72
|
+
@property
|
|
73
|
+
def module(self):
|
|
74
|
+
if self.step_definitions:
|
|
75
|
+
return inspect.getmodule(self.step_definitions[0].func)
|
|
76
|
+
return sys.modules.get(self.module_name)
|
|
77
|
+
|
|
78
|
+
@property
|
|
79
|
+
def module_doc(self):
|
|
80
|
+
module = self.module
|
|
81
|
+
if module:
|
|
82
|
+
return inspect.getdoc(module)
|
|
83
|
+
return None
|
|
84
|
+
|
|
85
|
+
def append(self, step_definition):
|
|
86
|
+
self.step_definitions.append(step_definition)
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
# -----------------------------------------------------------------------------
|
|
90
|
+
# CLASS: SphinxStepsDocumentGenerator
|
|
91
|
+
# -----------------------------------------------------------------------------
|
|
92
|
+
class SphinxStepsDocumentGenerator(object):
|
|
93
|
+
"""
|
|
94
|
+
Provides document generator class that generates Sphinx-based
|
|
95
|
+
documentation for step definitions. The primary purpose is to:
|
|
96
|
+
|
|
97
|
+
* help the step-library provider/writer
|
|
98
|
+
* simplify self-documentation of step-libraries
|
|
99
|
+
|
|
100
|
+
EXAMPLE:
|
|
101
|
+
step_definitions = ... # Collect from step_registry
|
|
102
|
+
doc_generator = SphinxStepsDocumentGenerator(step_definitions, "output")
|
|
103
|
+
doc_generator.write_docs()
|
|
104
|
+
|
|
105
|
+
.. seealso:: http://sphinx-doc.org/
|
|
106
|
+
"""
|
|
107
|
+
default_step_definition_doc = """\
|
|
108
|
+
.. todo::
|
|
109
|
+
Step definition description is missing.
|
|
110
|
+
"""
|
|
111
|
+
shows_step_module_info = True
|
|
112
|
+
shows_step_module_overview = True
|
|
113
|
+
make_step_index_entries = True
|
|
114
|
+
make_step_labels = has_docutils
|
|
115
|
+
|
|
116
|
+
document_separator = "# -- DOCUMENT-END " + "-" * 60
|
|
117
|
+
step_document_prefix = "step_module."
|
|
118
|
+
step_heading_prefix = "**Step:** "
|
|
119
|
+
|
|
120
|
+
def __init__(self, step_definitions, destdir=None, stream=None):
|
|
121
|
+
self.step_definitions = step_definitions
|
|
122
|
+
self.destdir = destdir
|
|
123
|
+
self.stream = stream
|
|
124
|
+
self.document = None
|
|
125
|
+
|
|
126
|
+
@property
|
|
127
|
+
def stdout_mode(self):
|
|
128
|
+
"""
|
|
129
|
+
Indicates that output towards stdout should be used.
|
|
130
|
+
"""
|
|
131
|
+
return self.stream is not None
|
|
132
|
+
|
|
133
|
+
@staticmethod
|
|
134
|
+
def describe_step_definition(step_definition, step_type=None):
|
|
135
|
+
if not step_type:
|
|
136
|
+
step_type = step_definition.step_type or "step"
|
|
137
|
+
|
|
138
|
+
if step_type == "step":
|
|
139
|
+
step_type_text = "Given/When/Then"
|
|
140
|
+
else:
|
|
141
|
+
step_type_text = step_type.capitalize()
|
|
142
|
+
# -- ESCAPE: Some chars required for ReST documents (like backticks)
|
|
143
|
+
step_text = step_definition.string
|
|
144
|
+
if "`" in step_text:
|
|
145
|
+
step_text = step_text.replace("`", r"\`")
|
|
146
|
+
return u"%s %s" % (step_type_text, step_text)
|
|
147
|
+
|
|
148
|
+
def ensure_destdir_exists(self):
|
|
149
|
+
assert self.destdir
|
|
150
|
+
if os.path.isfile(self.destdir):
|
|
151
|
+
print("OOPS: remove %s" % self.destdir)
|
|
152
|
+
os.remove(self.destdir)
|
|
153
|
+
if not os.path.exists(self.destdir):
|
|
154
|
+
os.makedirs(self.destdir)
|
|
155
|
+
|
|
156
|
+
def ensure_document_is_closed(self):
|
|
157
|
+
if self.document and not self.stdout_mode:
|
|
158
|
+
self.document.close()
|
|
159
|
+
self.document = None
|
|
160
|
+
|
|
161
|
+
def discover_step_modules(self):
|
|
162
|
+
step_modules_map = {}
|
|
163
|
+
for step_definition in self.step_definitions:
|
|
164
|
+
assert step_definition.step_type is not None
|
|
165
|
+
step_filename = step_definition.location.filename
|
|
166
|
+
step_module = step_modules_map.get(step_filename, None)
|
|
167
|
+
if not step_module:
|
|
168
|
+
filename = inspect.getfile(step_definition.func)
|
|
169
|
+
module_name = inspect.getmodulename(filename)
|
|
170
|
+
assert module_name, \
|
|
171
|
+
"step_definition: %s" % step_definition.location
|
|
172
|
+
step_module = StepsModule(module_name)
|
|
173
|
+
step_modules_map[step_filename] = step_module
|
|
174
|
+
step_module.append(step_definition)
|
|
175
|
+
|
|
176
|
+
step_modules = sorted(step_modules_map.values(), key=attrgetter("name"))
|
|
177
|
+
for module in step_modules:
|
|
178
|
+
step_definitions = sorted(module.step_definitions,
|
|
179
|
+
key=attrgetter("location"))
|
|
180
|
+
module.step_definitions = step_definitions
|
|
181
|
+
return step_modules
|
|
182
|
+
|
|
183
|
+
def create_document(self, filename):
|
|
184
|
+
if not (filename.endswith(".rst") or filename.endswith(".txt")):
|
|
185
|
+
filename += ".rst"
|
|
186
|
+
if self.stdout_mode:
|
|
187
|
+
stream = self.stream
|
|
188
|
+
document = sphinx_util.DocumentWriter(stream, should_close=False)
|
|
189
|
+
else:
|
|
190
|
+
self.ensure_destdir_exists()
|
|
191
|
+
filename = os.path.join(self.destdir, filename)
|
|
192
|
+
document = sphinx_util.DocumentWriter.open(filename)
|
|
193
|
+
return document
|
|
194
|
+
|
|
195
|
+
def write_docs(self):
|
|
196
|
+
step_modules = self.discover_step_modules()
|
|
197
|
+
self.write_step_module_index(step_modules)
|
|
198
|
+
for step_module in step_modules:
|
|
199
|
+
self.write_step_module(step_module)
|
|
200
|
+
return len(step_modules)
|
|
201
|
+
|
|
202
|
+
def write_step_module_index(self, step_modules, filename="index.rst"):
|
|
203
|
+
document = self.create_document(filename)
|
|
204
|
+
document.write(".. _docid.steps:\n\n")
|
|
205
|
+
document.write_heading("Step Definitions")
|
|
206
|
+
document.write("""\
|
|
207
|
+
The following step definitions are provided here.
|
|
208
|
+
|
|
209
|
+
----
|
|
210
|
+
|
|
211
|
+
""")
|
|
212
|
+
entries = sorted([self.step_document_prefix + module.name
|
|
213
|
+
for module in step_modules])
|
|
214
|
+
document.write_toctree(entries, maxdepth=1)
|
|
215
|
+
document.close()
|
|
216
|
+
if self.stdout_mode:
|
|
217
|
+
sys.stdout.write("\n%s\n" % self.document_separator)
|
|
218
|
+
|
|
219
|
+
def write_step_module(self, step_module):
|
|
220
|
+
self.ensure_document_is_closed()
|
|
221
|
+
document_name = self.step_document_prefix + step_module.name
|
|
222
|
+
self.document = self.create_document(document_name)
|
|
223
|
+
self.document.write(".. _docid.steps.%s:\n" % step_module.name)
|
|
224
|
+
self.document.write_heading(step_module.name, index_id=step_module.name)
|
|
225
|
+
if self.shows_step_module_info:
|
|
226
|
+
self.document.write(":Module: %s\n" % step_module.name)
|
|
227
|
+
self.document.write(":Filename: %s\n" % step_module.filename)
|
|
228
|
+
self.document.write("\n")
|
|
229
|
+
if step_module.module_doc:
|
|
230
|
+
module_doc = step_module.module_doc.strip()
|
|
231
|
+
self.document.write("%s\n\n" % module_doc)
|
|
232
|
+
if self.shows_step_module_overview:
|
|
233
|
+
self.document.write_heading("Step Overview", level=1)
|
|
234
|
+
self.write_step_module_overview(step_module.step_definitions)
|
|
235
|
+
|
|
236
|
+
self.document.write_heading("Step Definitions", level=1)
|
|
237
|
+
for step_definition in step_module.step_definitions:
|
|
238
|
+
self.write_step_definition(step_definition)
|
|
239
|
+
|
|
240
|
+
# -- FINALLY: Clean up resources.
|
|
241
|
+
self.document.close()
|
|
242
|
+
self.document = None
|
|
243
|
+
if self.stdout_mode:
|
|
244
|
+
sys.stdout.write("\n%s\n" % self.document_separator)
|
|
245
|
+
|
|
246
|
+
def write_step_module_overview(self, step_definitions):
|
|
247
|
+
assert self.document
|
|
248
|
+
headings = [u"Step Definition", u"Given", u"When", u"Then", u"Step"]
|
|
249
|
+
table = Table(headings)
|
|
250
|
+
step_type_cols = {
|
|
251
|
+
# -- pylint: disable=bad-whitespace
|
|
252
|
+
"given": [u" x", u" ", u" ", u" "],
|
|
253
|
+
"when": [u" ", u" x", u" ", u" "],
|
|
254
|
+
"then": [u" ", u" ", u" x", u" "],
|
|
255
|
+
"step": [u" x", u" x", u" x", u" x"],
|
|
256
|
+
}
|
|
257
|
+
for step_definition in step_definitions:
|
|
258
|
+
row = [self.describe_step_definition(step_definition)]
|
|
259
|
+
row.extend(step_type_cols[step_definition.step_type])
|
|
260
|
+
table.add_row(row)
|
|
261
|
+
self.document.write_table(table)
|
|
262
|
+
|
|
263
|
+
@staticmethod
|
|
264
|
+
def make_step_definition_index_id(step_definition):
|
|
265
|
+
if step_definition.step_type == "step":
|
|
266
|
+
index_kinds = ("Given", "When", "Then", "Step")
|
|
267
|
+
else:
|
|
268
|
+
keyword = step_definition.step_type.capitalize()
|
|
269
|
+
index_kinds = (keyword,)
|
|
270
|
+
|
|
271
|
+
schema = "single: %s%s; %s %s"
|
|
272
|
+
index_parts = []
|
|
273
|
+
for index_kind in index_kinds:
|
|
274
|
+
keyword = index_kind
|
|
275
|
+
word = " step"
|
|
276
|
+
if index_kind == "Step":
|
|
277
|
+
keyword = "Given/When/Then"
|
|
278
|
+
word = ""
|
|
279
|
+
part = schema % (index_kind, word, keyword, step_definition.string)
|
|
280
|
+
index_parts.append(part)
|
|
281
|
+
joiner = "\n "
|
|
282
|
+
return joiner + joiner.join(index_parts)
|
|
283
|
+
|
|
284
|
+
def make_step_definition_doc(self, step_definition):
|
|
285
|
+
doc = inspect.getdoc(step_definition.func)
|
|
286
|
+
if not doc:
|
|
287
|
+
doc = self.default_step_definition_doc
|
|
288
|
+
doc = doc.strip()
|
|
289
|
+
return doc
|
|
290
|
+
|
|
291
|
+
def write_step_definition(self, step_definition):
|
|
292
|
+
assert self.document
|
|
293
|
+
step_text = self.describe_step_definition(step_definition)
|
|
294
|
+
if step_text.startswith("* "):
|
|
295
|
+
step_text = step_text[2:]
|
|
296
|
+
index_id = None
|
|
297
|
+
if self.make_step_index_entries:
|
|
298
|
+
index_id = self.make_step_definition_index_id(step_definition)
|
|
299
|
+
|
|
300
|
+
heading = step_text
|
|
301
|
+
step_label = None
|
|
302
|
+
if self.step_heading_prefix:
|
|
303
|
+
heading = self.step_heading_prefix + step_text
|
|
304
|
+
if has_docutils and self.make_step_labels:
|
|
305
|
+
# -- ADD STEP-LABEL (supports: step-refs by name)
|
|
306
|
+
# EXAMPLE: See also :ref:`When my step does "{something}"`.
|
|
307
|
+
step_label = fully_normalize_name(step_text)
|
|
308
|
+
# SKIP-HERE: self.document.write(".. _%s:\n\n" % step_label)
|
|
309
|
+
self.document.write_heading(heading, level=2, index_id=index_id,
|
|
310
|
+
label=step_label)
|
|
311
|
+
step_definition_doc = self.make_step_definition_doc(step_definition)
|
|
312
|
+
self.document.write("%s\n" % step_definition_doc)
|
|
313
|
+
self.document.write("\n")
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
# -----------------------------------------------------------------------------
|
|
318
|
+
# CLASS: SphinxStepsFormatter
|
|
319
|
+
# -----------------------------------------------------------------------------
|
|
320
|
+
class SphinxStepsFormatter(AbstractStepsFormatter):
|
|
321
|
+
"""
|
|
322
|
+
Provides formatter class that generates Sphinx-based documentation
|
|
323
|
+
for all registered step definitions. The primary purpose is to:
|
|
324
|
+
|
|
325
|
+
* help the step-library provider/writer
|
|
326
|
+
* simplify self-documentation of step-libraries
|
|
327
|
+
|
|
328
|
+
.. note::
|
|
329
|
+
Supports dry-run mode.
|
|
330
|
+
Supports destination directory mode to write multiple documents.
|
|
331
|
+
"""
|
|
332
|
+
name = "sphinx.steps"
|
|
333
|
+
description = "Generate sphinx-based documentation for step definitions."
|
|
334
|
+
doc_generator_class = SphinxStepsDocumentGenerator
|
|
335
|
+
|
|
336
|
+
def __init__(self, stream_opener, config):
|
|
337
|
+
super(SphinxStepsFormatter, self).__init__(stream_opener, config)
|
|
338
|
+
self.destdir = stream_opener.name
|
|
339
|
+
|
|
340
|
+
@property
|
|
341
|
+
def step_definitions(self):
|
|
342
|
+
"""
|
|
343
|
+
Derive step definitions from step-registry.
|
|
344
|
+
"""
|
|
345
|
+
steps = []
|
|
346
|
+
for step_type, step_definitions in self.step_registry.steps.items():
|
|
347
|
+
for step_definition in step_definitions:
|
|
348
|
+
step_definition.step_type = step_type
|
|
349
|
+
steps.append(step_definition)
|
|
350
|
+
return steps
|
|
351
|
+
|
|
352
|
+
# -- FORMATTER-API:
|
|
353
|
+
def close(self):
|
|
354
|
+
"""Called at end of test run."""
|
|
355
|
+
if not self.step_registry:
|
|
356
|
+
self.discover_step_definitions()
|
|
357
|
+
self.report()
|
|
358
|
+
|
|
359
|
+
# -- SPECIFIC-API:
|
|
360
|
+
def create_document_generator(self):
|
|
361
|
+
generator_class = self.doc_generator_class
|
|
362
|
+
if self.stdout_mode:
|
|
363
|
+
return generator_class(self.step_definitions, stream=self.stream)
|
|
364
|
+
else:
|
|
365
|
+
return generator_class(self.step_definitions, destdir=self.destdir)
|
|
366
|
+
|
|
367
|
+
def report(self):
|
|
368
|
+
document_generator = self.create_document_generator()
|
|
369
|
+
document_counts = document_generator.write_docs()
|
|
370
|
+
if not self.stdout_mode:
|
|
371
|
+
msg = "%s: Written %s document(s) into directory '%s'.\n"
|
|
372
|
+
sys.stdout.write(msg % (self.name, document_counts, self.destdir))
|