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.
Files changed (418) hide show
  1. checksums.yaml +7 -0
  2. data/.cane +0 -0
  3. data/.gitignore +17 -0
  4. data/.tailor +4 -0
  5. data/.travis.yml +11 -0
  6. data/CHANGELOG.md +3 -0
  7. data/Gemfile +3 -0
  8. data/LICENSE +15 -0
  9. data/README.md +41 -0
  10. data/Rakefile +68 -0
  11. data/busser-behave.gemspec +30 -0
  12. data/features/plugin_install_command.feature +11 -0
  13. data/features/plugin_list_command.feature +8 -0
  14. data/features/support/env.rb +13 -0
  15. data/features/test_command.feature +31 -0
  16. data/lib/busser/behave/version.rb +26 -0
  17. data/lib/busser/runner_plugin/behave.rb +37 -0
  18. data/vendor/behave/CHANGES.rst +483 -0
  19. data/vendor/behave/LICENSE +23 -0
  20. data/vendor/behave/MANIFEST.in +37 -0
  21. data/vendor/behave/PROJECT_INFO.rst +21 -0
  22. data/vendor/behave/README.rst +112 -0
  23. data/vendor/behave/VERSION.txt +1 -0
  24. data/vendor/behave/behave.ini +22 -0
  25. data/vendor/behave/behave/__init__.py +30 -0
  26. data/vendor/behave/behave/__main__.py +187 -0
  27. data/vendor/behave/behave/_stepimport.py +185 -0
  28. data/vendor/behave/behave/_types.py +134 -0
  29. data/vendor/behave/behave/api/__init__.py +7 -0
  30. data/vendor/behave/behave/api/async_step.py +283 -0
  31. data/vendor/behave/behave/capture.py +227 -0
  32. data/vendor/behave/behave/compat/__init__.py +5 -0
  33. data/vendor/behave/behave/compat/collections.py +20 -0
  34. data/vendor/behave/behave/configuration.py +788 -0
  35. data/vendor/behave/behave/contrib/__init__.py +0 -0
  36. data/vendor/behave/behave/contrib/scenario_autoretry.py +73 -0
  37. data/vendor/behave/behave/formatter/__init__.py +12 -0
  38. data/vendor/behave/behave/formatter/_builtins.py +39 -0
  39. data/vendor/behave/behave/formatter/_registry.py +135 -0
  40. data/vendor/behave/behave/formatter/ansi_escapes.py +91 -0
  41. data/vendor/behave/behave/formatter/base.py +200 -0
  42. data/vendor/behave/behave/formatter/formatters.py +57 -0
  43. data/vendor/behave/behave/formatter/json.py +253 -0
  44. data/vendor/behave/behave/formatter/null.py +12 -0
  45. data/vendor/behave/behave/formatter/plain.py +158 -0
  46. data/vendor/behave/behave/formatter/pretty.py +351 -0
  47. data/vendor/behave/behave/formatter/progress.py +287 -0
  48. data/vendor/behave/behave/formatter/rerun.py +114 -0
  49. data/vendor/behave/behave/formatter/sphinx_steps.py +372 -0
  50. data/vendor/behave/behave/formatter/sphinx_util.py +118 -0
  51. data/vendor/behave/behave/formatter/steps.py +497 -0
  52. data/vendor/behave/behave/formatter/tags.py +178 -0
  53. data/vendor/behave/behave/i18n.py +614 -0
  54. data/vendor/behave/behave/importer.py +102 -0
  55. data/vendor/behave/behave/json_parser.py +264 -0
  56. data/vendor/behave/behave/log_capture.py +233 -0
  57. data/vendor/behave/behave/matchers.py +402 -0
  58. data/vendor/behave/behave/model.py +1737 -0
  59. data/vendor/behave/behave/model_core.py +416 -0
  60. data/vendor/behave/behave/model_describe.py +105 -0
  61. data/vendor/behave/behave/parser.py +615 -0
  62. data/vendor/behave/behave/reporter/__init__.py +0 -0
  63. data/vendor/behave/behave/reporter/base.py +45 -0
  64. data/vendor/behave/behave/reporter/junit.py +473 -0
  65. data/vendor/behave/behave/reporter/summary.py +94 -0
  66. data/vendor/behave/behave/runner.py +753 -0
  67. data/vendor/behave/behave/runner_util.py +417 -0
  68. data/vendor/behave/behave/step_registry.py +112 -0
  69. data/vendor/behave/behave/tag_expression.py +111 -0
  70. data/vendor/behave/behave/tag_matcher.py +465 -0
  71. data/vendor/behave/behave/textutil.py +137 -0
  72. data/vendor/behave/behave/userdata.py +130 -0
  73. data/vendor/behave/behave4cmd0/__all_steps__.py +12 -0
  74. data/vendor/behave/behave4cmd0/__init__.py +5 -0
  75. data/vendor/behave/behave4cmd0/__setup.py +11 -0
  76. data/vendor/behave/behave4cmd0/command_shell.py +216 -0
  77. data/vendor/behave/behave4cmd0/command_shell_proc.py +256 -0
  78. data/vendor/behave/behave4cmd0/command_steps.py +532 -0
  79. data/vendor/behave/behave4cmd0/command_util.py +147 -0
  80. data/vendor/behave/behave4cmd0/failing_steps.py +49 -0
  81. data/vendor/behave/behave4cmd0/log/__init__.py +1 -0
  82. data/vendor/behave/behave4cmd0/log/steps.py +395 -0
  83. data/vendor/behave/behave4cmd0/note_steps.py +29 -0
  84. data/vendor/behave/behave4cmd0/passing_steps.py +36 -0
  85. data/vendor/behave/behave4cmd0/pathutil.py +146 -0
  86. data/vendor/behave/behave4cmd0/setup_command_shell.py +24 -0
  87. data/vendor/behave/behave4cmd0/textutil.py +304 -0
  88. data/vendor/behave/bin/behave +44 -0
  89. data/vendor/behave/bin/behave.cmd +10 -0
  90. data/vendor/behave/bin/behave.junit_filter.py +85 -0
  91. data/vendor/behave/bin/behave.step_durations.py +163 -0
  92. data/vendor/behave/bin/behave2cucumber_json.py +63 -0
  93. data/vendor/behave/bin/behave_cmd.py +44 -0
  94. data/vendor/behave/bin/convert_i18n_yaml.py +77 -0
  95. data/vendor/behave/bin/explore_platform_encoding.py +24 -0
  96. data/vendor/behave/bin/i18n.yml +621 -0
  97. data/vendor/behave/bin/invoke +8 -0
  98. data/vendor/behave/bin/invoke.cmd +9 -0
  99. data/vendor/behave/bin/json.format.py +167 -0
  100. data/vendor/behave/bin/jsonschema_validate.py +122 -0
  101. data/vendor/behave/bin/make_localpi.py +279 -0
  102. data/vendor/behave/bin/project_bootstrap.sh +30 -0
  103. data/vendor/behave/bin/toxcmd.py +270 -0
  104. data/vendor/behave/bin/toxcmd3.py +270 -0
  105. data/vendor/behave/conftest.py +27 -0
  106. data/vendor/behave/docs/Makefile +154 -0
  107. data/vendor/behave/docs/_static/agogo.css +501 -0
  108. data/vendor/behave/docs/_static/behave_logo.png +0 -0
  109. data/vendor/behave/docs/_static/behave_logo1.png +0 -0
  110. data/vendor/behave/docs/_static/behave_logo2.png +0 -0
  111. data/vendor/behave/docs/_static/behave_logo3.png +0 -0
  112. data/vendor/behave/docs/_themes/LICENSE +45 -0
  113. data/vendor/behave/docs/_themes/kr/layout.html +17 -0
  114. data/vendor/behave/docs/_themes/kr/relations.html +19 -0
  115. data/vendor/behave/docs/_themes/kr/static/flasky.css_t +480 -0
  116. data/vendor/behave/docs/_themes/kr/static/small_flask.css +90 -0
  117. data/vendor/behave/docs/_themes/kr/theme.conf +7 -0
  118. data/vendor/behave/docs/_themes/kr_small/layout.html +22 -0
  119. data/vendor/behave/docs/_themes/kr_small/static/flasky.css_t +287 -0
  120. data/vendor/behave/docs/_themes/kr_small/theme.conf +10 -0
  121. data/vendor/behave/docs/api.rst +408 -0
  122. data/vendor/behave/docs/appendix.rst +19 -0
  123. data/vendor/behave/docs/behave.rst +640 -0
  124. data/vendor/behave/docs/behave.rst-template +86 -0
  125. data/vendor/behave/docs/behave_ecosystem.rst +81 -0
  126. data/vendor/behave/docs/comparison.rst +85 -0
  127. data/vendor/behave/docs/conf.py +293 -0
  128. data/vendor/behave/docs/context_attributes.rst +66 -0
  129. data/vendor/behave/docs/django.rst +192 -0
  130. data/vendor/behave/docs/formatters.rst +61 -0
  131. data/vendor/behave/docs/gherkin.rst +673 -0
  132. data/vendor/behave/docs/index.rst +57 -0
  133. data/vendor/behave/docs/install.rst +60 -0
  134. data/vendor/behave/docs/more_info.rst +184 -0
  135. data/vendor/behave/docs/new_and_noteworthy.rst +18 -0
  136. data/vendor/behave/docs/new_and_noteworthy_v1.2.4.rst +11 -0
  137. data/vendor/behave/docs/new_and_noteworthy_v1.2.5.rst +814 -0
  138. data/vendor/behave/docs/new_and_noteworthy_v1.2.6.rst +255 -0
  139. data/vendor/behave/docs/parse_builtin_types.rst +59 -0
  140. data/vendor/behave/docs/philosophy.rst +235 -0
  141. data/vendor/behave/docs/regular_expressions.rst +71 -0
  142. data/vendor/behave/docs/related.rst +14 -0
  143. data/vendor/behave/docs/test_domains.rst +62 -0
  144. data/vendor/behave/docs/tutorial.rst +636 -0
  145. data/vendor/behave/docs/update_behave_rst.py +100 -0
  146. data/vendor/behave/etc/json/behave.json-schema +172 -0
  147. data/vendor/behave/etc/junit.xml/behave_junit.xsd +103 -0
  148. data/vendor/behave/etc/junit.xml/junit-4.xsd +92 -0
  149. data/vendor/behave/examples/async_step/README.txt +8 -0
  150. data/vendor/behave/examples/async_step/behave.ini +14 -0
  151. data/vendor/behave/examples/async_step/features/async_dispatch.feature +8 -0
  152. data/vendor/behave/examples/async_step/features/async_run.feature +6 -0
  153. data/vendor/behave/examples/async_step/features/environment.py +28 -0
  154. data/vendor/behave/examples/async_step/features/steps/async_dispatch_steps.py +26 -0
  155. data/vendor/behave/examples/async_step/features/steps/async_steps34.py +10 -0
  156. data/vendor/behave/examples/async_step/features/steps/async_steps35.py +10 -0
  157. data/vendor/behave/examples/async_step/testrun_example.async_dispatch.txt +11 -0
  158. data/vendor/behave/examples/async_step/testrun_example.async_run.txt +9 -0
  159. data/vendor/behave/examples/env_vars/README.rst +26 -0
  160. data/vendor/behave/examples/env_vars/behave.ini +15 -0
  161. data/vendor/behave/examples/env_vars/behave_run.output_example.txt +12 -0
  162. data/vendor/behave/examples/env_vars/features/env_var.feature +6 -0
  163. data/vendor/behave/examples/env_vars/features/steps/env_var_steps.py +38 -0
  164. data/vendor/behave/features/README.txt +12 -0
  165. data/vendor/behave/features/background.feature +392 -0
  166. data/vendor/behave/features/capture_stderr.feature +172 -0
  167. data/vendor/behave/features/capture_stdout.feature +125 -0
  168. data/vendor/behave/features/cmdline.lang_list.feature +33 -0
  169. data/vendor/behave/features/configuration.default_paths.feature +116 -0
  170. data/vendor/behave/features/context.global_params.feature +35 -0
  171. data/vendor/behave/features/context.local_params.feature +17 -0
  172. data/vendor/behave/features/directory_layout.advanced.feature +147 -0
  173. data/vendor/behave/features/directory_layout.basic.feature +75 -0
  174. data/vendor/behave/features/directory_layout.basic2.feature +87 -0
  175. data/vendor/behave/features/environment.py +53 -0
  176. data/vendor/behave/features/exploratory_testing.with_table.feature +141 -0
  177. data/vendor/behave/features/feature.description.feature +0 -0
  178. data/vendor/behave/features/feature.exclude_from_run.feature +96 -0
  179. data/vendor/behave/features/formatter.help.feature +30 -0
  180. data/vendor/behave/features/formatter.json.feature +420 -0
  181. data/vendor/behave/features/formatter.progress3.feature +235 -0
  182. data/vendor/behave/features/formatter.rerun.feature +296 -0
  183. data/vendor/behave/features/formatter.steps.feature +181 -0
  184. data/vendor/behave/features/formatter.steps_catalog.feature +100 -0
  185. data/vendor/behave/features/formatter.steps_doc.feature +140 -0
  186. data/vendor/behave/features/formatter.steps_usage.feature +404 -0
  187. data/vendor/behave/features/formatter.tags.feature +134 -0
  188. data/vendor/behave/features/formatter.tags_location.feature +183 -0
  189. data/vendor/behave/features/formatter.user_defined.feature +196 -0
  190. data/vendor/behave/features/i18n.unicode_problems.feature +445 -0
  191. data/vendor/behave/features/logcapture.clear_handlers.feature +114 -0
  192. data/vendor/behave/features/logcapture.feature +188 -0
  193. data/vendor/behave/features/logcapture.filter.feature +130 -0
  194. data/vendor/behave/features/logging.no_capture.feature +99 -0
  195. data/vendor/behave/features/logging.setup_format.feature +157 -0
  196. data/vendor/behave/features/logging.setup_level.feature +168 -0
  197. data/vendor/behave/features/logging.setup_with_configfile.feature +137 -0
  198. data/vendor/behave/features/parser.background.sad_cases.feature +129 -0
  199. data/vendor/behave/features/parser.feature.sad_cases.feature +144 -0
  200. data/vendor/behave/features/runner.abort_by_user.feature +305 -0
  201. data/vendor/behave/features/runner.continue_after_failed_step.feature +136 -0
  202. data/vendor/behave/features/runner.default_format.feature +175 -0
  203. data/vendor/behave/features/runner.dry_run.feature +184 -0
  204. data/vendor/behave/features/runner.feature_listfile.feature +223 -0
  205. data/vendor/behave/features/runner.hook_errors.feature +382 -0
  206. data/vendor/behave/features/runner.multiple_formatters.feature +285 -0
  207. data/vendor/behave/features/runner.scenario_autoretry.feature +131 -0
  208. data/vendor/behave/features/runner.select_files_by_regexp.example.feature +71 -0
  209. data/vendor/behave/features/runner.select_files_by_regexp.feature +84 -0
  210. data/vendor/behave/features/runner.select_scenarios_by_file_location.feature +403 -0
  211. data/vendor/behave/features/runner.select_scenarios_by_name.feature +289 -0
  212. data/vendor/behave/features/runner.select_scenarios_by_tag.feature +225 -0
  213. data/vendor/behave/features/runner.stop_after_failure.feature +122 -0
  214. data/vendor/behave/features/runner.tag_logic.feature +67 -0
  215. data/vendor/behave/features/runner.unknown_formatter.feature +23 -0
  216. data/vendor/behave/features/runner.use_stage_implementations.feature +126 -0
  217. data/vendor/behave/features/scenario.description.feature +171 -0
  218. data/vendor/behave/features/scenario.exclude_from_run.feature +217 -0
  219. data/vendor/behave/features/scenario_outline.basics.feature +100 -0
  220. data/vendor/behave/features/scenario_outline.improved.feature +177 -0
  221. data/vendor/behave/features/scenario_outline.name_annotation.feature +157 -0
  222. data/vendor/behave/features/scenario_outline.parametrized.feature +401 -0
  223. data/vendor/behave/features/scenario_outline.tagged_examples.feature +118 -0
  224. data/vendor/behave/features/step.async_steps.feature +225 -0
  225. data/vendor/behave/features/step.duplicated_step.feature +106 -0
  226. data/vendor/behave/features/step.execute_steps.feature +59 -0
  227. data/vendor/behave/features/step.execute_steps.with_table.feature +65 -0
  228. data/vendor/behave/features/step.import_other_step_module.feature +103 -0
  229. data/vendor/behave/features/step.pending_steps.feature +128 -0
  230. data/vendor/behave/features/step.undefined_steps.feature +307 -0
  231. data/vendor/behave/features/step.use_step_library.feature +44 -0
  232. data/vendor/behave/features/step_dialect.generic_steps.feature +189 -0
  233. data/vendor/behave/features/step_dialect.given_when_then.feature +89 -0
  234. data/vendor/behave/features/step_param.builtin_types.with_float.feature +239 -0
  235. data/vendor/behave/features/step_param.builtin_types.with_integer.feature +305 -0
  236. data/vendor/behave/features/step_param.custom_types.feature +134 -0
  237. data/vendor/behave/features/steps/behave_active_tags_steps.py +86 -0
  238. data/vendor/behave/features/steps/behave_context_steps.py +67 -0
  239. data/vendor/behave/features/steps/behave_model_tag_logic_steps.py +105 -0
  240. data/vendor/behave/features/steps/behave_model_util.py +105 -0
  241. data/vendor/behave/features/steps/behave_select_files_steps.py +83 -0
  242. data/vendor/behave/features/steps/behave_tag_expression_steps.py +166 -0
  243. data/vendor/behave/features/steps/behave_undefined_steps.py +101 -0
  244. data/vendor/behave/features/steps/use_steplib_behave4cmd.py +12 -0
  245. data/vendor/behave/features/summary.undefined_steps.feature +114 -0
  246. data/vendor/behave/features/tags.active_tags.feature +385 -0
  247. data/vendor/behave/features/tags.default_tags.feature +104 -0
  248. data/vendor/behave/features/tags.tag_expression.feature +105 -0
  249. data/vendor/behave/features/userdata.feature +331 -0
  250. data/vendor/behave/invoke.yaml +21 -0
  251. data/vendor/behave/issue.features/README.txt +17 -0
  252. data/vendor/behave/issue.features/environment.py +97 -0
  253. data/vendor/behave/issue.features/issue0030.feature +21 -0
  254. data/vendor/behave/issue.features/issue0031.feature +16 -0
  255. data/vendor/behave/issue.features/issue0032.feature +28 -0
  256. data/vendor/behave/issue.features/issue0035.feature +74 -0
  257. data/vendor/behave/issue.features/issue0040.feature +154 -0
  258. data/vendor/behave/issue.features/issue0041.feature +135 -0
  259. data/vendor/behave/issue.features/issue0042.feature +230 -0
  260. data/vendor/behave/issue.features/issue0044.feature +51 -0
  261. data/vendor/behave/issue.features/issue0046.feature +77 -0
  262. data/vendor/behave/issue.features/issue0052.feature +66 -0
  263. data/vendor/behave/issue.features/issue0059.feature +29 -0
  264. data/vendor/behave/issue.features/issue0063.feature +102 -0
  265. data/vendor/behave/issue.features/issue0064.feature +97 -0
  266. data/vendor/behave/issue.features/issue0065.feature +18 -0
  267. data/vendor/behave/issue.features/issue0066.feature +80 -0
  268. data/vendor/behave/issue.features/issue0067.feature +90 -0
  269. data/vendor/behave/issue.features/issue0069.feature +64 -0
  270. data/vendor/behave/issue.features/issue0072.feature +32 -0
  271. data/vendor/behave/issue.features/issue0073.feature +228 -0
  272. data/vendor/behave/issue.features/issue0075.feature +18 -0
  273. data/vendor/behave/issue.features/issue0077.feature +89 -0
  274. data/vendor/behave/issue.features/issue0080.feature +49 -0
  275. data/vendor/behave/issue.features/issue0081.feature +138 -0
  276. data/vendor/behave/issue.features/issue0083.feature +69 -0
  277. data/vendor/behave/issue.features/issue0084.feature +69 -0
  278. data/vendor/behave/issue.features/issue0085.feature +119 -0
  279. data/vendor/behave/issue.features/issue0092.feature +66 -0
  280. data/vendor/behave/issue.features/issue0096.feature +173 -0
  281. data/vendor/behave/issue.features/issue0099.feature +130 -0
  282. data/vendor/behave/issue.features/issue0109.feature +60 -0
  283. data/vendor/behave/issue.features/issue0111.feature +53 -0
  284. data/vendor/behave/issue.features/issue0112.feature +64 -0
  285. data/vendor/behave/issue.features/issue0114.feature +118 -0
  286. data/vendor/behave/issue.features/issue0116.feature +71 -0
  287. data/vendor/behave/issue.features/issue0125.feature +49 -0
  288. data/vendor/behave/issue.features/issue0127.feature +64 -0
  289. data/vendor/behave/issue.features/issue0139.feature +67 -0
  290. data/vendor/behave/issue.features/issue0142.feature +37 -0
  291. data/vendor/behave/issue.features/issue0143.feature +54 -0
  292. data/vendor/behave/issue.features/issue0145.feature +63 -0
  293. data/vendor/behave/issue.features/issue0148.feature +105 -0
  294. data/vendor/behave/issue.features/issue0152.feature +52 -0
  295. data/vendor/behave/issue.features/issue0159.feature +74 -0
  296. data/vendor/behave/issue.features/issue0162.feature +86 -0
  297. data/vendor/behave/issue.features/issue0171.feature +16 -0
  298. data/vendor/behave/issue.features/issue0172.feature +51 -0
  299. data/vendor/behave/issue.features/issue0175.feature +91 -0
  300. data/vendor/behave/issue.features/issue0177.feature +40 -0
  301. data/vendor/behave/issue.features/issue0181.feature +36 -0
  302. data/vendor/behave/issue.features/issue0184.feature +144 -0
  303. data/vendor/behave/issue.features/issue0186.feature +12 -0
  304. data/vendor/behave/issue.features/issue0188.feature +60 -0
  305. data/vendor/behave/issue.features/issue0191.feature +178 -0
  306. data/vendor/behave/issue.features/issue0194.feature +215 -0
  307. data/vendor/behave/issue.features/issue0197.feature +11 -0
  308. data/vendor/behave/issue.features/issue0216.feature +129 -0
  309. data/vendor/behave/issue.features/issue0226.feature +51 -0
  310. data/vendor/behave/issue.features/issue0228.feature +41 -0
  311. data/vendor/behave/issue.features/issue0230.feature +46 -0
  312. data/vendor/behave/issue.features/issue0231.feature +77 -0
  313. data/vendor/behave/issue.features/issue0238.feature +52 -0
  314. data/vendor/behave/issue.features/issue0251.feature +15 -0
  315. data/vendor/behave/issue.features/issue0280.feature +118 -0
  316. data/vendor/behave/issue.features/issue0288.feature +95 -0
  317. data/vendor/behave/issue.features/issue0300.feature +49 -0
  318. data/vendor/behave/issue.features/issue0302.feature +91 -0
  319. data/vendor/behave/issue.features/issue0309.feature +52 -0
  320. data/vendor/behave/issue.features/issue0330.feature +124 -0
  321. data/vendor/behave/issue.features/issue0349.feature +9 -0
  322. data/vendor/behave/issue.features/issue0361.feature +79 -0
  323. data/vendor/behave/issue.features/issue0383.feature +76 -0
  324. data/vendor/behave/issue.features/issue0384.feature +103 -0
  325. data/vendor/behave/issue.features/issue0385.feature +109 -0
  326. data/vendor/behave/issue.features/issue0424.feature +66 -0
  327. data/vendor/behave/issue.features/issue0446.feature +116 -0
  328. data/vendor/behave/issue.features/issue0449.feature +42 -0
  329. data/vendor/behave/issue.features/issue0453.feature +42 -0
  330. data/vendor/behave/issue.features/issue0457.feature +65 -0
  331. data/vendor/behave/issue.features/issue0462.feature +38 -0
  332. data/vendor/behave/issue.features/issue0476.feature +39 -0
  333. data/vendor/behave/issue.features/issue0487.feature +92 -0
  334. data/vendor/behave/issue.features/issue0506.feature +77 -0
  335. data/vendor/behave/issue.features/issue0510.feature +51 -0
  336. data/vendor/behave/issue.features/requirements.txt +12 -0
  337. data/vendor/behave/issue.features/steps/ansi_steps.py +20 -0
  338. data/vendor/behave/issue.features/steps/behave_hooks_steps.py +10 -0
  339. data/vendor/behave/issue.features/steps/use_steplib_behave4cmd.py +13 -0
  340. data/vendor/behave/more.features/formatter.json.validate_output.feature +37 -0
  341. data/vendor/behave/more.features/steps/tutorial_steps.py +16 -0
  342. data/vendor/behave/more.features/steps/use_steplib_behave4cmd.py +7 -0
  343. data/vendor/behave/more.features/tutorial.feature +6 -0
  344. data/vendor/behave/py.requirements/README.txt +5 -0
  345. data/vendor/behave/py.requirements/all.txt +16 -0
  346. data/vendor/behave/py.requirements/basic.txt +21 -0
  347. data/vendor/behave/py.requirements/develop.txt +28 -0
  348. data/vendor/behave/py.requirements/docs.txt +6 -0
  349. data/vendor/behave/py.requirements/json.txt +7 -0
  350. data/vendor/behave/py.requirements/more_py26.txt +8 -0
  351. data/vendor/behave/py.requirements/testing.txt +10 -0
  352. data/vendor/behave/pytest.ini +24 -0
  353. data/vendor/behave/setup.cfg +29 -0
  354. data/vendor/behave/setup.py +118 -0
  355. data/vendor/behave/setuptools_behave.py +130 -0
  356. data/vendor/behave/tasks/__behave.py +45 -0
  357. data/vendor/behave/tasks/__init__.py +55 -0
  358. data/vendor/behave/tasks/__main__.py +70 -0
  359. data/vendor/behave/tasks/_setup.py +135 -0
  360. data/vendor/behave/tasks/_vendor/README.rst +35 -0
  361. data/vendor/behave/tasks/_vendor/invoke.zip +0 -0
  362. data/vendor/behave/tasks/_vendor/path.py +1725 -0
  363. data/vendor/behave/tasks/_vendor/pathlib.py +1280 -0
  364. data/vendor/behave/tasks/_vendor/six.py +868 -0
  365. data/vendor/behave/tasks/clean.py +246 -0
  366. data/vendor/behave/tasks/docs.py +97 -0
  367. data/vendor/behave/tasks/requirements.txt +17 -0
  368. data/vendor/behave/tasks/test.py +192 -0
  369. data/vendor/behave/test/__init__.py +0 -0
  370. data/vendor/behave/test/_importer_candidate.py +3 -0
  371. data/vendor/behave/test/reporters/__init__.py +0 -0
  372. data/vendor/behave/test/reporters/test_summary.py +240 -0
  373. data/vendor/behave/test/test_ansi_escapes.py +73 -0
  374. data/vendor/behave/test/test_configuration.py +172 -0
  375. data/vendor/behave/test/test_formatter.py +265 -0
  376. data/vendor/behave/test/test_formatter_progress.py +39 -0
  377. data/vendor/behave/test/test_formatter_rerun.py +97 -0
  378. data/vendor/behave/test/test_formatter_tags.py +57 -0
  379. data/vendor/behave/test/test_importer.py +151 -0
  380. data/vendor/behave/test/test_log_capture.py +29 -0
  381. data/vendor/behave/test/test_matchers.py +236 -0
  382. data/vendor/behave/test/test_model.py +871 -0
  383. data/vendor/behave/test/test_parser.py +1590 -0
  384. data/vendor/behave/test/test_runner.py +1074 -0
  385. data/vendor/behave/test/test_step_registry.py +96 -0
  386. data/vendor/behave/test/test_tag_expression.py +506 -0
  387. data/vendor/behave/test/test_tag_expression2.py +462 -0
  388. data/vendor/behave/test/test_tag_matcher.py +729 -0
  389. data/vendor/behave/test/test_userdata.py +184 -0
  390. data/vendor/behave/tests/README.txt +12 -0
  391. data/vendor/behave/tests/__init__.py +0 -0
  392. data/vendor/behave/tests/api/__ONLY_PY34_or_newer.txt +0 -0
  393. data/vendor/behave/tests/api/__init__.py +0 -0
  394. data/vendor/behave/tests/api/_test_async_step34.py +130 -0
  395. data/vendor/behave/tests/api/_test_async_step35.py +75 -0
  396. data/vendor/behave/tests/api/test_async_step.py +18 -0
  397. data/vendor/behave/tests/api/testing_support.py +94 -0
  398. data/vendor/behave/tests/api/testing_support_async.py +21 -0
  399. data/vendor/behave/tests/issues/test_issue0336.py +66 -0
  400. data/vendor/behave/tests/issues/test_issue0449.py +55 -0
  401. data/vendor/behave/tests/issues/test_issue0453.py +62 -0
  402. data/vendor/behave/tests/issues/test_issue0458.py +54 -0
  403. data/vendor/behave/tests/issues/test_issue0495.py +65 -0
  404. data/vendor/behave/tests/unit/__init__.py +0 -0
  405. data/vendor/behave/tests/unit/test_behave4cmd_command_shell_proc.py +135 -0
  406. data/vendor/behave/tests/unit/test_capture.py +280 -0
  407. data/vendor/behave/tests/unit/test_model_core.py +56 -0
  408. data/vendor/behave/tests/unit/test_textutil.py +267 -0
  409. data/vendor/behave/tools/test-features/background.feature +9 -0
  410. data/vendor/behave/tools/test-features/environment.py +8 -0
  411. data/vendor/behave/tools/test-features/french.feature +11 -0
  412. data/vendor/behave/tools/test-features/outline.feature +39 -0
  413. data/vendor/behave/tools/test-features/parse.feature +10 -0
  414. data/vendor/behave/tools/test-features/step-data.feature +60 -0
  415. data/vendor/behave/tools/test-features/steps/steps.py +120 -0
  416. data/vendor/behave/tools/test-features/tags.feature +18 -0
  417. data/vendor/behave/tox.ini +159 -0
  418. 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()