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,45 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ from behave.model_core import Status
4
+
5
+ class Reporter(object):
6
+ """
7
+ Base class for all reporters.
8
+ A reporter provides an extension point (variant point) for the runner logic.
9
+ A reporter is called after a model element is processed
10
+ (and its result status is known).
11
+ Otherwise, a reporter is similar to a formatter, but it has a simpler API.
12
+
13
+ Processing Logic (simplified)::
14
+
15
+ config.reporters = ... #< Configuration (and provision).
16
+ runner.run():
17
+ for feature in runner.features:
18
+ feature.run() # And feature scenarios, too.
19
+ for reporter in config.reporters:
20
+ reporter.feature(feature)
21
+ # -- FINALLY:
22
+ for reporter in config.reporters:
23
+ reporter.end()
24
+
25
+ An existing formatter can be reused as reporter by using
26
+ :class:`behave.report.formatter_reporter.FormatterAsReporter`.
27
+ """
28
+
29
+ def __init__(self, config):
30
+ self.config = config
31
+
32
+ def feature(self, feature): # pylint: disable=no-self-use
33
+ """
34
+ Called after a feature was processed.
35
+
36
+ :param feature: Feature object (as :class:`behave.model.Feature`)
37
+ """
38
+ assert feature.status != Status.undefined
39
+ raise NotImplementedError
40
+
41
+ def end(self):
42
+ """
43
+ Called after all model elements are processed (optional-hook).
44
+ """
45
+ pass
@@ -0,0 +1,473 @@
1
+ # -*- coding: UTF-8 -*-
2
+ # pylint: disable=line-too-long
3
+ """
4
+ This module provides a reporter with JUnit XML output.
5
+
6
+ Mapping of behave model elements to XML elements::
7
+
8
+ feature -> xml_element:testsuite
9
+ scenario -> xml_element:testcase
10
+
11
+ XML document structure::
12
+
13
+ # -- XML elements:
14
+ # CARDINALITY SUFFIX:
15
+ # ? optional (zero or one)
16
+ # * many0 (zero or more)
17
+ # + many (one or more)
18
+ testsuites := sequence<testsuite>
19
+ testsuite:
20
+ properties? : sequence<property>
21
+ testcase* :
22
+ error? : text
23
+ failure? : text
24
+ system-out : text
25
+ system-err : text
26
+
27
+ testsuite:
28
+ @name : TokenString
29
+ @tests : int
30
+ @failures : int
31
+ @errors : int
32
+ @skipped : int
33
+ @time : Decimal # Duration in seconds
34
+ # -- SINCE: behave-1.2.6
35
+ @timestamp : IsoDateTime
36
+ @hostname : string
37
+
38
+ testcase:
39
+ @name : TokenString
40
+ @classname : TokenString
41
+ @status : string # Status enum
42
+ @time : Decimal # Elapsed seconds
43
+
44
+ error:
45
+ @message : string
46
+ @type : string
47
+
48
+ failure:
49
+ @message : string
50
+ @type : string
51
+
52
+ # -- HINT: Not used
53
+ property:
54
+ @name : TokenString
55
+ @value : string
56
+
57
+ type Status : Enum("passed", "failed", "skipped", "untested")
58
+
59
+ Note that a spec for JUnit XML output was not clearly defined.
60
+ Best sources are:
61
+
62
+ * `JUnit XML`_ (for PDF)
63
+ * JUnit XML (`ant spec 1`_, `ant spec 2`_)
64
+
65
+
66
+ .. _`JUnit XML`: http://junitpdfreport.sourceforge.net/managedcontent/PdfTranslation
67
+ .. _`ant spec 1`: https://github.com/windyroad/JUnit-Schema
68
+ .. _`ant spec 2`: http://svn.apache.org/repos/asf/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/junit/XMLJUnitResultFormatter.java
69
+ """
70
+ # pylint: enable=line-too-long
71
+
72
+ from __future__ import absolute_import
73
+ import os.path
74
+ import codecs
75
+ from xml.etree import ElementTree
76
+ from datetime import datetime
77
+ from behave.reporter.base import Reporter
78
+ from behave.model import Scenario, ScenarioOutline, Step
79
+ from behave.model_core import Status
80
+ from behave.formatter import ansi_escapes
81
+ from behave.model_describe import ModelDescriptor
82
+ from behave.textutil import indent, make_indentation, text as _text
83
+ import six
84
+ if six.PY2:
85
+ # -- USE: Python3 backport for better unicode compatibility.
86
+ import traceback2 as traceback
87
+ else:
88
+ import traceback
89
+
90
+
91
+ def CDATA(text=None): # pylint: disable=invalid-name
92
+ # -- issue #70: remove_ansi_escapes(text)
93
+ element = ElementTree.Element('![CDATA[')
94
+ element.text = ansi_escapes.strip_escapes(text)
95
+ return element
96
+
97
+
98
+ class ElementTreeWithCDATA(ElementTree.ElementTree):
99
+ # pylint: disable=redefined-builtin, no-member
100
+ def _write(self, file, node, encoding, namespaces):
101
+ """This method is for ElementTree <= 1.2.6"""
102
+
103
+ if node.tag == '![CDATA[':
104
+ text = node.text.encode(encoding)
105
+ file.write("\n<![CDATA[%s]]>\n" % text)
106
+ else:
107
+ ElementTree.ElementTree._write(self, file, node, encoding,
108
+ namespaces)
109
+
110
+ if hasattr(ElementTree, '_serialize'):
111
+ # pylint: disable=protected-access
112
+ def _serialize_xml2(write, elem, encoding, qnames, namespaces,
113
+ orig=ElementTree._serialize_xml):
114
+ if elem.tag == '![CDATA[':
115
+ write("\n<%s%s]]>\n" % \
116
+ (elem.tag, elem.text.encode(encoding, "xmlcharrefreplace")))
117
+ return
118
+ return orig(write, elem, encoding, qnames, namespaces)
119
+
120
+ def _serialize_xml3(write, elem, qnames, namespaces,
121
+ short_empty_elements=None,
122
+ orig=ElementTree._serialize_xml):
123
+ if elem.tag == '![CDATA[':
124
+ write("\n<{tag}{text}]]>\n".format(
125
+ tag=elem.tag, text=elem.text))
126
+ return
127
+ if short_empty_elements:
128
+ # python >=3.3
129
+ return orig(write, elem, qnames, namespaces, short_empty_elements)
130
+ else:
131
+ # python <3.3
132
+ return orig(write, elem, qnames, namespaces)
133
+
134
+ if six.PY3:
135
+ ElementTree._serialize_xml = \
136
+ ElementTree._serialize['xml'] = _serialize_xml3
137
+ elif six.PY2:
138
+ ElementTree._serialize_xml = \
139
+ ElementTree._serialize['xml'] = _serialize_xml2
140
+
141
+
142
+ class FeatureReportData(object):
143
+ """
144
+ Provides value object to collect JUnit report data from a Feature.
145
+ """
146
+ def __init__(self, feature, filename, classname=None):
147
+ if not classname and filename:
148
+ classname = filename.replace('/', '.')
149
+ self.feature = feature
150
+ self.filename = filename
151
+ self.classname = classname
152
+ self.testcases = []
153
+ self.counts_tests = 0
154
+ self.counts_errors = 0
155
+ self.counts_failed = 0
156
+ self.counts_skipped = 0
157
+
158
+ def reset(self):
159
+ self.testcases = []
160
+ self.counts_tests = 0
161
+ self.counts_errors = 0
162
+ self.counts_failed = 0
163
+ self.counts_skipped = 0
164
+
165
+
166
+ class JUnitReporter(Reporter):
167
+ """Generates JUnit-like XML test report for behave.
168
+ """
169
+ # -- XML REPORT:
170
+ userdata_scope = "behave.reporter.junit"
171
+ show_timings = True # -- Show step timings.
172
+ show_skipped_always = False
173
+ show_timestamp = True
174
+ show_hostname = True
175
+ # -- XML REPORT PART: Describe scenarios
176
+ show_scenarios = True # Show scenario descriptions.
177
+ show_tags = True
178
+ show_multiline = True
179
+
180
+ def __init__(self, config):
181
+ super(JUnitReporter, self).__init__(config)
182
+ self.setup_with_userdata(config.userdata)
183
+
184
+ def setup_with_userdata(self, userdata):
185
+ """Setup JUnit reporter with userdata information.
186
+ A user can now tweak the output format of this reporter.
187
+
188
+ EXAMPLE:
189
+ .. code-block:: ini
190
+
191
+ # -- FILE: behave.ini
192
+ [behave.userdata]
193
+ behave.reporter.junit.show_hostname = false
194
+ """
195
+ # -- EXPERIMENTAL:
196
+ option_names = [
197
+ "show_timings", "show_skipped_always",
198
+ "show_timestamp", "show_hostname",
199
+ "show_scenarios", "show_tags", "show_multiline",
200
+ ]
201
+ for option_name in option_names:
202
+ name = "%s.%s" % (self.userdata_scope, option_name)
203
+ default_value = getattr(self, option_name)
204
+ value = userdata.getbool(name, default_value)
205
+ if value != default_value:
206
+ setattr(self, option_name, value)
207
+
208
+ def make_feature_filename(self, feature):
209
+ filename = None
210
+ for path in self.config.paths:
211
+ if feature.filename.startswith(path):
212
+ filename = feature.filename[len(path) + 1:]
213
+ break
214
+ if not filename:
215
+ # -- NOTE: Directory path (subdirs) are taken into account.
216
+ filename = feature.location.relpath(self.config.base_dir)
217
+ filename = filename.rsplit('.', 1)[0]
218
+ filename = filename.replace('\\', '/').replace('/', '.')
219
+ return _text(filename)
220
+
221
+ @property
222
+ def show_skipped(self):
223
+ return self.config.show_skipped or self.show_skipped_always
224
+
225
+ # -- REPORTER-API:
226
+ def feature(self, feature):
227
+ if feature.status == Status.skipped and not self.show_skipped:
228
+ # -- SKIP-OUTPUT: If skipped features should not be shown.
229
+ return
230
+
231
+ feature_filename = self.make_feature_filename(feature)
232
+ classname = feature_filename
233
+ report = FeatureReportData(feature, feature_filename)
234
+ now = datetime.now()
235
+
236
+ suite = ElementTree.Element(u'testsuite')
237
+ feature_name = feature.name or feature_filename
238
+ suite.set(u'name', u'%s.%s' % (classname, feature_name))
239
+
240
+ # -- BUILD-TESTCASES: From scenarios
241
+ for scenario in feature:
242
+ if isinstance(scenario, ScenarioOutline):
243
+ scenario_outline = scenario
244
+ self._process_scenario_outline(scenario_outline, report)
245
+ else:
246
+ self._process_scenario(scenario, report)
247
+
248
+ # -- ADD TESTCASES to testsuite:
249
+ for testcase in report.testcases:
250
+ suite.append(testcase)
251
+
252
+ suite.set(u'tests', _text(report.counts_tests))
253
+ suite.set(u'errors', _text(report.counts_errors))
254
+ suite.set(u'failures', _text(report.counts_failed))
255
+ suite.set(u'skipped', _text(report.counts_skipped)) # WAS: skips
256
+ suite.set(u'time', _text(round(feature.duration, 6)))
257
+ # -- SINCE: behave-1.2.6.dev0
258
+ if self.show_timestamp:
259
+ suite.set(u'timestamp', _text(now.isoformat()))
260
+ if self.show_hostname:
261
+ suite.set(u'hostname', _text(gethostname()))
262
+
263
+ if not os.path.exists(self.config.junit_directory):
264
+ # -- ENSURE: Create multiple directory levels at once.
265
+ os.makedirs(self.config.junit_directory)
266
+
267
+ tree = ElementTreeWithCDATA(suite)
268
+ report_dirname = self.config.junit_directory
269
+ report_basename = u'TESTS-%s.xml' % feature_filename
270
+ report_filename = os.path.join(report_dirname, report_basename)
271
+ tree.write(codecs.open(report_filename, "wb"), "UTF-8")
272
+
273
+ # -- MORE:
274
+ # pylint: disable=line-too-long
275
+ @staticmethod
276
+ def select_step_with_status(status, steps):
277
+ """Helper function to find the first step that has the given
278
+ step.status.
279
+
280
+ EXAMPLE: Search for a failing step in a scenario (all steps).
281
+ >>> scenario = ...
282
+ >>> failed_step = select_step_with_status(Status.failed, scenario)
283
+ >>> failed_step = select_step_with_status(Status.failed, scenario.all_steps)
284
+ >>> assert failed_step.status == Status.failed
285
+
286
+ EXAMPLE: Search only scenario steps, skip background steps.
287
+ >>> failed_step = select_step_with_status(Status.failed, scenario.steps)
288
+
289
+ :param status: Step status to search for (as enum value).
290
+ :param steps: List of steps to search in (or scenario).
291
+ :returns: Step object, if found.
292
+ :returns: None, otherwise.
293
+
294
+ .. versionchanged:: 1.2.6
295
+ status: Use enum value instead of string (or string).
296
+ """
297
+ for step in steps:
298
+ assert isinstance(step, Step), \
299
+ "TYPE-MISMATCH: step.class=%s" % step.__class__.__name__
300
+ if step.status == status:
301
+ return step
302
+ # -- OTHERWISE: No step with the given status found.
303
+ # KeyError("Step with status={0} not found".format(status))
304
+ return None
305
+ # pylint: enable=line-too-long
306
+
307
+ def describe_step(self, step):
308
+ status_text = _text(step.status.name)
309
+ if self.show_timings:
310
+ status_text += u" in %0.3fs" % step.duration
311
+ text = u'%s %s ... ' % (step.keyword, step.name)
312
+ text += u'%s\n' % status_text
313
+ if self.show_multiline:
314
+ prefix = make_indentation(2)
315
+ if step.text:
316
+ text += ModelDescriptor.describe_docstring(step.text, prefix)
317
+ elif step.table:
318
+ text += ModelDescriptor.describe_table(step.table, prefix)
319
+ return text
320
+
321
+ @classmethod
322
+ def describe_tags(cls, tags):
323
+ text = u''
324
+ if tags:
325
+ text = u'@'+ u' @'.join(tags)
326
+ return text
327
+
328
+ def describe_scenario(self, scenario):
329
+ """Describe the scenario and the test status.
330
+ NOTE: table, multiline text is missing in description.
331
+
332
+ :param scenario: Scenario that was tested.
333
+ :return: Textual description of the scenario.
334
+ """
335
+ header_line = u'\n@scenario.begin\n'
336
+ if self.show_tags and scenario.tags:
337
+ header_line += u'\n %s\n' % self.describe_tags(scenario.tags)
338
+ header_line += u' %s: %s\n' % (scenario.keyword, scenario.name)
339
+ footer_line = u'\n@scenario.end\n' + u'-' * 80 + '\n'
340
+ text = u''
341
+ for step in scenario:
342
+ text += self.describe_step(step)
343
+ step_indentation = make_indentation(4)
344
+ return header_line + indent(text, step_indentation) + footer_line
345
+
346
+ def _process_scenario(self, scenario, report):
347
+ """Process a scenario and append information to JUnit report object.
348
+ This corresponds to a JUnit testcase:
349
+
350
+ * testcase.@classname = f(filename) +'.'+ feature.name
351
+ * testcase.@name = scenario.name
352
+ * testcase.@status = scenario.status
353
+ * testcase.@time = scenario.duration
354
+
355
+ Distinguishes now between failures and errors.
356
+ Failures are AssertationErrors: expectation is violated/not met.
357
+ Errors are unexpected RuntimeErrors (all other exceptions).
358
+
359
+ If a failure/error occurs, the step, that caused the failure,
360
+ and its location are provided now.
361
+
362
+ :param scenario: Scenario to process.
363
+ :param report: Context object to store/add info to (outgoing param).
364
+ """
365
+ # pylint: disable=too-many-locals, too-many-branches, too-many-statements
366
+ assert isinstance(scenario, Scenario)
367
+ assert not isinstance(scenario, ScenarioOutline)
368
+ if scenario.status != Status.skipped or self.show_skipped:
369
+ # -- NOTE: Count only if not-skipped or skipped should be shown.
370
+ report.counts_tests += 1
371
+ classname = report.classname
372
+ feature = report.feature
373
+ feature_name = feature.name
374
+ if not feature_name:
375
+ feature_name = self.make_feature_filename(feature)
376
+
377
+ case = ElementTree.Element('testcase')
378
+ case.set(u"classname", u"%s.%s" % (classname, feature_name))
379
+ case.set(u"name", scenario.name or "")
380
+ case.set(u"status", scenario.status.name)
381
+ case.set(u"time", _text(round(scenario.duration, 6)))
382
+
383
+ step = None
384
+ failing_step = None
385
+ if scenario.status == Status.failed:
386
+ for status in (Status.failed, Status.undefined):
387
+ step = self.select_step_with_status(status, scenario)
388
+ if step:
389
+ break
390
+ # -- NOTE: Scenario may fail now due to hook-errors.
391
+ element_name = "failure"
392
+ if step and isinstance(step.exception, (AssertionError, type(None))):
393
+ # -- FAILURE: AssertionError
394
+ assert step.status in (Status.failed, Status.undefined)
395
+ report.counts_failed += 1
396
+ else:
397
+ # -- UNEXPECTED RUNTIME-ERROR:
398
+ report.counts_errors += 1
399
+ element_name = "error"
400
+ # -- COMMON-PART:
401
+ failure = ElementTree.Element(element_name)
402
+ if step:
403
+ step_text = self.describe_step(step).rstrip()
404
+ text = u"\nFailing step: %s\nLocation: %s\n" % \
405
+ (step_text, step.location)
406
+ message = _text(step.exception)
407
+ failure.set(u'type', step.exception.__class__.__name__)
408
+ failure.set(u'message', message)
409
+ text += _text(step.error_message)
410
+ else:
411
+ # -- MAYBE: Hook failure before any step is executed.
412
+ failure_type = "UnknownError"
413
+ if scenario.exception:
414
+ failure_type = scenario.exception.__class__.__name__
415
+ failure.set(u'type', failure_type)
416
+ failure.set(u'message', scenario.error_message or "")
417
+ traceback_lines = traceback.format_tb(scenario.exc_traceback)
418
+ traceback_lines.insert(0, u"Traceback:\n")
419
+ text = _text(u"".join(traceback_lines))
420
+ failure.append(CDATA(text))
421
+ case.append(failure)
422
+ elif (scenario.status in (Status.skipped, Status.untested)
423
+ and self.show_skipped):
424
+ report.counts_skipped += 1
425
+ step = self.select_step_with_status(Status.undefined, scenario)
426
+ if step:
427
+ # -- UNDEFINED-STEP:
428
+ report.counts_failed += 1
429
+ failure = ElementTree.Element(u"failure")
430
+ failure.set(u"type", u"undefined")
431
+ failure.set(u"message", (u"Undefined Step: %s" % step.name))
432
+ case.append(failure)
433
+ else:
434
+ skip = ElementTree.Element(u'skipped')
435
+ case.append(skip)
436
+
437
+ # Create stdout section for each test case
438
+ stdout = ElementTree.Element(u"system-out")
439
+ text = u""
440
+ if self.show_scenarios:
441
+ text = self.describe_scenario(scenario)
442
+
443
+ # Append the captured standard output
444
+ if scenario.captured.stdout:
445
+ output = _text(scenario.captured.stdout)
446
+ text += u"\nCaptured stdout:\n%s\n" % output
447
+ stdout.append(CDATA(text))
448
+ case.append(stdout)
449
+
450
+ # Create stderr section for each test case
451
+ if scenario.captured.stderr:
452
+ stderr = ElementTree.Element(u"system-err")
453
+ output = _text(scenario.captured.stderr)
454
+ text = u"\nCaptured stderr:\n%s\n" % output
455
+ stderr.append(CDATA(text))
456
+ case.append(stderr)
457
+
458
+ if scenario.status != Status.skipped or self.show_skipped:
459
+ report.testcases.append(case)
460
+
461
+ def _process_scenario_outline(self, scenario_outline, report):
462
+ assert isinstance(scenario_outline, ScenarioOutline)
463
+ for scenario in scenario_outline:
464
+ assert isinstance(scenario, Scenario)
465
+ self._process_scenario(scenario, report)
466
+
467
+ # -----------------------------------------------------------------------------
468
+ # SUPPORT:
469
+ # -----------------------------------------------------------------------------
470
+ def gethostname():
471
+ """Return hostname of local host (as string)"""
472
+ import socket
473
+ return socket.gethostname()