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,23 @@
1
+ Copyright (c) 2012-2014 Benno Rice, Richard Jones, Jens Engel and others, except where noted.
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without
5
+ modification, are permitted provided that the following conditions
6
+ are met:
7
+
8
+ 1. Redistributions of source code must retain the above copyright
9
+ notice, this list of conditions and the following disclaimer.
10
+ 2. Redistributions in binary form must reproduce the above copyright
11
+ notice, this list of conditions and the following disclaimer in the
12
+ documentation and/or other materials provided with the distribution.
13
+
14
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
15
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16
+ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17
+ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
18
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19
+ NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,37 @@
1
+ include README.rst
2
+ include CHANGES.rst
3
+ include MANIFEST.in
4
+ include LICENSE
5
+ include .coveragerc
6
+ include .editorconfig
7
+ include .pycheckrc
8
+ include .pylintrc
9
+ include *.cfg
10
+ include *.ini
11
+ include *.py
12
+ include *.rst
13
+ include *.txt
14
+ include *.yml
15
+ include *.yaml
16
+ include bin/behave*
17
+ include bin/invoke*
18
+ recursive-include .ci *.yml
19
+ recursive-include bin *.py *.cmd *.sh *.zip *.yml
20
+ recursive-include behave4cmd0 *.py
21
+ recursive-include etc *.xsd *.txt *.json-schema
22
+ recursive-include examples *.py *.feature *.txt *.rst *.ini
23
+ recursive-include docs *.rst *.txt *.css *.py *.html *.rst-* *.png Makefile
24
+ recursive-include docs/_themes *.html *.conf *.css *.css_t LICENSE*
25
+ recursive-include test *.py
26
+ recursive-include tests *.py *.txt
27
+ recursive-include tasks *.py *.zip *.txt *.rst
28
+ recursive-include tools *.feature *.py *.yml *.sh
29
+ recursive-include features *.feature *.py *.txt
30
+ recursive-include issue.features *.feature *.py *.txt
31
+ recursive-include more.features *.feature *.py *.txt
32
+ recursive-include py.requirements *.txt
33
+
34
+ prune .tox
35
+ prune .venv*
36
+ prune paver_ext
37
+ exclude pavement.py
@@ -0,0 +1,21 @@
1
+ Project Info
2
+ ===============================================================================
3
+
4
+ =============== ===============================================================
5
+ Category Hyperlink
6
+ =============== ===============================================================
7
+ Documentation: http://pythonhosted.org/behave/
8
+ (or: http://behave.readthedocs.org/ for latest and stable)
9
+ Download: http://pypi.python.org/pypi/behave (or: `github archive`_)
10
+ Development: https://github.com/behave/behave
11
+ Issue Tracker: https://github.com/behave/behave/issues
12
+ Changelog: `CHANGES.rst <CHANGES.rst>`_
13
+ Newsgroup: https://groups.google.com/forum/#!forum/behave-users
14
+ =============== ===============================================================
15
+
16
+ .. hint::
17
+
18
+ The PyPI version is the latest stable version.
19
+ Otherwise, use the latest stable tag or the "bleeding edge" from Github.
20
+
21
+ .. _`github archive`: https://github.com/behave/behave/tags
@@ -0,0 +1,112 @@
1
+ ======
2
+ Behave
3
+ ======
4
+
5
+ .. image:: https://badges.gitter.im/Join%20Chat.svg
6
+ :alt: Join the chat at https://gitter.im/behave/behave
7
+ :target: https://gitter.im/behave/behave?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge
8
+
9
+ .. image:: https://img.shields.io/travis/behave/behave/master.svg
10
+ :target: https://travis-ci.org/behave/behave
11
+ :alt: Travis CI Build Status
12
+
13
+ .. image:: https://img.shields.io/pypi/v/behave.svg
14
+ :target: https://pypi.python.org/pypi/behave
15
+ :alt: Latest Version
16
+
17
+ .. image:: https://img.shields.io/pypi/dm/behave.svg
18
+ :target: https://pypi.python.org/pypi/behave
19
+ :alt: Downloads
20
+
21
+ .. image:: https://img.shields.io/pypi/l/behave.svg
22
+ :target: https://pypi.python.org/pypi/behave/
23
+ :alt: License
24
+
25
+ .. |logo| image:: https://raw.github.com/behave/behave/master/docs/_static/behave_logo1.png
26
+
27
+ behave is behavior-driven development, Python style.
28
+
29
+ |logo|
30
+
31
+ Behavior-driven development (or BDD) is an agile software development
32
+ technique that encourages collaboration between developers, QA and
33
+ non-technical or business participants in a software project.
34
+
35
+ *behave* uses tests written in a natural language style, backed up by Python
36
+ code.
37
+
38
+ First, `install *behave*.`_
39
+
40
+
41
+ Now make a directory called "features/".
42
+ In that directory create a file called "example.feature" containing:
43
+
44
+ .. code-block:: gherkin
45
+
46
+ # -- FILE: features/example.feature
47
+ Feature: Showing off behave
48
+
49
+ Scenario: Run a simple test
50
+ Given we have behave installed
51
+ When we implement 5 tests
52
+ Then behave will test them for us!
53
+
54
+ Make a new directory called "features/steps/".
55
+ In that directory create a file called "example_steps.py" containing:
56
+
57
+ .. code-block:: python
58
+
59
+ # -- FILE: features/steps/example_steps.py
60
+ from behave import given, when, then, step
61
+
62
+ @given('we have behave installed')
63
+ def step_impl(context):
64
+ pass
65
+
66
+ @when('we implement {number:d} tests')
67
+ def step_impl(context, number): # -- NOTE: number is converted into integer
68
+ assert number > 1 or number == 0
69
+ context.tests_count = number
70
+
71
+ @then('behave will test them for us!')
72
+ def step_impl(context):
73
+ assert context.failed is False
74
+ assert context.tests_count >= 0
75
+
76
+ Run behave:
77
+
78
+ .. code-block:: bash
79
+
80
+ $ behave
81
+ Feature: Showing off behave # features/example.feature:2
82
+
83
+ Scenario: Run a simple test # features/example.feature:4
84
+ Given we have behave installed # features/steps/example_steps.py:4
85
+ When we implement 5 tests # features/steps/example_steps.py:8
86
+ Then behave will test them for us! # features/steps/example_steps.py:13
87
+
88
+ 1 feature passed, 0 failed, 0 skipped
89
+ 1 scenario passed, 0 failed, 0 skipped
90
+ 3 steps passed, 0 failed, 0 skipped, 0 undefined
91
+
92
+ Now, continue reading to learn how to get the most out of *behave*. To get started,
93
+ we recommend the `tutorial`_ and then the `feature testing language`_ and
94
+ `api`_ references.
95
+
96
+
97
+ .. _`Install *behave*.`: http://pythonhosted.org/behave/install.html
98
+ .. _`tutorial`: http://pythonhosted.org/behave/tutorial.html#features
99
+ .. _`feature testing language`: http://pythonhosted.org/behave/gherkin.html
100
+ .. _`api`: http://pythonhosted.org/behave/api.html
101
+
102
+
103
+ More Information
104
+ -------------------------------------------------------------------------------
105
+
106
+ * `behave documentation`_ (`latest changes`_)
107
+ * `behave.example`_: Behave Examples and Tutorials (docs, executable examples).
108
+
109
+ .. _behave documentation: http://pythonhosted.org/behave/
110
+ .. _latest changes: https://github.com/behave/behave/blob/master/CHANGES.rst
111
+ .. _behave.example: https://github.com/behave/behave.example
112
+
@@ -0,0 +1 @@
1
+ 1.2.6.dev0
@@ -0,0 +1,22 @@
1
+ # =============================================================================
2
+ # BEHAVE CONFIGURATION
3
+ # =============================================================================
4
+ # FILE: .behaverc, behave.ini, setup.cfg, tox.ini
5
+ #
6
+ # SEE ALSO:
7
+ # * http://packages.python.org/behave/behave.html#configuration-files
8
+ # * https://github.com/behave/behave
9
+ # * http://pypi.python.org/pypi/behave/
10
+ # =============================================================================
11
+
12
+ [behave]
13
+ default_tags = -@xfail -@not_implemented
14
+ show_skipped = false
15
+ format = rerun
16
+ progress3
17
+ outfiles = rerun.txt
18
+ reports/report_progress3.txt
19
+ junit = true
20
+ logging_level = INFO
21
+ # logging_format = LOG.%(levelname)-8s %(name)-10s: %(message)s
22
+ # logging_format = LOG.%(levelname)-8s %(asctime)s %(name)-10s: %(message)s
@@ -0,0 +1,30 @@
1
+ # -*- coding: UTF-8 -*-
2
+ """behave is behaviour-driven development, Python style
3
+
4
+ Behavior-driven development (or BDD) is an agile software development
5
+ technique that encourages collaboration between developers, QA and
6
+ non-technical or business participants in a software project.
7
+
8
+ *behave* uses tests written in a natural language style, backed up by Python
9
+ code.
10
+
11
+ To get started, we recommend the `tutorial`_ and then the `test language`_ and
12
+ `api`_ references.
13
+
14
+ .. _`tutorial`: tutorial.html
15
+ .. _`test language`: gherkin.html
16
+ .. _`api`: api.html
17
+ """
18
+
19
+ from __future__ import absolute_import
20
+ from behave.step_registry import * # pylint: disable=wildcard-import
21
+ from behave.matchers import use_step_matcher, step_matcher, register_type
22
+
23
+ # pylint: disable=undefined-all-variable
24
+ __all__ = [
25
+ "given", "when", "then", "step", "use_step_matcher", "register_type",
26
+ "Given", "When", "Then", "Step",
27
+ # -- DEPRECATING:
28
+ "step_matcher"
29
+ ]
30
+ __version__ = '1.2.6.dev0'
@@ -0,0 +1,187 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ from __future__ import absolute_import, print_function
4
+ import codecs
5
+ import sys
6
+ import six
7
+ from behave import __version__
8
+ from behave.configuration import Configuration, ConfigError
9
+ from behave.parser import ParserError
10
+ from behave.runner import Runner
11
+ from behave.runner_util import print_undefined_step_snippets, reset_runtime, \
12
+ InvalidFileLocationError, InvalidFilenameError, FileNotFoundError
13
+ from behave.textutil import compute_words_maxsize, text as _text
14
+
15
+
16
+ TAG_HELP = """
17
+ Scenarios inherit tags declared on the Feature level. The simplest
18
+ TAG_EXPRESSION is simply a tag::
19
+
20
+ --tags @dev
21
+
22
+ You may even leave off the "@" - behave doesn't mind.
23
+
24
+ When a tag in a tag expression starts with a ~, this represents boolean NOT::
25
+
26
+ --tags ~@dev
27
+
28
+ A tag expression can have several tags separated by a comma, which represents
29
+ logical OR::
30
+
31
+ --tags @dev,@wip
32
+
33
+ The --tags option can be specified several times, and this represents logical
34
+ AND, for instance this represents the boolean expression
35
+ "(@foo or not @bar) and @zap"::
36
+
37
+ --tags @foo,~@bar --tags @zap.
38
+
39
+ Beware that if you want to use several negative tags to exclude several tags
40
+ you have to use logical AND::
41
+
42
+ --tags ~@fixme --tags ~@buggy.
43
+ """.strip()
44
+
45
+ # TODO
46
+ # Positive tags can be given a threshold to limit the number of occurrences.
47
+ # Which can be practical if you are practicing Kanban or CONWIP. This will fail
48
+ # if there are more than 3 occurrences of the @qa tag:
49
+ #
50
+ # --tags @qa:3
51
+ # """.strip()
52
+
53
+
54
+ def run_behave(config, runner_class=None):
55
+ """Run behave with configuration.
56
+
57
+ :param config: Configuration object for behave.
58
+ :param runner_class: Runner class to use or none (use Runner class).
59
+ :return: 0, if successful. Non-zero on failure.
60
+
61
+ .. note:: BEST EFFORT, not intended for multi-threaded usage.
62
+ """
63
+ # pylint: disable=too-many-branches, too-many-statements, too-many-return-statements
64
+ if runner_class is None:
65
+ runner_class = Runner
66
+
67
+ if config.version:
68
+ print("behave " + __version__)
69
+ return 0
70
+
71
+ if config.tags_help:
72
+ print(TAG_HELP)
73
+ return 0
74
+
75
+ if config.lang_list:
76
+ from behave.i18n import languages
77
+ stdout = sys.stdout
78
+ if six.PY2:
79
+ # -- PYTHON2: Overcome implicit encode problems (encoding=ASCII).
80
+ stdout = codecs.getwriter("UTF-8")(sys.stdout)
81
+ iso_codes = languages.keys()
82
+ print("Languages available:")
83
+ for iso_code in sorted(iso_codes):
84
+ native = languages[iso_code]["native"][0]
85
+ name = languages[iso_code]["name"][0]
86
+ print(u"%s: %s / %s" % (iso_code, native, name), file=stdout)
87
+ return 0
88
+
89
+ if config.lang_help:
90
+ from behave.i18n import languages
91
+ if config.lang_help not in languages:
92
+ print("%s is not a recognised language: try --lang-list" % \
93
+ config.lang_help)
94
+ return 1
95
+ trans = languages[config.lang_help]
96
+ print(u"Translations for %s / %s" % (trans["name"][0],
97
+ trans["native"][0]))
98
+ for kw in trans:
99
+ if kw in "name native".split():
100
+ continue
101
+ print(u"%16s: %s" % (kw.title().replace("_", " "),
102
+ u", ".join(w for w in trans[kw] if w != "*")))
103
+ return 0
104
+
105
+ if not config.format:
106
+ config.format = [config.default_format]
107
+ elif config.format and "format" in config.defaults:
108
+ # -- CASE: Formatter are specified in behave configuration file.
109
+ # Check if formatter are provided on command-line, too.
110
+ if len(config.format) == len(config.defaults["format"]):
111
+ # -- NO FORMATTER on command-line: Add default formatter.
112
+ config.format.append(config.default_format)
113
+ if "help" in config.format:
114
+ print_formatters("Available formatters:")
115
+ return 0
116
+
117
+ if len(config.outputs) > len(config.format):
118
+ print("CONFIG-ERROR: More outfiles (%d) than formatters (%d)." % \
119
+ (len(config.outputs), len(config.format)))
120
+ return 1
121
+
122
+ # -- MAIN PART:
123
+ failed = True
124
+ try:
125
+ reset_runtime()
126
+ runner = runner_class(config)
127
+ failed = runner.run()
128
+ except ParserError as e:
129
+ print(u"ParserError: %s" % e)
130
+ except ConfigError as e:
131
+ print(u"ConfigError: %s" % e)
132
+ except FileNotFoundError as e:
133
+ print(u"FileNotFoundError: %s" % e)
134
+ except InvalidFileLocationError as e:
135
+ print(u"InvalidFileLocationError: %s" % e)
136
+ except InvalidFilenameError as e:
137
+ print(u"InvalidFilenameError: %s" % e)
138
+ except Exception as e:
139
+ # -- DIAGNOSTICS:
140
+ text = _text(e)
141
+ print(u"Exception %s: %s" % (e.__class__.__name__, text))
142
+ raise
143
+
144
+ if config.show_snippets and runner.undefined_steps:
145
+ print_undefined_step_snippets(runner.undefined_steps,
146
+ colored=config.color)
147
+
148
+ return_code = 0
149
+ if failed:
150
+ return_code = 1
151
+ return return_code
152
+
153
+ def print_formatters(title=None, stream=None):
154
+ """Prints the list of available formatters and their description.
155
+
156
+ :param title: Optional title (as string).
157
+ :param stream: Optional, output stream to use (default: sys.stdout).
158
+ """
159
+ from behave.formatter._registry import format_items
160
+ from operator import itemgetter
161
+
162
+ if stream is None:
163
+ stream = sys.stdout
164
+ if title:
165
+ stream.write(u"%s\n" % title)
166
+
167
+ format_items = sorted(format_items(resolved=True), key=itemgetter(0))
168
+ format_names = [item[0] for item in format_items]
169
+ column_size = compute_words_maxsize(format_names)
170
+ schema = u" %-"+ _text(column_size) +"s %s\n"
171
+ for name, formatter_class in format_items:
172
+ formatter_description = getattr(formatter_class, "description", "")
173
+ stream.write(schema % (name, formatter_description))
174
+
175
+
176
+ def main(args=None):
177
+ """Main function to run behave (as program).
178
+
179
+ :param args: Command-line args (or string) to use.
180
+ :return: 0, if successful. Non-zero, in case of errors/failures.
181
+ """
182
+ config = Configuration(args)
183
+ return run_behave(config)
184
+
185
+ if __name__ == "__main__":
186
+ # -- EXAMPLE: main("--version")
187
+ sys.exit(main())
@@ -0,0 +1,185 @@
1
+ # -*- coding: UTF-8 -*-
2
+ """
3
+ This module provides low-level helper functionality during step imports.
4
+
5
+ .. warn:: Do not use directly
6
+
7
+ It should not be used directly except in behave Runner classes
8
+ that need to provide the correct context (step_registry, matchers, etc.)
9
+ instead of using the global module specific variables.
10
+ """
11
+
12
+ from __future__ import absolute_import
13
+ from contextlib import contextmanager
14
+ from threading import Lock
15
+ from types import ModuleType
16
+ import os.path
17
+ import sys
18
+ from behave import step_registry as _step_registry
19
+ # from behave import matchers as _matchers
20
+ import six
21
+
22
+
23
+ # -----------------------------------------------------------------------------
24
+ # UTILITY FUNCTIONS:
25
+ # -----------------------------------------------------------------------------
26
+ def setup_api_with_step_decorators(module, step_registry):
27
+ _step_registry.setup_step_decorators(module, step_registry)
28
+
29
+ def setup_api_with_matcher_functions(module, matcher_factory):
30
+ module.use_step_matcher = matcher_factory.use_step_matcher
31
+ module.step_matcher = matcher_factory.use_step_matcher
32
+ module.register_type = matcher_factory.register_type
33
+
34
+ # -----------------------------------------------------------------------------
35
+ # FAKE MODULE CLASSES: For step imports
36
+ # -----------------------------------------------------------------------------
37
+ # class FakeModule(object):
38
+ class FakeModule(ModuleType):
39
+ ensure_fake = True
40
+
41
+ # -- SUPPORT FOR: behave.step_registry.setup_step_decorators()
42
+ def __setitem__(self, name, value):
43
+ assert "." not in name
44
+ setattr(self, name, value)
45
+
46
+
47
+ class StepRegistryModule(FakeModule):
48
+ """Provides a fake :mod:`behave.step_registry` module
49
+ that can be used during step imports.
50
+ """
51
+ __all__ = [
52
+ "given", "when", "then", "step",
53
+ "Given", "When", "Then", "Step",
54
+ ]
55
+
56
+ def __init__(self, step_registry):
57
+ super(StepRegistryModule, self).__init__("behave.step_registry")
58
+ self.registry = step_registry
59
+ setup_api_with_step_decorators(self, step_registry)
60
+
61
+
62
+ class StepMatchersModule(FakeModule):
63
+ __all__ = ["use_step_matcher", "register_type", "step_matcher"]
64
+
65
+ def __init__(self, matcher_factory):
66
+ super(StepMatchersModule, self).__init__("behave.matchers")
67
+ self.matcher_factory = matcher_factory
68
+ setup_api_with_matcher_functions(self, matcher_factory)
69
+ self.use_default_step_matcher = matcher_factory.use_default_step_matcher
70
+ self.get_matcher = matcher_factory.make_matcher
71
+ # self.matcher_mapping = matcher_mapping or _matchers.matcher_mapping.copy()
72
+ # self.current_matcher = current_matcher or _matchers.current_matcher
73
+
74
+ # -- INJECT PYTHON PACKAGE META-DATA:
75
+ # REQUIRED-FOR: Non-fake submodule imports (__path__).
76
+ here = os.path.dirname(__file__)
77
+ self.__file__ = os.path.abspath(os.path.join(here, "matchers.py"))
78
+ self.__name__ = "behave.matchers"
79
+ # self.__path__ = [os.path.abspath(here)]
80
+
81
+ # def use_step_matcher(self, name):
82
+ # self.matcher_factory.use_step_matcher(name)
83
+ # # self.current_matcher = self.matcher_mapping[name]
84
+ #
85
+ # def use_default_step_matcher(self, name=None):
86
+ # self.matcher_factory.use_default_step_matcher(name=None)
87
+ #
88
+ # def get_matcher(self, func, string):
89
+ # # return self.current_matcher
90
+ # return self.matcher_factory.make_matcher(func, string)
91
+ #
92
+ # def register_type(self, **kwargs):
93
+ # # _matchers.register_type(**kwargs)
94
+ # self.matcher_factory.register_type(**kwargs)
95
+ #
96
+ # step_matcher = use_step_matcher
97
+
98
+
99
+ class BehaveModule(FakeModule):
100
+ __all__ = StepRegistryModule.__all__ + StepMatchersModule.__all__
101
+
102
+ def __init__(self, step_registry, matcher_factory=None):
103
+ if matcher_factory is None:
104
+ matcher_factory = step_registry.step_matcher_factory
105
+ assert matcher_factory is not None
106
+ super(BehaveModule, self).__init__("behave")
107
+ setup_api_with_step_decorators(self, step_registry)
108
+ setup_api_with_matcher_functions(self, matcher_factory)
109
+ self.use_default_step_matcher = matcher_factory.use_default_step_matcher
110
+ assert step_registry.matcher_factory == matcher_factory
111
+
112
+ # -- INJECT PYTHON PACKAGE META-DATA:
113
+ # REQUIRED-FOR: Non-fake submodule imports (__path__).
114
+ here = os.path.dirname(__file__)
115
+ self.__file__ = os.path.abspath(os.path.join(here, "__init__.py"))
116
+ self.__name__ = "behave"
117
+ self.__path__ = [os.path.abspath(here)]
118
+ self.__package__ = None
119
+
120
+
121
+ class StepImportModuleContext(object):
122
+
123
+ def __init__(self, step_container):
124
+ self.step_registry = step_container.step_registry
125
+ self.matcher_factory = step_container.matcher_factory
126
+ assert self.step_registry.matcher_factory == self.matcher_factory
127
+ self.step_registry.matcher_factory = self.matcher_factory
128
+
129
+ step_registry_module = StepRegistryModule(self.step_registry)
130
+ step_matchers_module = StepMatchersModule(self.matcher_factory)
131
+ behave_module = BehaveModule(self.step_registry, self.matcher_factory)
132
+ self.modules = {
133
+ "behave": behave_module,
134
+ "behave.matchers": step_matchers_module,
135
+ "behave.step_registry": step_registry_module,
136
+ }
137
+ # self.default_matcher = self.step_matchers_module.current_matcher
138
+
139
+ def reset_current_matcher(self):
140
+ self.matcher_factory.use_default_step_matcher()
141
+
142
+ _step_import_lock = Lock()
143
+ unknown = object()
144
+
145
+ @contextmanager
146
+ def use_step_import_modules(step_container):
147
+ """Redirect any step/type registration to the runner's step-context object
148
+ during step imports by using fake modules (instead of using module-globals).
149
+
150
+ This allows that multiple runners can be used without polluting the
151
+ global variables in problematic modules
152
+ (:mod:`behave.step_registry`, mod:`behave.matchers`).
153
+
154
+ .. sourcecode:: python
155
+
156
+ # -- RUNNER-IMPLEMENTATION:
157
+ def load_step_definitions(self, ...):
158
+ step_container = self.step_container
159
+ with use_step_import_modules(step_container) as import_context:
160
+ # -- USE: Fake modules during step imports
161
+ ...
162
+ import_context.reset_current_matcher()
163
+
164
+ :param step_container: Step context object with step_registry, matcher_factory.
165
+ """
166
+ orig_modules = {}
167
+ import_context = StepImportModuleContext(step_container)
168
+ with _step_import_lock:
169
+ # -- CRITICAL-SECTION (multi-threading protected)
170
+ try:
171
+ # -- SCOPE-GUARD SETUP: Replace original modules with fake ones.
172
+ for module_name, fake_module in six.iteritems(import_context.modules):
173
+ orig_module = sys.modules.get(module_name, unknown)
174
+ orig_modules[module_name] = orig_module
175
+ sys.modules[module_name] = fake_module
176
+
177
+ # -- USE: Fake modules for step imports.
178
+ yield import_context
179
+ finally:
180
+ # -- SCOPE-GUARD CLEANUP: Restore original modules.
181
+ for module_name, orig_module in six.iteritems(orig_modules):
182
+ if orig_module is unknown:
183
+ del sys.modules[module_name]
184
+ else:
185
+ sys.modules[module_name] = orig_module