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,147 @@
|
|
|
1
|
+
# -*- coding -*-
|
|
2
|
+
"""
|
|
3
|
+
Provides some command utility functions.
|
|
4
|
+
|
|
5
|
+
TODO:
|
|
6
|
+
matcher that ignores empty lines and whitespace and has contains comparison
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import absolute_import, print_function
|
|
10
|
+
from behave4cmd0 import pathutil
|
|
11
|
+
from behave4cmd0.__setup import TOP, TOPA
|
|
12
|
+
import os.path
|
|
13
|
+
import sys
|
|
14
|
+
import shutil
|
|
15
|
+
import time
|
|
16
|
+
import tempfile
|
|
17
|
+
from fnmatch import fnmatch
|
|
18
|
+
|
|
19
|
+
# -----------------------------------------------------------------------------
|
|
20
|
+
# CONSTANTS:
|
|
21
|
+
# -----------------------------------------------------------------------------
|
|
22
|
+
# HERE = os.path.dirname(__file__)
|
|
23
|
+
# TOP = os.path.join(HERE, "..")
|
|
24
|
+
# TOPA = os.path.abspath(TOP)
|
|
25
|
+
WORKDIR = os.path.join(TOP, "__WORKDIR__")
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
# -----------------------------------------------------------------------------
|
|
29
|
+
# UTILITY FUNCTIONS:
|
|
30
|
+
# -----------------------------------------------------------------------------
|
|
31
|
+
def workdir_save_coverage_files(workdir, destdir=None):
|
|
32
|
+
assert os.path.isdir(workdir)
|
|
33
|
+
if not destdir:
|
|
34
|
+
destdir = TOPA
|
|
35
|
+
if os.path.abspath(workdir) == os.path.abspath(destdir):
|
|
36
|
+
return # -- SKIP: Source directory is destination directory (SAME).
|
|
37
|
+
|
|
38
|
+
for fname in os.listdir(workdir):
|
|
39
|
+
if fnmatch(fname, ".coverage.*"):
|
|
40
|
+
# -- MOVE COVERAGE FILES:
|
|
41
|
+
sourcename = os.path.join(workdir, fname)
|
|
42
|
+
shutil.move(sourcename, destdir)
|
|
43
|
+
|
|
44
|
+
# def ensure_directory_exists(dirname):
|
|
45
|
+
# """
|
|
46
|
+
# Ensures that a directory exits.
|
|
47
|
+
# If it does not exist, it is automatically created.
|
|
48
|
+
# """
|
|
49
|
+
# if not os.path.exists(dirname):
|
|
50
|
+
# os.makedirs(dirname)
|
|
51
|
+
# assert os.path.exists(dirname)
|
|
52
|
+
# assert os.path.isdir(dirname)
|
|
53
|
+
|
|
54
|
+
def ensure_context_attribute_exists(context, name, default_value=None):
|
|
55
|
+
"""
|
|
56
|
+
Ensure a behave resource exists as attribute in the behave context.
|
|
57
|
+
If this is not the case, the attribute is created by using the default_value.
|
|
58
|
+
"""
|
|
59
|
+
if not hasattr(context, name):
|
|
60
|
+
setattr(context, name, default_value)
|
|
61
|
+
|
|
62
|
+
def ensure_workdir_exists(context):
|
|
63
|
+
"""
|
|
64
|
+
Ensures that the work directory exists.
|
|
65
|
+
In addition, the location of the workdir is stored as attribute in
|
|
66
|
+
the context object.
|
|
67
|
+
"""
|
|
68
|
+
ensure_context_attribute_exists(context, "workdir", None)
|
|
69
|
+
if not context.workdir:
|
|
70
|
+
context.workdir = os.path.abspath(WORKDIR)
|
|
71
|
+
pathutil.ensure_directory_exists(context.workdir)
|
|
72
|
+
|
|
73
|
+
def ensure_workdir_not_exists(context):
|
|
74
|
+
"""Ensures that the work directory does not exist."""
|
|
75
|
+
ensure_context_attribute_exists(context, "workdir", None)
|
|
76
|
+
if context.workdir:
|
|
77
|
+
orig_dirname = real_dirname = context.workdir
|
|
78
|
+
context.workdir = None
|
|
79
|
+
if os.path.exists(real_dirname):
|
|
80
|
+
renamed_dirname = tempfile.mktemp(prefix=os.path.basename(real_dirname),
|
|
81
|
+
suffix="_DEAD",
|
|
82
|
+
dir=os.path.dirname(real_dirname) or ".")
|
|
83
|
+
os.rename(real_dirname, renamed_dirname)
|
|
84
|
+
real_dirname = renamed_dirname
|
|
85
|
+
max_iterations = 2
|
|
86
|
+
if sys.platform.startswith("win"):
|
|
87
|
+
max_iterations = 15
|
|
88
|
+
|
|
89
|
+
for iteration in range(max_iterations):
|
|
90
|
+
if not os.path.exists(real_dirname):
|
|
91
|
+
if iteration > 1:
|
|
92
|
+
print("REMOVE-WORKDIR after %s iterations" % (iteration+1))
|
|
93
|
+
break
|
|
94
|
+
shutil.rmtree(real_dirname, ignore_errors=True)
|
|
95
|
+
time.sleep(0.5)
|
|
96
|
+
assert not os.path.isdir(real_dirname), "ENSURE not-isa dir: %s" % real_dirname
|
|
97
|
+
assert not os.path.exists(real_dirname), "ENSURE dir not-exists: %s" % real_dirname
|
|
98
|
+
assert not os.path.isdir(orig_dirname), "ENSURE not-isa dir: %s" % orig_dirname
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
# def create_textfile_with_contents(filename, contents):
|
|
102
|
+
# """
|
|
103
|
+
# Creates a textual file with the provided contents in the workdir.
|
|
104
|
+
# Overwrites an existing file.
|
|
105
|
+
# """
|
|
106
|
+
# ensure_directory_exists(os.path.dirname(filename))
|
|
107
|
+
# if os.path.exists(filename):
|
|
108
|
+
# os.remove(filename)
|
|
109
|
+
# outstream = open(filename, "w")
|
|
110
|
+
# outstream.write(contents)
|
|
111
|
+
# if not contents.endswith("\n"):
|
|
112
|
+
# outstream.write("\n")
|
|
113
|
+
# outstream.flush()
|
|
114
|
+
# outstream.close()
|
|
115
|
+
# assert os.path.exists(filename)
|
|
116
|
+
|
|
117
|
+
# def text_remove_empty_lines(text):
|
|
118
|
+
# """
|
|
119
|
+
# Whitespace normalization:
|
|
120
|
+
# - Strip empty lines
|
|
121
|
+
# - Strip trailing whitespace
|
|
122
|
+
# """
|
|
123
|
+
# lines = [ line.rstrip() for line in text.splitlines() if line.strip() ]
|
|
124
|
+
# return "\n".join(lines)
|
|
125
|
+
#
|
|
126
|
+
# def text_normalize(text):
|
|
127
|
+
# """
|
|
128
|
+
# Whitespace normalization:
|
|
129
|
+
# - Strip empty lines
|
|
130
|
+
# - Strip leading whitespace in a line
|
|
131
|
+
# - Strip trailing whitespace in a line
|
|
132
|
+
# - Normalize line endings
|
|
133
|
+
# """
|
|
134
|
+
# lines = [ line.strip() for line in text.splitlines() if line.strip() ]
|
|
135
|
+
# return "\n".join(lines)
|
|
136
|
+
|
|
137
|
+
# def posixpath_normpath(pathname):
|
|
138
|
+
# """
|
|
139
|
+
# Convert path into POSIX path:
|
|
140
|
+
# - Normalize path
|
|
141
|
+
# - Replace backslash with slash
|
|
142
|
+
# """
|
|
143
|
+
# backslash = '\\'
|
|
144
|
+
# pathname = os.path.normpath(pathname)
|
|
145
|
+
# if backslash in pathname:
|
|
146
|
+
# pathname = pathname.replace(backslash, '/')
|
|
147
|
+
# return pathname
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
Generic failing steps.
|
|
4
|
+
Often needed in examples.
|
|
5
|
+
|
|
6
|
+
EXAMPLES:
|
|
7
|
+
|
|
8
|
+
Given a step fails
|
|
9
|
+
When another step fails
|
|
10
|
+
Then a step fails
|
|
11
|
+
|
|
12
|
+
Given ...
|
|
13
|
+
When ...
|
|
14
|
+
Then it should fail because "the person is unknown".
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from __future__ import absolute_import
|
|
18
|
+
from behave import step, then
|
|
19
|
+
|
|
20
|
+
# -----------------------------------------------------------------------------
|
|
21
|
+
# STEPS FOR: failing
|
|
22
|
+
# -----------------------------------------------------------------------------
|
|
23
|
+
@step(u'{word:w} step fails')
|
|
24
|
+
def step_fails(context, word):
|
|
25
|
+
"""Step that always fails, mostly needed in examples."""
|
|
26
|
+
assert False, "EXPECT: Failing step"
|
|
27
|
+
|
|
28
|
+
@step(u'{word:w} step fails with "{message}"')
|
|
29
|
+
def step_fails_with_message(context, word, message):
|
|
30
|
+
"""Step that always fails, mostly needed in examples."""
|
|
31
|
+
assert False, "FAILED: %s" % message
|
|
32
|
+
|
|
33
|
+
@step(u'{word:w} step fails with')
|
|
34
|
+
def step_fails_with_text(context, word):
|
|
35
|
+
"""Step that always fails, mostly needed in examples."""
|
|
36
|
+
assert context.text is not None, "REQUIRE: text"
|
|
37
|
+
step_fails_with_message(context, word, context.text)
|
|
38
|
+
|
|
39
|
+
@then(u'it should fail because "{reason}"')
|
|
40
|
+
def then_it_should_fail_because(context, reason):
|
|
41
|
+
"""Self documenting step that indicates why this step should fail."""
|
|
42
|
+
assert False, "FAILED: %s" % reason
|
|
43
|
+
|
|
44
|
+
# @step(u'an error should fail because "{reason}"')
|
|
45
|
+
# def then_it_should_fail_because(context, reason):
|
|
46
|
+
# """
|
|
47
|
+
# Self documenting step that indicates why this step should fail.
|
|
48
|
+
# """
|
|
49
|
+
# assert False, reason
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__author__ = 'jens'
|
|
@@ -0,0 +1,395 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
Provides step definitions to perform tests with the Python logging subsystem.
|
|
4
|
+
|
|
5
|
+
.. code-block: gherkin
|
|
6
|
+
|
|
7
|
+
Given I create log records with:
|
|
8
|
+
| category | level | message |
|
|
9
|
+
| foo.bar | WARN | Hello LogRecord |
|
|
10
|
+
| bar | CURRENT | Hello LogRecord |
|
|
11
|
+
And I create a log record with:
|
|
12
|
+
| category | level | message |
|
|
13
|
+
| foo | ERROR | Hello Foo |
|
|
14
|
+
Then the command output should contain the following log records:
|
|
15
|
+
| category | level | message |
|
|
16
|
+
| bar | CURRENT | xxx |
|
|
17
|
+
Then the command output should not contain the following log records:
|
|
18
|
+
| category | level | message |
|
|
19
|
+
| bar | CURRENT | xxx |
|
|
20
|
+
Then the file "behave.log" should contain the log records:
|
|
21
|
+
| category | level | message |
|
|
22
|
+
| bar | CURRENT | xxx |
|
|
23
|
+
Then the file "behave.log" should not contain the log records:
|
|
24
|
+
| category | level | message |
|
|
25
|
+
| bar | CURRENT | xxx |
|
|
26
|
+
|
|
27
|
+
Given I define the log record schema:
|
|
28
|
+
| category | level | message |
|
|
29
|
+
| root | INFO | Hello LogRecord |
|
|
30
|
+
And I create log records with:
|
|
31
|
+
| category | level | message |
|
|
32
|
+
| foo.bar | INFO | Hello LogRecord |
|
|
33
|
+
| bar | INFO | Hello LogRecord |
|
|
34
|
+
Then the command output should contain log records from categories
|
|
35
|
+
| category |
|
|
36
|
+
| foo.bar |
|
|
37
|
+
| bar |
|
|
38
|
+
|
|
39
|
+
Given I use the log record configuration:
|
|
40
|
+
| property | value |
|
|
41
|
+
| format | LOG.%(levelname)-8s %(name)s %(message)s |
|
|
42
|
+
| datefmt | |
|
|
43
|
+
|
|
44
|
+
IDEA:
|
|
45
|
+
|
|
46
|
+
.. code-block:: gherkin
|
|
47
|
+
|
|
48
|
+
Given I capture log records
|
|
49
|
+
When I create log records with:
|
|
50
|
+
| category | level | message |
|
|
51
|
+
| foo.bar | WARN | Hello LogRecord |
|
|
52
|
+
Then the captured log should contain the following log records:
|
|
53
|
+
| category | level | message |
|
|
54
|
+
| bar | CURRENT | xxx |
|
|
55
|
+
And the captured log should not contain the following log records:
|
|
56
|
+
| category | level | message |
|
|
57
|
+
| bar | CURRENT | xxx |
|
|
58
|
+
"""
|
|
59
|
+
|
|
60
|
+
from __future__ import absolute_import
|
|
61
|
+
from behave import given, when, then, step
|
|
62
|
+
from behave4cmd0.command_steps import \
|
|
63
|
+
step_file_should_contain_multiline_text, \
|
|
64
|
+
step_file_should_not_contain_multiline_text
|
|
65
|
+
from behave.configuration import LogLevel
|
|
66
|
+
from behave.log_capture import LoggingCapture
|
|
67
|
+
import logging
|
|
68
|
+
|
|
69
|
+
# -----------------------------------------------------------------------------
|
|
70
|
+
# STEP UTILS:
|
|
71
|
+
# -----------------------------------------------------------------------------
|
|
72
|
+
def make_log_record(category, level, message):
|
|
73
|
+
if category in ("root", "__ROOT__"):
|
|
74
|
+
category = None
|
|
75
|
+
logger = logging.getLogger(category)
|
|
76
|
+
logger.log(level, message)
|
|
77
|
+
|
|
78
|
+
def make_log_record_output(category, level, message,
|
|
79
|
+
format=None, datefmt=None, **kwargs):
|
|
80
|
+
"""
|
|
81
|
+
Create the output for a log record, like performed by :mod:`logging` module.
|
|
82
|
+
|
|
83
|
+
:param category: Name of the logger (as string or None).
|
|
84
|
+
:param level: Log level (as number).
|
|
85
|
+
:param message: Log message to use.
|
|
86
|
+
:returns: Log record output (as string)
|
|
87
|
+
"""
|
|
88
|
+
if not category or (category == "__ROOT__"):
|
|
89
|
+
category = "root"
|
|
90
|
+
levelname = logging.getLevelName(level)
|
|
91
|
+
record_data = dict(name=category, levelname=levelname, msg=message)
|
|
92
|
+
record_data.update(kwargs)
|
|
93
|
+
record = logging.makeLogRecord(record_data)
|
|
94
|
+
formatter = logging.Formatter(format, datefmt=datefmt)
|
|
95
|
+
return formatter.format(record)
|
|
96
|
+
|
|
97
|
+
class LogRecordTable(object):
|
|
98
|
+
|
|
99
|
+
@classmethod
|
|
100
|
+
def make_output_for_row(cls, row, format=None, datefmt=None, **kwargs):
|
|
101
|
+
category = row.get("category", None)
|
|
102
|
+
level = LogLevel.parse_type(row.get("level", "INFO"))
|
|
103
|
+
message = row.get("message", "__UNDEFINED__")
|
|
104
|
+
return make_log_record_output(category, level, message,
|
|
105
|
+
format, datefmt, **kwargs)
|
|
106
|
+
|
|
107
|
+
@staticmethod
|
|
108
|
+
def annotate_with_row_schema(table, row_schema):
|
|
109
|
+
"""
|
|
110
|
+
Annotate/extend a table of log-records with additional columns from
|
|
111
|
+
the log-record schema if columns are missing.
|
|
112
|
+
|
|
113
|
+
:param table: Table w/ log-records (as :class:`behave.model.Table`)
|
|
114
|
+
:param row_schema: Log-record row schema (as dict).
|
|
115
|
+
"""
|
|
116
|
+
for column, value in row_schema.items():
|
|
117
|
+
if column not in table.headings:
|
|
118
|
+
table.add_column(column, default_value=value)
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
# -----------------------------------------------------------------------------
|
|
122
|
+
# STEP DEFINITIONS:
|
|
123
|
+
# -----------------------------------------------------------------------------
|
|
124
|
+
# @step('I create log records for the following categories')
|
|
125
|
+
# def step_I_create_logrecords_for_categories_with_text(context):
|
|
126
|
+
# assert context.text is not None, "REQUIRE: context.text"
|
|
127
|
+
# current_level = context.config.logging_level
|
|
128
|
+
# categories = context.text.split()
|
|
129
|
+
# for category_name in categories:
|
|
130
|
+
# logger = logging.getLogger(category_name)
|
|
131
|
+
# logger.log(current_level, "__LOG_RECORD__")
|
|
132
|
+
|
|
133
|
+
@step('I create log records with')
|
|
134
|
+
def step_I_create_logrecords_with_table(context):
|
|
135
|
+
"""
|
|
136
|
+
Step definition that creates one more log records by using a table.
|
|
137
|
+
|
|
138
|
+
.. code-block: gherkin
|
|
139
|
+
|
|
140
|
+
When I create log records with:
|
|
141
|
+
| category | level | message |
|
|
142
|
+
| foo | ERROR | Hello Foo |
|
|
143
|
+
| foo.bar | WARN | Hello Foo.Bar |
|
|
144
|
+
|
|
145
|
+
Table description
|
|
146
|
+
------------------
|
|
147
|
+
|
|
148
|
+
| Column | Type | Required | Description |
|
|
149
|
+
| category | string | yes | Category (or logger) to use. |
|
|
150
|
+
| level | LogLevel | yes | Log level to use. |
|
|
151
|
+
| message | string | yes | Log message to use. |
|
|
152
|
+
|
|
153
|
+
.. code-block: python
|
|
154
|
+
|
|
155
|
+
import logging
|
|
156
|
+
from behave.configuration import LogLevel
|
|
157
|
+
for row in table.rows:
|
|
158
|
+
logger = logging.getLogger(row.category)
|
|
159
|
+
level = LogLevel.parse_type(row.level)
|
|
160
|
+
logger.log(level, row.message)
|
|
161
|
+
"""
|
|
162
|
+
assert context.table, "REQUIRE: context.table"
|
|
163
|
+
context.table.require_columns(["category", "level", "message"])
|
|
164
|
+
for row in context.table.rows:
|
|
165
|
+
category = row["category"]
|
|
166
|
+
if category == "__ROOT__":
|
|
167
|
+
category = None
|
|
168
|
+
level = LogLevel.parse_type(row["level"])
|
|
169
|
+
message = row["message"]
|
|
170
|
+
make_log_record(category, level, message)
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
@step('I create a log record with')
|
|
174
|
+
def step_I_create_logrecord_with_table(context):
|
|
175
|
+
"""
|
|
176
|
+
Create an log record by using a table to provide the parts.
|
|
177
|
+
|
|
178
|
+
.. seealso: :func:`step_I_create_logrecords_with_table()`
|
|
179
|
+
"""
|
|
180
|
+
assert context.table, "REQUIRE: context.table"
|
|
181
|
+
assert len(context.table.rows) == 1, "REQUIRE: table.row.size == 1"
|
|
182
|
+
step_I_create_logrecords_with_table(context)
|
|
183
|
+
|
|
184
|
+
@step('I define the log record schema')
|
|
185
|
+
def step_I_define_logrecord_schema_with_table(context):
|
|
186
|
+
assert context.table, "REQUIRE: context.table"
|
|
187
|
+
context.table.require_columns(["category", "level", "message"])
|
|
188
|
+
assert len(context.table.rows) == 1, \
|
|
189
|
+
"REQUIRE: context.table.rows.size(%s) == 1" % (len(context.table.rows))
|
|
190
|
+
|
|
191
|
+
row = context.table.rows[0]
|
|
192
|
+
row_schema = dict(category=row["category"], level=row["level"],
|
|
193
|
+
message=row["message"])
|
|
194
|
+
context.log_record_row_schema = row_schema
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
@then('the command output should contain the following log records')
|
|
198
|
+
def step_command_output_should_contain_log_records(context):
|
|
199
|
+
"""
|
|
200
|
+
Verifies that the command output contains the specified log records
|
|
201
|
+
(in any order).
|
|
202
|
+
|
|
203
|
+
.. code-block: gherkin
|
|
204
|
+
|
|
205
|
+
Then the command output should contain the following log records:
|
|
206
|
+
| category | level | message |
|
|
207
|
+
| bar | CURRENT | xxx |
|
|
208
|
+
"""
|
|
209
|
+
assert context.table, "REQUIRE: context.table"
|
|
210
|
+
context.table.require_columns(["category", "level", "message"])
|
|
211
|
+
format = getattr(context, "log_record_format", context.config.logging_format)
|
|
212
|
+
for row in context.table.rows:
|
|
213
|
+
output = LogRecordTable.make_output_for_row(row, format)
|
|
214
|
+
context.execute_steps(u'''
|
|
215
|
+
Then the command output should contain:
|
|
216
|
+
"""
|
|
217
|
+
{expected_output}
|
|
218
|
+
"""
|
|
219
|
+
'''.format(expected_output=output))
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
@then('the command output should not contain the following log records')
|
|
223
|
+
def step_command_output_should_not_contain_log_records(context):
|
|
224
|
+
"""
|
|
225
|
+
Verifies that the command output contains the specified log records
|
|
226
|
+
(in any order).
|
|
227
|
+
|
|
228
|
+
.. code-block: gherkin
|
|
229
|
+
|
|
230
|
+
Then the command output should contain the following log records:
|
|
231
|
+
| category | level | message |
|
|
232
|
+
| bar | CURRENT | xxx |
|
|
233
|
+
"""
|
|
234
|
+
assert context.table, "REQUIRE: context.table"
|
|
235
|
+
context.table.require_columns(["category", "level", "message"])
|
|
236
|
+
format = getattr(context, "log_record_format", context.config.logging_format)
|
|
237
|
+
for row in context.table.rows:
|
|
238
|
+
output = LogRecordTable.make_output_for_row(row, format)
|
|
239
|
+
context.execute_steps(u'''
|
|
240
|
+
Then the command output should not contain:
|
|
241
|
+
"""
|
|
242
|
+
{expected_output}
|
|
243
|
+
"""
|
|
244
|
+
'''.format(expected_output=output))
|
|
245
|
+
|
|
246
|
+
@then('the command output should contain the following log record')
|
|
247
|
+
def step_command_output_should_contain_log_record(context):
|
|
248
|
+
assert context.table, "REQUIRE: context.table"
|
|
249
|
+
assert len(context.table.rows) == 1, "REQUIRE: table.row.size == 1"
|
|
250
|
+
step_command_output_should_contain_log_records(context)
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
@then('the command output should not contain the following log record')
|
|
254
|
+
def step_command_output_should_not_contain_log_record(context):
|
|
255
|
+
assert context.table, "REQUIRE: context.table"
|
|
256
|
+
assert len(context.table.rows) == 1, "REQUIRE: table.row.size == 1"
|
|
257
|
+
step_command_output_should_not_contain_log_records(context)
|
|
258
|
+
|
|
259
|
+
@then('the command output should contain log records from categories')
|
|
260
|
+
def step_command_output_should_contain_log_records_from_categories(context):
|
|
261
|
+
"""
|
|
262
|
+
Verifies that the command output contains the specified log records
|
|
263
|
+
(in any order).
|
|
264
|
+
|
|
265
|
+
.. code-block: gherkin
|
|
266
|
+
|
|
267
|
+
Given I define a log record schema:
|
|
268
|
+
| category | level | message |
|
|
269
|
+
| root | ERROR | __LOG_MESSAGE__ |
|
|
270
|
+
Then the command output should contain log records from categories:
|
|
271
|
+
| category |
|
|
272
|
+
| bar |
|
|
273
|
+
"""
|
|
274
|
+
assert context.table, "REQUIRE: context.table"
|
|
275
|
+
context.table.require_column("category")
|
|
276
|
+
record_schema = context.log_record_row_schema
|
|
277
|
+
LogRecordTable.annotate_with_row_schema(context.table, record_schema)
|
|
278
|
+
step_command_output_should_contain_log_records(context)
|
|
279
|
+
context.table.remove_columns(["level", "message"])
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
@then('the command output should not contain log records from categories')
|
|
283
|
+
def step_command_output_should_not_contain_log_records_from_categories(context):
|
|
284
|
+
"""
|
|
285
|
+
Verifies that the command output contains not log records from
|
|
286
|
+
the provided log categories (in any order).
|
|
287
|
+
|
|
288
|
+
.. code-block: gherkin
|
|
289
|
+
|
|
290
|
+
Given I define the log record schema:
|
|
291
|
+
| category | level | message |
|
|
292
|
+
| root | ERROR | __LOG_MESSAGE__ |
|
|
293
|
+
Then the command output should not contain log records from categories:
|
|
294
|
+
| category |
|
|
295
|
+
| bar |
|
|
296
|
+
"""
|
|
297
|
+
assert context.table, "REQUIRE: context.table"
|
|
298
|
+
context.table.require_column("category")
|
|
299
|
+
record_schema = context.log_record_row_schema
|
|
300
|
+
LogRecordTable.annotate_with_row_schema(context.table, record_schema)
|
|
301
|
+
step_command_output_should_not_contain_log_records(context)
|
|
302
|
+
context.table.remove_columns(["level", "message"])
|
|
303
|
+
|
|
304
|
+
@then('the file "{filename}" should contain the log records')
|
|
305
|
+
def step_file_should_contain_log_records(context, filename):
|
|
306
|
+
"""
|
|
307
|
+
Verifies that the command output contains the specified log records
|
|
308
|
+
(in any order).
|
|
309
|
+
|
|
310
|
+
.. code-block: gherkin
|
|
311
|
+
|
|
312
|
+
Then the file "xxx.log" should contain the log records:
|
|
313
|
+
| category | level | message |
|
|
314
|
+
| bar | CURRENT | xxx |
|
|
315
|
+
"""
|
|
316
|
+
assert context.table, "REQUIRE: context.table"
|
|
317
|
+
context.table.require_columns(["category", "level", "message"])
|
|
318
|
+
format = getattr(context, "log_record_format", context.config.logging_format)
|
|
319
|
+
for row in context.table.rows:
|
|
320
|
+
output = LogRecordTable.make_output_for_row(row, format)
|
|
321
|
+
context.text = output
|
|
322
|
+
step_file_should_contain_multiline_text(context, filename)
|
|
323
|
+
|
|
324
|
+
@then('the file "{filename}" should not contain the log records')
|
|
325
|
+
def step_file_should_not_contain_log_records(context, filename):
|
|
326
|
+
"""
|
|
327
|
+
Verifies that the command output contains the specified log records
|
|
328
|
+
(in any order).
|
|
329
|
+
|
|
330
|
+
.. code-block: gherkin
|
|
331
|
+
|
|
332
|
+
Then the file "xxx.log" should not contain the log records:
|
|
333
|
+
| category | level | message |
|
|
334
|
+
| bar | CURRENT | xxx |
|
|
335
|
+
"""
|
|
336
|
+
assert context.table, "REQUIRE: context.table"
|
|
337
|
+
context.table.require_columns(["category", "level", "message"])
|
|
338
|
+
format = getattr(context, "log_record_format", context.config.logging_format)
|
|
339
|
+
for row in context.table.rows:
|
|
340
|
+
output = LogRecordTable.make_output_for_row(row, format)
|
|
341
|
+
context.text = output
|
|
342
|
+
step_file_should_not_contain_multiline_text(context, filename)
|
|
343
|
+
|
|
344
|
+
|
|
345
|
+
@step('I use "{log_record_format}" as log record format')
|
|
346
|
+
def step_use_log_record_format_text(context, log_record_format):
|
|
347
|
+
context.log_record_format = log_record_format
|
|
348
|
+
|
|
349
|
+
@step('I use the log record configuration')
|
|
350
|
+
def step_use_log_record_configuration(context):
|
|
351
|
+
"""
|
|
352
|
+
Define log record configuration parameters.
|
|
353
|
+
|
|
354
|
+
.. code-block: gherkin
|
|
355
|
+
|
|
356
|
+
Given I use the log record configuration:
|
|
357
|
+
| property | value |
|
|
358
|
+
| format | |
|
|
359
|
+
| datefmt | |
|
|
360
|
+
"""
|
|
361
|
+
assert context.table, "REQUIRE: context.table"
|
|
362
|
+
context.table.require_columns(["property", "value"])
|
|
363
|
+
for row in context.table.rows:
|
|
364
|
+
property_name = row["property"]
|
|
365
|
+
value = row["value"]
|
|
366
|
+
if property_name == "format":
|
|
367
|
+
context.log_record_format = value
|
|
368
|
+
elif property_name == "datefmt":
|
|
369
|
+
context.log_record_datefmt = value
|
|
370
|
+
else:
|
|
371
|
+
raise KeyError("Unknown property=%s" % property_name)
|
|
372
|
+
|
|
373
|
+
|
|
374
|
+
# -----------------------------------------------------------------------------
|
|
375
|
+
# TODO: STEP DEFINITIONS:
|
|
376
|
+
# -----------------------------------------------------------------------------
|
|
377
|
+
@step('I capture log records with level "{level}" or above')
|
|
378
|
+
def step_I_capture_logrecords(context, level):
|
|
379
|
+
raise NotImplementedError()
|
|
380
|
+
|
|
381
|
+
|
|
382
|
+
@step('I capture log records')
|
|
383
|
+
def step_I_capture_logrecords(context):
|
|
384
|
+
"""
|
|
385
|
+
|
|
386
|
+
.. code-block: gherkin
|
|
387
|
+
Given I capture log records
|
|
388
|
+
When I capture log records
|
|
389
|
+
|
|
390
|
+
:param context:
|
|
391
|
+
"""
|
|
392
|
+
raise NotImplementedError()
|
|
393
|
+
logcapture = getattr(context, "logcapture", None)
|
|
394
|
+
if not logcapture:
|
|
395
|
+
context.logcapture = LoggingCapture()
|