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,5 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ Used for behave as compatibility layer between different Python versions
4
+ and implementations.
5
+ """
@@ -0,0 +1,20 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ Compatibility of :module:`collections` between different Python versions.
4
+ """
5
+
6
+ from __future__ import absolute_import
7
+ import warnings
8
+ # pylint: disable=unused-import
9
+ try:
10
+ # -- SINCE: Python2.7
11
+ from collections import OrderedDict
12
+ except ImportError: # pragma: no cover
13
+ try:
14
+ # -- BACK-PORTED FOR: Python 2.4 .. 2.6
15
+ from ordereddict import OrderedDict
16
+ except ImportError:
17
+ message = "collections.OrderedDict is missing: Install 'ordereddict'."
18
+ warnings.warn(message)
19
+ # -- BACKWARD-COMPATIBLE: Better than nothing (for behave use case).
20
+ OrderedDict = dict
@@ -0,0 +1,788 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ from __future__ import print_function
4
+ import argparse
5
+ import logging
6
+ import os
7
+ import re
8
+ import sys
9
+ import shlex
10
+ import six
11
+ from six.moves import configparser
12
+
13
+ from behave.model import ScenarioOutline
14
+ from behave.model_core import FileLocation
15
+ from behave.reporter.junit import JUnitReporter
16
+ from behave.reporter.summary import SummaryReporter
17
+ from behave.tag_expression import TagExpression
18
+ from behave.formatter.base import StreamOpener
19
+ from behave.formatter import _registry as _format_registry
20
+ from behave.userdata import UserData, parse_user_define
21
+ from behave._types import Unknown
22
+
23
+ # -- PYTHON 2/3 COMPATIBILITY:
24
+ # SINCE Python 3.2: ConfigParser = SafeConfigParser
25
+ ConfigParser = configparser.ConfigParser
26
+ if six.PY2:
27
+ ConfigParser = configparser.SafeConfigParser
28
+
29
+
30
+ # -----------------------------------------------------------------------------
31
+ # CONFIGURATION DATA TYPES:
32
+ # -----------------------------------------------------------------------------
33
+ class LogLevel(object):
34
+ names = [
35
+ "NOTSET", "CRITICAL", "FATAL", "ERROR",
36
+ "WARNING", "WARN", "INFO", "DEBUG",
37
+ ]
38
+
39
+ @staticmethod
40
+ def parse(levelname, unknown_level=None):
41
+ """
42
+ Convert levelname into a numeric log level.
43
+
44
+ :param levelname: Logging levelname (as string)
45
+ :param unknown_level: Used if levelname is unknown (optional).
46
+ :return: Numeric log-level or unknown_level, if levelname is unknown.
47
+ """
48
+ return getattr(logging, levelname.upper(), unknown_level)
49
+
50
+ @classmethod
51
+ def parse_type(cls, levelname):
52
+ level = cls.parse(levelname, Unknown)
53
+ if level is Unknown:
54
+ message = "%s is unknown, use: %s" % \
55
+ (levelname, ", ".join(cls.names[1:]))
56
+ raise argparse.ArgumentTypeError(message)
57
+ return level
58
+
59
+ @staticmethod
60
+ def to_string(level):
61
+ return logging.getLevelName(level)
62
+
63
+
64
+ class ConfigError(Exception):
65
+ pass
66
+
67
+
68
+ # -----------------------------------------------------------------------------
69
+ # CONFIGURATION SCHEMA:
70
+ # -----------------------------------------------------------------------------
71
+ options = [
72
+ (("-c", "--no-color"),
73
+ dict(action="store_false", dest="color",
74
+ help="Disable the use of ANSI color escapes.")),
75
+
76
+ (("--color",),
77
+ dict(action="store_true", dest="color",
78
+ help="""Use ANSI color escapes. This is the default
79
+ behaviour. This switch is used to override a
80
+ configuration file setting.""")),
81
+
82
+ (("-d", "--dry-run"),
83
+ dict(action="store_true",
84
+ help="Invokes formatters without executing the steps.")),
85
+
86
+ (("-D", "--define"),
87
+ dict(dest="userdata_defines", type=parse_user_define, action="append",
88
+ metavar="NAME=VALUE",
89
+ help="""Define user-specific data for the config.userdata dictionary.
90
+ Example: -D foo=bar to store it in config.userdata["foo"].""")),
91
+
92
+ (("-e", "--exclude"),
93
+ dict(metavar="PATTERN", dest="exclude_re",
94
+ help="""Don't run feature files matching regular expression
95
+ PATTERN.""")),
96
+
97
+ (("-i", "--include"),
98
+ dict(metavar="PATTERN", dest="include_re",
99
+ help="Only run feature files matching regular expression PATTERN.")),
100
+
101
+ (("--no-junit",),
102
+ dict(action="store_false", dest="junit",
103
+ help="Don't output JUnit-compatible reports.")),
104
+
105
+ (("--junit",),
106
+ dict(action="store_true",
107
+ help="""Output JUnit-compatible reports.
108
+ When junit is enabled, all stdout and stderr
109
+ will be redirected and dumped to the junit report,
110
+ regardless of the "--capture" and "--no-capture" options.
111
+ """)),
112
+
113
+ (("--junit-directory",),
114
+ dict(metavar="PATH", dest="junit_directory",
115
+ default="reports",
116
+ help="""Directory in which to store JUnit reports.""")),
117
+
118
+ ((), # -- CONFIGFILE only
119
+ dict(dest="default_format",
120
+ help="Specify default formatter (default: pretty).")),
121
+
122
+
123
+ (("-f", "--format"),
124
+ dict(action="append",
125
+ help="""Specify a formatter. If none is specified the default
126
+ formatter is used. Pass "--format help" to get a
127
+ list of available formatters.""")),
128
+
129
+ (("--steps-catalog",),
130
+ dict(action="store_true", dest="steps_catalog",
131
+ help="""Show a catalog of all available step definitions.
132
+ SAME AS: --format=steps.catalog --dry-run --no-summary -q""")),
133
+
134
+ ((), # -- CONFIGFILE only
135
+ dict(dest="scenario_outline_annotation_schema",
136
+ help="""Specify name annotation schema for scenario outline
137
+ (default="{name} -- @{row.id} {examples.name}").""")),
138
+
139
+ (("-k", "--no-skipped"),
140
+ dict(action="store_false", dest="show_skipped",
141
+ help="Don't print skipped steps (due to tags).")),
142
+
143
+ (("--show-skipped",),
144
+ dict(action="store_true",
145
+ help="""Print skipped steps.
146
+ This is the default behaviour. This switch is used to
147
+ override a configuration file setting.""")),
148
+
149
+ (("--no-snippets",),
150
+ dict(action="store_false", dest="show_snippets",
151
+ help="Don't print snippets for unimplemented steps.")),
152
+ (("--snippets",),
153
+ dict(action="store_true", dest="show_snippets",
154
+ help="""Print snippets for unimplemented steps.
155
+ This is the default behaviour. This switch is used to
156
+ override a configuration file setting.""")),
157
+
158
+ (("-m", "--no-multiline"),
159
+ dict(action="store_false", dest="show_multiline",
160
+ help="""Don't print multiline strings and tables under
161
+ steps.""")),
162
+
163
+ (("--multiline", ),
164
+ dict(action="store_true", dest="show_multiline",
165
+ help="""Print multiline strings and tables under steps.
166
+ This is the default behaviour. This switch is used to
167
+ override a configuration file setting.""")),
168
+
169
+ (("-n", "--name"),
170
+ dict(action="append",
171
+ help="""Only execute the feature elements which match part
172
+ of the given name. If this option is given more
173
+ than once, it will match against all the given
174
+ names.""")),
175
+
176
+ (("--no-capture",),
177
+ dict(action="store_false", dest="stdout_capture",
178
+ help="""Don't capture stdout (any stdout output will be
179
+ printed immediately.)""")),
180
+
181
+ (("--capture",),
182
+ dict(action="store_true", dest="stdout_capture",
183
+ help="""Capture stdout (any stdout output will be
184
+ printed if there is a failure.)
185
+ This is the default behaviour. This switch is used to
186
+ override a configuration file setting.""")),
187
+
188
+ (("--no-capture-stderr",),
189
+ dict(action="store_false", dest="stderr_capture",
190
+ help="""Don't capture stderr (any stderr output will be
191
+ printed immediately.)""")),
192
+
193
+ (("--capture-stderr",),
194
+ dict(action="store_true", dest="stderr_capture",
195
+ help="""Capture stderr (any stderr output will be
196
+ printed if there is a failure.)
197
+ This is the default behaviour. This switch is used to
198
+ override a configuration file setting.""")),
199
+
200
+ (("--no-logcapture",),
201
+ dict(action="store_false", dest="log_capture",
202
+ help="""Don't capture logging. Logging configuration will
203
+ be left intact.""")),
204
+
205
+ (("--logcapture",),
206
+ dict(action="store_true", dest="log_capture",
207
+ help="""Capture logging. All logging during a step will be captured
208
+ and displayed in the event of a failure.
209
+ This is the default behaviour. This switch is used to
210
+ override a configuration file setting.""")),
211
+
212
+ (("--logging-level",),
213
+ dict(type=LogLevel.parse_type,
214
+ help="""Specify a level to capture logging at. The default
215
+ is INFO - capturing everything.""")),
216
+
217
+ (("--logging-format",),
218
+ dict(help="""Specify custom format to print statements. Uses the
219
+ same format as used by standard logging handlers. The
220
+ default is "%%(levelname)s:%%(name)s:%%(message)s".""")),
221
+
222
+ (("--logging-datefmt",),
223
+ dict(help="""Specify custom date/time format to print
224
+ statements.
225
+ Uses the same format as used by standard logging
226
+ handlers.""")),
227
+
228
+ (("--logging-filter",),
229
+ dict(help="""Specify which statements to filter in/out. By default,
230
+ everything is captured. If the output is too verbose, use
231
+ this option to filter out needless output.
232
+ Example: --logging-filter=foo will capture statements issued
233
+ ONLY to foo or foo.what.ever.sub but not foobar or other
234
+ logger. Specify multiple loggers with comma:
235
+ filter=foo,bar,baz.
236
+ If any logger name is prefixed with a minus, eg filter=-foo,
237
+ it will be excluded rather than included.""",
238
+ config_help="""Specify which statements to filter in/out. By default,
239
+ everything is captured. If the output is too verbose,
240
+ use this option to filter out needless output.
241
+ Example: ``logging_filter = foo`` will capture
242
+ statements issued ONLY to "foo" or "foo.what.ever.sub"
243
+ but not "foobar" or other logger. Specify multiple
244
+ loggers with comma: ``logging_filter = foo,bar,baz``.
245
+ If any logger name is prefixed with a minus, eg
246
+ ``logging_filter = -foo``, it will be excluded rather
247
+ than included.""")),
248
+
249
+ (("--logging-clear-handlers",),
250
+ dict(action="store_true",
251
+ help="Clear all other logging handlers.")),
252
+
253
+ (("--no-summary",),
254
+ dict(action="store_false", dest="summary",
255
+ help="""Don't display the summary at the end of the run.""")),
256
+
257
+ (("--summary",),
258
+ dict(action="store_true", dest="summary",
259
+ help="""Display the summary at the end of the run.""")),
260
+
261
+ (("-o", "--outfile"),
262
+ dict(action="append", dest="outfiles", metavar="FILE",
263
+ help="Write to specified file instead of stdout.")),
264
+
265
+ ((), # -- CONFIGFILE only
266
+ dict(action="append", dest="paths",
267
+ help="Specify default feature paths, used when none are provided.")),
268
+
269
+ (("-q", "--quiet"),
270
+ dict(action="store_true",
271
+ help="Alias for --no-snippets --no-source.")),
272
+
273
+ (("-s", "--no-source"),
274
+ dict(action="store_false", dest="show_source",
275
+ help="""Don't print the file and line of the step definition with the
276
+ steps.""")),
277
+
278
+ (("--show-source",),
279
+ dict(action="store_true", dest="show_source",
280
+ help="""Print the file and line of the step
281
+ definition with the steps. This is the default
282
+ behaviour. This switch is used to override a
283
+ configuration file setting.""")),
284
+
285
+ (("--stage",),
286
+ dict(help="""Defines the current test stage.
287
+ The test stage name is used as name prefix for the environment
288
+ file and the steps directory (instead of default path names).
289
+ """)),
290
+
291
+ (("--stop",),
292
+ dict(action="store_true",
293
+ help="Stop running tests at the first failure.")),
294
+
295
+ # -- DISABLE-UNUSED-OPTION: Not used anywhere.
296
+ # (("-S", "--strict"),
297
+ # dict(action="store_true",
298
+ # help="Fail if there are any undefined or pending steps.")),
299
+
300
+ ((), # -- CONFIGFILE only
301
+ dict(dest="default_tags", metavar="TAG_EXPRESSION",
302
+ help="""Define default tags when non are provided.
303
+ See --tags for more information.""")),
304
+
305
+ (("-t", "--tags"),
306
+ dict(action="append", metavar="TAG_EXPRESSION",
307
+ help="""Only execute features or scenarios with tags
308
+ matching TAG_EXPRESSION. Pass "--tags-help" for
309
+ more information.""",
310
+ config_help="""Only execute certain features or scenarios based
311
+ on the tag expression given. See below for how to code
312
+ tag expressions in configuration files.""")),
313
+
314
+ (("-T", "--no-timings"),
315
+ dict(action="store_false", dest="show_timings",
316
+ help="""Don't print the time taken for each step.""")),
317
+
318
+ (("--show-timings",),
319
+ dict(action="store_true", dest="show_timings",
320
+ help="""Print the time taken, in seconds, of each step after the
321
+ step has completed. This is the default behaviour. This
322
+ switch is used to override a configuration file
323
+ setting.""")),
324
+
325
+ (("-v", "--verbose"),
326
+ dict(action="store_true",
327
+ help="Show the files and features loaded.")),
328
+
329
+ (("-w", "--wip"),
330
+ dict(action="store_true",
331
+ help="""Only run scenarios tagged with "wip". Additionally: use the
332
+ "plain" formatter, do not capture stdout or logging output
333
+ and stop at the first failure.""")),
334
+
335
+ (("-x", "--expand"),
336
+ dict(action="store_true",
337
+ help="Expand scenario outline tables in output.")),
338
+
339
+ (("--lang",),
340
+ dict(metavar="LANG",
341
+ help="Use keywords for a language other than English.")),
342
+
343
+ (("--lang-list",),
344
+ dict(action="store_true",
345
+ help="List the languages available for --lang.")),
346
+
347
+ (("--lang-help",),
348
+ dict(metavar="LANG",
349
+ help="List the translations accepted for one language.")),
350
+
351
+ (("--tags-help",),
352
+ dict(action="store_true",
353
+ help="Show help for tag expressions.")),
354
+
355
+ (("--version",),
356
+ dict(action="store_true", help="Show version.")),
357
+ ]
358
+
359
+ # -- OPTIONS: With raw value access semantics in configuration file.
360
+ raw_value_options = frozenset([
361
+ "logging_format",
362
+ "logging_datefmt",
363
+ # -- MAYBE: "scenario_outline_annotation_schema",
364
+ ])
365
+
366
+
367
+ def read_configuration(path):
368
+ # pylint: disable=too-many-locals, too-many-branches
369
+ config = ConfigParser()
370
+ config.optionxform = str # -- SUPPORT: case-sensitive keys
371
+ config.read(path)
372
+ config_dir = os.path.dirname(path)
373
+ result = {}
374
+ for fixed, keywords in options:
375
+ if "dest" in keywords:
376
+ dest = keywords["dest"]
377
+ else:
378
+ for opt in fixed:
379
+ if opt.startswith("--"):
380
+ dest = opt[2:].replace("-", "_")
381
+ else:
382
+ assert len(opt) == 2
383
+ dest = opt[1:]
384
+ if dest in "tags_help lang_list lang_help version".split():
385
+ continue
386
+ if not config.has_option("behave", dest):
387
+ continue
388
+ action = keywords.get("action", "store")
389
+ if action == "store":
390
+ use_raw_value = dest in raw_value_options
391
+ result[dest] = config.get("behave", dest, raw=use_raw_value)
392
+ elif action in ("store_true", "store_false"):
393
+ result[dest] = config.getboolean("behave", dest)
394
+ elif action == "append":
395
+ if dest == "userdata_defines":
396
+ continue # -- SKIP-CONFIGFILE: Command-line only option.
397
+ result[dest] = \
398
+ [s.strip() for s in config.get("behave", dest).splitlines()]
399
+ else:
400
+ raise ValueError('action "%s" not implemented' % action)
401
+
402
+ # -- STEP: format/outfiles coupling
403
+ if "format" in result:
404
+ # -- OPTIONS: format/outfiles are coupled in configuration file.
405
+ formatters = result["format"]
406
+ formatter_size = len(formatters)
407
+ outfiles = result.get("outfiles", [])
408
+ outfiles_size = len(outfiles)
409
+ if outfiles_size < formatter_size:
410
+ for formatter_name in formatters[outfiles_size:]:
411
+ outfile = "%s.output" % formatter_name
412
+ outfiles.append(outfile)
413
+ result["outfiles"] = outfiles
414
+ elif len(outfiles) > formatter_size:
415
+ print("CONFIG-ERROR: Too many outfiles (%d) provided." %
416
+ outfiles_size)
417
+ result["outfiles"] = outfiles[:formatter_size]
418
+
419
+ for paths_name in ("paths", "outfiles"):
420
+ if paths_name in result:
421
+ # -- Evaluate relative paths relative to location.
422
+ # NOTE: Absolute paths are preserved by os.path.join().
423
+ paths = result[paths_name]
424
+ result[paths_name] = \
425
+ [os.path.normpath(os.path.join(config_dir, p)) for p in paths]
426
+
427
+ # -- STEP: Special additional configuration sections.
428
+ # SCHEMA: config_section: data_name
429
+ special_config_section_map = {
430
+ "behave.formatters": "more_formatters",
431
+ "behave.userdata": "userdata",
432
+ }
433
+ for section_name, data_name in special_config_section_map.items():
434
+ result[data_name] = {}
435
+ if config.has_section(section_name):
436
+ result[data_name].update(config.items(section_name))
437
+
438
+ return result
439
+
440
+
441
+ def config_filenames():
442
+ paths = ["./", os.path.expanduser("~")]
443
+ if sys.platform in ("cygwin", "win32") and "APPDATA" in os.environ:
444
+ paths.append(os.path.join(os.environ["APPDATA"]))
445
+
446
+ for path in reversed(paths):
447
+ for filename in reversed(
448
+ ("behave.ini", ".behaverc", "setup.cfg", "tox.ini")):
449
+ filename = os.path.join(path, filename)
450
+ if os.path.isfile(filename):
451
+ yield filename
452
+
453
+
454
+ def load_configuration(defaults, verbose=False):
455
+ for filename in config_filenames():
456
+ if verbose:
457
+ print('Loading config defaults from "%s"' % filename)
458
+ defaults.update(read_configuration(filename))
459
+
460
+ if verbose:
461
+ print("Using defaults:")
462
+ for k, v in six.iteritems(defaults):
463
+ print("%15s %s" % (k, v))
464
+
465
+
466
+ def setup_parser():
467
+ # construct the parser
468
+ # usage = "%(prog)s [options] [ [FILE|DIR|URL][:LINE[:LINE]*] ]+"
469
+ usage = "%(prog)s [options] [ [DIR|FILE|FILE:LINE] ]+"
470
+ description = """\
471
+ Run a number of feature tests with behave."""
472
+ more = """
473
+ EXAMPLES:
474
+ behave features/
475
+ behave features/one.feature features/two.feature
476
+ behave features/one.feature:10
477
+ behave @features.txt
478
+ """
479
+ parser = argparse.ArgumentParser(usage=usage, description=description)
480
+ for fixed, keywords in options:
481
+ if not fixed:
482
+ continue # -- CONFIGFILE only.
483
+ if "config_help" in keywords:
484
+ keywords = dict(keywords)
485
+ del keywords["config_help"]
486
+ parser.add_argument(*fixed, **keywords)
487
+ parser.add_argument("paths", nargs="*",
488
+ help="Feature directory, file or file location (FILE:LINE).")
489
+ return parser
490
+
491
+
492
+ class Configuration(object):
493
+ """Configuration object for behave and behave runners."""
494
+ # pylint: disable=too-many-instance-attributes
495
+ defaults = dict(
496
+ color=sys.platform != "win32",
497
+ show_snippets=True,
498
+ show_skipped=True,
499
+ dry_run=False,
500
+ show_source=True,
501
+ show_timings=True,
502
+ stdout_capture=True,
503
+ stderr_capture=True,
504
+ log_capture=True,
505
+ logging_format="%(levelname)s:%(name)s:%(message)s",
506
+ logging_level=logging.INFO,
507
+ steps_catalog=False,
508
+ summary=True,
509
+ junit=False,
510
+ stage=None,
511
+ userdata={},
512
+ # -- SPECIAL:
513
+ default_format="pretty", # -- Used when no formatters are configured.
514
+ default_tags="", # -- Used when no tags are defined.
515
+ scenario_outline_annotation_schema=u"{name} -- @{row.id} {examples.name}"
516
+ )
517
+ cmdline_only_options = set("userdata_defines")
518
+
519
+ def __init__(self, command_args=None, load_config=True, verbose=None,
520
+ **kwargs):
521
+ """
522
+ Constructs a behave configuration object.
523
+ * loads the configuration defaults (if needed).
524
+ * process the command-line args
525
+ * store the configuration results
526
+
527
+ :param command_args: Provide command args (as sys.argv).
528
+ If command_args is None, sys.argv[1:] is used.
529
+ :type command_args: list<str>, str
530
+ :param load_config: Indicate if configfile should be loaded (=true)
531
+ :param verbose: Indicate if diagnostic output is enabled
532
+ :param kwargs: Used to hand-over/overwrite default values.
533
+ """
534
+ # pylint: disable=too-many-branches, too-many-statements
535
+ if command_args is None:
536
+ command_args = sys.argv[1:]
537
+ elif isinstance(command_args, six.string_types):
538
+ if six.PY2 and isinstance(command_args, six.text_type):
539
+ command_args = command_args.encode("utf-8")
540
+ elif six.PY3 and isinstance(command_args, six.binary_type):
541
+ command_args = command_args.decode("utf-8")
542
+ command_args = shlex.split(command_args)
543
+ if verbose is None:
544
+ # -- AUTO-DISCOVER: Verbose mode from command-line args.
545
+ verbose = ("-v" in command_args) or ("--verbose" in command_args)
546
+
547
+ self.version = None
548
+ self.tags_help = None
549
+ self.lang_list = None
550
+ self.lang_help = None
551
+ self.default_tags = None
552
+ self.junit = None
553
+ self.logging_format = None
554
+ self.logging_datefmt = None
555
+ self.name = None
556
+ self.scope = None
557
+ self.steps_catalog = None
558
+ self.userdata = None
559
+ self.wip = None
560
+
561
+ defaults = self.defaults.copy()
562
+ for name, value in six.iteritems(kwargs):
563
+ defaults[name] = value
564
+ self.defaults = defaults
565
+ self.formatters = []
566
+ self.reporters = []
567
+ self.name_re = None
568
+ self.outputs = []
569
+ self.include_re = None
570
+ self.exclude_re = None
571
+ self.scenario_outline_annotation_schema = None # pylint: disable=invalid-name
572
+ self.steps_dir = "steps"
573
+ self.environment_file = "environment.py"
574
+ self.userdata_defines = None
575
+ self.more_formatters = None
576
+ if load_config:
577
+ load_configuration(self.defaults, verbose=verbose)
578
+ parser = setup_parser()
579
+ parser.set_defaults(**self.defaults)
580
+ args = parser.parse_args(command_args)
581
+ for key, value in six.iteritems(args.__dict__):
582
+ if key.startswith("_") and key not in self.cmdline_only_options:
583
+ continue
584
+ setattr(self, key, value)
585
+
586
+ self.paths = [os.path.normpath(path) for path in self.paths]
587
+ self.setup_outputs(args.outfiles)
588
+
589
+ if self.steps_catalog:
590
+ # -- SHOW STEP-CATALOG: As step summary.
591
+ self.default_format = "steps.catalog"
592
+ self.format = ["steps.catalog"]
593
+ self.dry_run = True
594
+ self.summary = False
595
+ self.show_skipped = False
596
+ self.quiet = True
597
+
598
+ if self.wip:
599
+ # Only run scenarios tagged with "wip".
600
+ # Additionally:
601
+ # * use the "plain" formatter (per default)
602
+ # * do not capture stdout or logging output and
603
+ # * stop at the first failure.
604
+ self.default_format = "plain"
605
+ self.tags = ["wip"] + self.default_tags.split()
606
+ self.color = False
607
+ self.stop = True
608
+ self.log_capture = False
609
+ self.stdout_capture = False
610
+
611
+ self.tags = TagExpression(self.tags or self.default_tags.split())
612
+
613
+ if self.quiet:
614
+ self.show_source = False
615
+ self.show_snippets = False
616
+
617
+ if self.exclude_re:
618
+ self.exclude_re = re.compile(self.exclude_re)
619
+
620
+ if self.include_re:
621
+ self.include_re = re.compile(self.include_re)
622
+ if self.name:
623
+ # -- SELECT: Scenario-by-name, build regular expression.
624
+ self.name_re = self.build_name_re(self.name)
625
+
626
+ if self.stage is None: # pylint: disable=access-member-before-definition
627
+ # -- USE ENVIRONMENT-VARIABLE, if stage is undefined.
628
+ self.stage = os.environ.get("BEHAVE_STAGE", None)
629
+ self.setup_stage(self.stage)
630
+ self.setup_model()
631
+ self.setup_userdata()
632
+
633
+ # -- FINALLY: Setup Reporters and Formatters
634
+ # NOTE: Reporters and Formatters can now use userdata information.
635
+ if self.junit:
636
+ # Buffer the output (it will be put into Junit report)
637
+ self.stdout_capture = True
638
+ self.stderr_capture = True
639
+ self.log_capture = True
640
+ self.reporters.append(JUnitReporter(self))
641
+ if self.summary:
642
+ self.reporters.append(SummaryReporter(self))
643
+
644
+ self.setup_formats()
645
+ unknown_formats = self.collect_unknown_formats()
646
+ if unknown_formats:
647
+ parser.error("format=%s is unknown" % ", ".join(unknown_formats))
648
+
649
+
650
+ def setup_outputs(self, args_outfiles=None):
651
+ if self.outputs:
652
+ assert not args_outfiles, "ONLY-ONCE"
653
+ return
654
+
655
+ # -- NORMAL CASE: Setup only initially (once).
656
+ if not args_outfiles:
657
+ self.outputs.append(StreamOpener(stream=sys.stdout))
658
+ else:
659
+ for outfile in args_outfiles:
660
+ if outfile and outfile != "-":
661
+ self.outputs.append(StreamOpener(outfile))
662
+ else:
663
+ self.outputs.append(StreamOpener(stream=sys.stdout))
664
+
665
+ def setup_formats(self):
666
+ """Register more, user-defined formatters by name."""
667
+ if self.more_formatters:
668
+ for name, scoped_class_name in self.more_formatters.items():
669
+ _format_registry.register_as(name, scoped_class_name)
670
+
671
+ def collect_unknown_formats(self):
672
+ unknown_formats = []
673
+ if self.format:
674
+ for format_name in self.format:
675
+ if (format_name == "help" or
676
+ _format_registry.is_formatter_valid(format_name)):
677
+ continue
678
+ unknown_formats.append(format_name)
679
+ return unknown_formats
680
+
681
+ @staticmethod
682
+ def build_name_re(names):
683
+ """
684
+ Build regular expression for scenario selection by name
685
+ by using a list of name parts or name regular expressions.
686
+
687
+ :param names: List of name parts or regular expressions (as text).
688
+ :return: Compiled regular expression to use.
689
+ """
690
+ # -- NOTE: re.LOCALE is removed in Python 3.6 (deprecated in Python 3.5)
691
+ # flags = (re.UNICODE | re.LOCALE)
692
+ pattern = u"|".join(names)
693
+ return re.compile(pattern, flags=re.UNICODE)
694
+
695
+ def exclude(self, filename):
696
+ if isinstance(filename, FileLocation):
697
+ filename = six.text_type(filename)
698
+
699
+ if self.include_re and self.include_re.search(filename) is None:
700
+ return True
701
+ if self.exclude_re and self.exclude_re.search(filename) is not None:
702
+ return True
703
+ return False
704
+
705
+ def setup_logging(self, level=None, configfile=None, **kwargs):
706
+ """
707
+ Support simple setup of logging subsystem.
708
+ Ensures that the logging level is set.
709
+ But note that the logging setup can only occur once.
710
+
711
+ SETUP MODES:
712
+ * :func:`logging.config.fileConfig()`, if ``configfile`` is provided.
713
+ * :func:`logging.basicConfig()`, otherwise.
714
+
715
+ .. code-block: python
716
+ # -- FILE: features/environment.py
717
+ def before_all(context):
718
+ context.config.setup_logging()
719
+
720
+ :param level: Logging level of root logger.
721
+ If None, use :attr:`logging_level` value.
722
+ :param configfile: Configuration filename for fileConfig() setup.
723
+ :param kwargs: Passed to :func:`logging.basicConfig()`
724
+ """
725
+ if level is None:
726
+ level = self.logging_level # pylint: disable=no-member
727
+
728
+ if configfile:
729
+ from logging.config import fileConfig
730
+ fileConfig(configfile)
731
+ else:
732
+ # pylint: disable=no-member
733
+ format_ = kwargs.pop("format", self.logging_format)
734
+ datefmt = kwargs.pop("datefmt", self.logging_datefmt)
735
+ logging.basicConfig(format=format_, datefmt=datefmt, **kwargs)
736
+ # -- ENSURE: Default log level is set
737
+ # (even if logging subsystem is already configured).
738
+ logging.getLogger().setLevel(level)
739
+
740
+ def setup_model(self):
741
+ if self.scenario_outline_annotation_schema:
742
+ name_schema = six.text_type(self.scenario_outline_annotation_schema)
743
+ ScenarioOutline.annotation_schema = name_schema.strip()
744
+
745
+ def setup_stage(self, stage=None):
746
+ """Setup the test stage that selects a different set of
747
+ steps and environment implementations.
748
+
749
+ :param stage: Name of current test stage (as string or None).
750
+
751
+ EXAMPLE::
752
+
753
+ # -- SETUP DEFAULT TEST STAGE (unnamed):
754
+ config = Configuration()
755
+ config.setup_stage()
756
+ assert config.steps_dir == "steps"
757
+ assert config.environment_file == "environment.py"
758
+
759
+ # -- SETUP PRODUCT TEST STAGE:
760
+ config.setup_stage("product")
761
+ assert config.steps_dir == "product_steps"
762
+ assert config.environment_file == "product_environment.py"
763
+ """
764
+ steps_dir = "steps"
765
+ environment_file = "environment.py"
766
+ if stage:
767
+ # -- USE A TEST STAGE: Select different set of implementations.
768
+ prefix = stage + "_"
769
+ steps_dir = prefix + steps_dir
770
+ environment_file = prefix + environment_file
771
+ self.steps_dir = steps_dir
772
+ self.environment_file = environment_file
773
+
774
+ def setup_userdata(self):
775
+ if not isinstance(self.userdata, UserData):
776
+ self.userdata = UserData(self.userdata)
777
+ if self.userdata_defines:
778
+ # -- ENSURE: Cmd-line overrides configuration file parameters.
779
+ self.userdata.update(self.userdata_defines)
780
+
781
+ def update_userdata(self, data):
782
+ """Update userdata with data and reapply userdata defines (cmdline).
783
+ :param data: Provides (partial) userdata (as dict)
784
+ """
785
+ self.userdata.update(data)
786
+ if self.userdata_defines:
787
+ # -- REAPPLY: Cmd-line defines (override configuration file data).
788
+ self.userdata.update(self.userdata_defines)