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,30 @@
1
+ #!/bin/sh
2
+ # =============================================================================
3
+ # BOOTSTRAP PROJECT: Download all requirements
4
+ # =============================================================================
5
+ # : ${PIP_INDEX_URL="https://pypi.python.org/simple"}
6
+ # test ${PIP_DOWNLOADS_DIR} || mkdir -p ${PIP_DOWNLOADS_DIR}
7
+ # tox -e init
8
+ # export PIP_DOWNLOAD_DIR
9
+
10
+ set -e
11
+
12
+ # -- CONFIGURATION:
13
+ HERE=`dirname $0`
14
+ TOP="${HERE}/.."
15
+ : ${PIP_DOWNLOAD_DIR:="${TOP}/downloads"}
16
+ REQUIREMENTS_FILE=${TOP}/py.requirements/all.txt
17
+
18
+ if [ $# -ge 1 ]; then
19
+ PIP_DOWNLOAD_DIR="$1"
20
+ fi
21
+ if [ $# -ge 2 ]; then
22
+ REQUIREMENTS_FILE="$2"
23
+ fi
24
+
25
+ # -- EXECUTE STEPS:
26
+ echo "USING: PIP_DOWNLOAD_DIR=${PIP_DOWNLOAD_DIR}"
27
+ ${HERE}/toxcmd.py mkdir ${PIP_DOWNLOAD_DIR}
28
+ pip install --download=${PIP_DOWNLOAD_DIR} -r ${REQUIREMENTS_FILE}
29
+ ${HERE}/make_localpi.py ${PIP_DOWNLOAD_DIR}
30
+
@@ -0,0 +1,270 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: UTF-8 -*-
3
+ """
4
+ Provides a command container for additional tox commands, used in "tox.ini".
5
+
6
+ COMMANDS:
7
+
8
+ * copytree
9
+ * copy
10
+ * py2to3
11
+
12
+ REQUIRES:
13
+ * argparse
14
+ """
15
+
16
+ from glob import glob
17
+ import argparse
18
+ import inspect
19
+ import os.path
20
+ import shutil
21
+ import six
22
+ import sys
23
+
24
+ __author__ = "Jens Engel"
25
+ __copyright__ = "(c) 2013 by Jens Engel"
26
+ __license__ = "BSD"
27
+
28
+ # -----------------------------------------------------------------------------
29
+ # CONSTANTS:
30
+ # -----------------------------------------------------------------------------
31
+ VERSION = "0.1.0"
32
+ FORMATTER_CLASS = argparse.RawDescriptionHelpFormatter
33
+
34
+
35
+ # -----------------------------------------------------------------------------
36
+ # SUBCOMMAND: copytree
37
+ # -----------------------------------------------------------------------------
38
+ def command_copytree(args):
39
+ """
40
+ Copy one or more source directory(s) below a destination directory.
41
+ Parts of the destination directory path are created if needed.
42
+ Similar to the UNIX command: 'cp -R srcdir destdir'
43
+ """
44
+ for srcdir in args.srcdirs:
45
+ basename = os.path.basename(srcdir)
46
+ destdir2 = os.path.normpath(os.path.join(args.destdir, basename))
47
+ if os.path.exists(destdir2):
48
+ shutil.rmtree(destdir2)
49
+ sys.stdout.write("copytree: %s => %s\n" % (srcdir, destdir2))
50
+ shutil.copytree(srcdir, destdir2)
51
+ return 0
52
+
53
+
54
+ def setup_parser_copytree(parser):
55
+ parser.add_argument("srcdirs", nargs="+", help="Source directory(s)")
56
+ parser.add_argument("destdir", help="Destination directory")
57
+
58
+
59
+ command_copytree.usage = "%(prog)s srcdir... destdir"
60
+ command_copytree.short = "Copy source dir(s) below a destination directory."
61
+ command_copytree.setup_parser = setup_parser_copytree
62
+
63
+
64
+ # -----------------------------------------------------------------------------
65
+ # SUBCOMMAND: copy
66
+ # -----------------------------------------------------------------------------
67
+ def command_copy(args):
68
+ """
69
+ Copy one or more source-files(s) to a destpath (destfile or destdir).
70
+ Destdir mode is used if:
71
+ * More than one srcfile is provided
72
+ * Last parameter ends with a slash ("/").
73
+ * Last parameter is an existing directory
74
+
75
+ Destination directory path is created if needed.
76
+ Similar to the UNIX command: 'cp srcfile... destpath'
77
+ """
78
+ sources = args.sources
79
+ destpath = args.destpath
80
+ source_files = []
81
+ for file_ in sources:
82
+ if "*" in file_:
83
+ selected = glob(file_)
84
+ source_files.extend(selected)
85
+ elif os.path.isfile(file_):
86
+ source_files.append(file_)
87
+
88
+ if destpath.endswith("/") or os.path.isdir(destpath) or len(sources) > 1:
89
+ # -- DESTDIR-MODE: Last argument is a directory.
90
+ destdir = destpath
91
+ else:
92
+ # -- DESTFILE-MODE: Copy (and rename) one file.
93
+ assert len(source_files) == 1
94
+ destdir = os.path.dirname(destpath)
95
+
96
+ # -- WORK-HORSE: Copy one or more files to destpath.
97
+ if not os.path.isdir(destdir):
98
+ sys.stdout.write("copy: Create dir %s\n" % destdir)
99
+ os.makedirs(destdir)
100
+ for source in source_files:
101
+ destname = os.path.join(destdir, os.path.basename(source))
102
+ sys.stdout.write("copy: %s => %s\n" % (source, destname))
103
+ shutil.copy(source, destname)
104
+ return 0
105
+
106
+
107
+ def setup_parser_copy(parser):
108
+ parser.add_argument("sources", nargs="+", help="Source files.")
109
+ parser.add_argument("destpath", help="Destination path")
110
+
111
+
112
+ command_copy.usage = "%(prog)s sources... destpath"
113
+ command_copy.short = "Copy one or more source files to a destinition."
114
+ command_copy.setup_parser = setup_parser_copy
115
+
116
+
117
+ # -----------------------------------------------------------------------------
118
+ # SUBCOMMAND: mkdir
119
+ # -----------------------------------------------------------------------------
120
+ def command_mkdir(args):
121
+ """
122
+ Create a non-existing directory (or more ...).
123
+ If the directory exists, the step is skipped.
124
+ Similar to the UNIX command: 'mkdir -p dir'
125
+ """
126
+ errors = 0
127
+ for directory in args.dirs:
128
+ if os.path.exists(directory):
129
+ if not os.path.isdir(directory):
130
+ # -- SANITY CHECK: directory exists, but as file...
131
+ sys.stdout.write("mkdir: %s\n" % directory)
132
+ sys.stdout.write("ERROR: Exists already, but as file...\n")
133
+ errors += 1
134
+ else:
135
+ # -- NORMAL CASE: Directory does not exits yet.
136
+ assert not os.path.isdir(directory)
137
+ sys.stdout.write("mkdir: %s\n" % directory)
138
+ os.makedirs(directory)
139
+ return errors
140
+
141
+
142
+ def setup_parser_mkdir(parser):
143
+ parser.add_argument("dirs", nargs="+", help="Directory(s)")
144
+
145
+ command_mkdir.usage = "%(prog)s dir..."
146
+ command_mkdir.short = "Create non-existing directory (or more...)."
147
+ command_mkdir.setup_parser = setup_parser_mkdir
148
+
149
+ # -----------------------------------------------------------------------------
150
+ # SUBCOMMAND: py2to3
151
+ # -----------------------------------------------------------------------------
152
+ command_py2to3_work_around3k = six.PY3
153
+ def command_py2to3(args):
154
+ """
155
+ Apply '2to3' tool (Python2 to Python3 conversion tool) to Python sources.
156
+ """
157
+ from lib2to3.main import main
158
+ args2 = []
159
+ if command_py2to3_work_around3k:
160
+ if args.no_diffs:
161
+ args2.append("--no-diffs")
162
+ if args.write:
163
+ args2.append("-w")
164
+ if args.nobackups:
165
+ args2.append("-n")
166
+ args2.extend(args.sources)
167
+ sys.exit(main("lib2to3.fixes", args=args2))
168
+
169
+
170
+ def setup_parser4py2to3(parser):
171
+ if command_py2to3_work_around3k:
172
+ parser.add_argument("--no-diffs", action="store_true",
173
+ help="Don't show diffs of the refactoring")
174
+ parser.add_argument("-w", "--write", action="store_true",
175
+ help="Write back modified files")
176
+ parser.add_argument("-n", "--nobackups", action="store_true", default=False,
177
+ help="Don't write backups for modified files.")
178
+ parser.add_argument("sources", nargs="+", help="Source files.")
179
+
180
+
181
+ command_py2to3.name = "2to3"
182
+ command_py2to3.usage = "%(prog)s sources..."
183
+ command_py2to3.short = "Apply python's 2to3 tool to Python sources."
184
+ command_py2to3.setup_parser = setup_parser4py2to3
185
+
186
+
187
+ # -----------------------------------------------------------------------------
188
+ # COMMAND HELPERS/UTILS:
189
+ # -----------------------------------------------------------------------------
190
+ def discover_commands():
191
+ commands = []
192
+ for name, func in inspect.getmembers(inspect.getmodule(toxcmd_main)):
193
+ if name.startswith("__"):
194
+ continue
195
+ if name.startswith("command_") and callable(func):
196
+ command_name0 = name.replace("command_", "")
197
+ command_name = getattr(func, "name", command_name0)
198
+ commands.append(Command(command_name, func))
199
+ return commands
200
+
201
+
202
+ class Command(object):
203
+ def __init__(self, name, func):
204
+ assert isinstance(name, six.string_types)
205
+ assert callable(func)
206
+ self.name = name
207
+ self.func = func
208
+ self.parser = None
209
+
210
+ def setup_parser(self, command_parser):
211
+ setup_parser = getattr(self.func, "setup_parser", None)
212
+ if setup_parser and callable(setup_parser):
213
+ setup_parser(command_parser)
214
+ else:
215
+ command_parser.add_argument("args", nargs="*")
216
+
217
+ @property
218
+ def usage(self):
219
+ usage = getattr(self.func, "usage", None)
220
+ return usage
221
+
222
+ @property
223
+ def short_description(self):
224
+ short_description = getattr(self.func, "short", "")
225
+ return short_description
226
+
227
+ @property
228
+ def description(self):
229
+ return inspect.getdoc(self.func)
230
+
231
+ def __call__(self, args):
232
+ return self.func(args)
233
+
234
+
235
+ # -----------------------------------------------------------------------------
236
+ # MAIN-COMMAND:
237
+ # -----------------------------------------------------------------------------
238
+ def toxcmd_main(args=None):
239
+ """Command util with subcommands for tox environments."""
240
+ usage = "USAGE: %(prog)s [OPTIONS] COMMAND args..."
241
+ if args is None:
242
+ args = sys.argv[1:]
243
+
244
+ # -- STEP: Build command-line parser.
245
+ parser = argparse.ArgumentParser(description=inspect.getdoc(toxcmd_main),
246
+ formatter_class=FORMATTER_CLASS)
247
+ common_parser = parser.add_argument_group("Common options")
248
+ common_parser.add_argument("--version", action="version", version=VERSION)
249
+ subparsers = parser.add_subparsers(help="commands")
250
+ for command in discover_commands():
251
+ command_parser = subparsers.add_parser(command.name,
252
+ usage=command.usage,
253
+ description=command.description,
254
+ help=command.short_description,
255
+ formatter_class=FORMATTER_CLASS)
256
+ command_parser.set_defaults(func=command)
257
+ command.setup_parser(command_parser)
258
+ command.parser = command_parser
259
+
260
+ # -- STEP: Process command-line and run command.
261
+ options = parser.parse_args(args)
262
+ command_function = options.func
263
+ return command_function(options)
264
+
265
+
266
+ # -----------------------------------------------------------------------------
267
+ # MAIN:
268
+ # -----------------------------------------------------------------------------
269
+ if __name__ == "__main__":
270
+ sys.exit(toxcmd_main())
@@ -0,0 +1,270 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: UTF-8 -*-
3
+ """
4
+ Provides a command container for additional tox commands, used in "tox.ini".
5
+
6
+ COMMANDS:
7
+
8
+ * copytree
9
+ * copy
10
+ * py2to3
11
+
12
+ REQUIRES:
13
+ * argparse
14
+ """
15
+
16
+ from glob import glob
17
+ import argparse
18
+ import inspect
19
+ import os.path
20
+ import shutil
21
+ import sys
22
+ import collections
23
+
24
+ __author__ = "Jens Engel"
25
+ __copyright__ = "(c) 2013 by Jens Engel"
26
+ __license__ = "BSD"
27
+
28
+ # -----------------------------------------------------------------------------
29
+ # CONSTANTS:
30
+ # -----------------------------------------------------------------------------
31
+ VERSION = "0.1.0"
32
+ FORMATTER_CLASS = argparse.RawDescriptionHelpFormatter
33
+
34
+
35
+ # -----------------------------------------------------------------------------
36
+ # SUBCOMMAND: copytree
37
+ # -----------------------------------------------------------------------------
38
+ def command_copytree(args):
39
+ """
40
+ Copy one or more source directory(s) below a destination directory.
41
+ Parts of the destination directory path are created if needed.
42
+ Similar to the UNIX command: 'cp -R srcdir destdir'
43
+ """
44
+ for srcdir in args.srcdirs:
45
+ basename = os.path.basename(srcdir)
46
+ destdir2 = os.path.normpath(os.path.join(args.destdir, basename))
47
+ if os.path.exists(destdir2):
48
+ shutil.rmtree(destdir2)
49
+ sys.stdout.write("copytree: %s => %s\n" % (srcdir, destdir2))
50
+ shutil.copytree(srcdir, destdir2)
51
+ return 0
52
+
53
+
54
+ def setup_parser_copytree(parser):
55
+ parser.add_argument("srcdirs", nargs="+", help="Source directory(s)")
56
+ parser.add_argument("destdir", help="Destination directory")
57
+
58
+
59
+ command_copytree.usage = "%(prog)s srcdir... destdir"
60
+ command_copytree.short = "Copy source dir(s) below a destination directory."
61
+ command_copytree.setup_parser = setup_parser_copytree
62
+
63
+
64
+ # -----------------------------------------------------------------------------
65
+ # SUBCOMMAND: copy
66
+ # -----------------------------------------------------------------------------
67
+ def command_copy(args):
68
+ """
69
+ Copy one or more source-files(s) to a destpath (destfile or destdir).
70
+ Destdir mode is used if:
71
+ * More than one srcfile is provided
72
+ * Last parameter ends with a slash ("/").
73
+ * Last parameter is an existing directory
74
+
75
+ Destination directory path is created if needed.
76
+ Similar to the UNIX command: 'cp srcfile... destpath'
77
+ """
78
+ sources = args.sources
79
+ destpath = args.destpath
80
+ source_files = []
81
+ for file_ in sources:
82
+ if "*" in file_:
83
+ selected = glob(file_)
84
+ source_files.extend(selected)
85
+ elif os.path.isfile(file_):
86
+ source_files.append(file_)
87
+
88
+ if destpath.endswith("/") or os.path.isdir(destpath) or len(sources) > 1:
89
+ # -- DESTDIR-MODE: Last argument is a directory.
90
+ destdir = destpath
91
+ else:
92
+ # -- DESTFILE-MODE: Copy (and rename) one file.
93
+ assert len(source_files) == 1
94
+ destdir = os.path.dirname(destpath)
95
+
96
+ # -- WORK-HORSE: Copy one or more files to destpath.
97
+ if not os.path.isdir(destdir):
98
+ sys.stdout.write("copy: Create dir %s\n" % destdir)
99
+ os.makedirs(destdir)
100
+ for source in source_files:
101
+ destname = os.path.join(destdir, os.path.basename(source))
102
+ sys.stdout.write("copy: %s => %s\n" % (source, destname))
103
+ shutil.copy(source, destname)
104
+ return 0
105
+
106
+
107
+ def setup_parser_copy(parser):
108
+ parser.add_argument("sources", nargs="+", help="Source files.")
109
+ parser.add_argument("destpath", help="Destination path")
110
+
111
+
112
+ command_copy.usage = "%(prog)s sources... destpath"
113
+ command_copy.short = "Copy one or more source files to a destinition."
114
+ command_copy.setup_parser = setup_parser_copy
115
+
116
+
117
+ # -----------------------------------------------------------------------------
118
+ # SUBCOMMAND: mkdir
119
+ # -----------------------------------------------------------------------------
120
+ def command_mkdir(args):
121
+ """
122
+ Create a non-existing directory (or more ...).
123
+ If the directory exists, the step is skipped.
124
+ Similar to the UNIX command: 'mkdir -p dir'
125
+ """
126
+ errors = 0
127
+ for directory in args.dirs:
128
+ if os.path.exists(directory):
129
+ if not os.path.isdir(directory):
130
+ # -- SANITY CHECK: directory exists, but as file...
131
+ sys.stdout.write("mkdir: %s\n" % directory)
132
+ sys.stdout.write("ERROR: Exists already, but as file...\n")
133
+ errors += 1
134
+ else:
135
+ # -- NORMAL CASE: Directory does not exits yet.
136
+ assert not os.path.isdir(directory)
137
+ sys.stdout.write("mkdir: %s\n" % directory)
138
+ os.makedirs(directory)
139
+ return errors
140
+
141
+
142
+ def setup_parser_mkdir(parser):
143
+ parser.add_argument("dirs", nargs="+", help="Directory(s)")
144
+
145
+ command_mkdir.usage = "%(prog)s dir..."
146
+ command_mkdir.short = "Create non-existing directory (or more...)."
147
+ command_mkdir.setup_parser = setup_parser_mkdir
148
+
149
+ # -----------------------------------------------------------------------------
150
+ # SUBCOMMAND: py2to3
151
+ # -----------------------------------------------------------------------------
152
+ command_py2to4_work_around3k = True
153
+ def command_py2to3(args):
154
+ """
155
+ Apply '2to3' tool (Python2 to Python3 conversion tool) to Python sources.
156
+ """
157
+ from lib2to3.main import main
158
+ args2 = []
159
+ if command_py2to4_work_around3k:
160
+ if args.no_diffs:
161
+ args2.append("--no-diffs")
162
+ if args.write:
163
+ args2.append("-w")
164
+ if args.nobackups:
165
+ args2.append("-n")
166
+ args2.extend(args.sources)
167
+ sys.exit(main("lib2to3.fixes", args=args2))
168
+
169
+
170
+ def setup_parser4py2to3(parser):
171
+ if command_py2to4_work_around3k:
172
+ parser.add_argument("--no-diffs", action="store_true",
173
+ help="Don't show diffs of the refactoring")
174
+ parser.add_argument("-w", "--write", action="store_true",
175
+ help="Write back modified files")
176
+ parser.add_argument("-n", "--nobackups", action="store_true", default=False,
177
+ help="Don't write backups for modified files.")
178
+ parser.add_argument("sources", nargs="+", help="Source files.")
179
+
180
+
181
+ command_py2to3.name = "2to3"
182
+ command_py2to3.usage = "%(prog)s sources..."
183
+ command_py2to3.short = "Apply python's 2to3 tool to Python sources."
184
+ command_py2to3.setup_parser = setup_parser4py2to3
185
+
186
+
187
+ # -----------------------------------------------------------------------------
188
+ # COMMAND HELPERS/UTILS:
189
+ # -----------------------------------------------------------------------------
190
+ def discover_commands():
191
+ commands = []
192
+ for name, func in inspect.getmembers(inspect.getmodule(toxcmd_main)):
193
+ if name.startswith("__"):
194
+ continue
195
+ if name.startswith("command_") and isinstance(func, collections.Callable):
196
+ command_name0 = name.replace("command_", "")
197
+ command_name = getattr(func, "name", command_name0)
198
+ commands.append(Command(command_name, func))
199
+ return commands
200
+
201
+
202
+ class Command(object):
203
+ def __init__(self, name, func):
204
+ assert isinstance(name, str)
205
+ assert isinstance(func, collections.Callable)
206
+ self.name = name
207
+ self.func = func
208
+ self.parser = None
209
+
210
+ def setup_parser(self, command_parser):
211
+ setup_parser = getattr(self.func, "setup_parser", None)
212
+ if setup_parser and isinstance(setup_parser, collections.Callable):
213
+ setup_parser(command_parser)
214
+ else:
215
+ command_parser.add_argument("args", nargs="*")
216
+
217
+ @property
218
+ def usage(self):
219
+ usage = getattr(self.func, "usage", None)
220
+ return usage
221
+
222
+ @property
223
+ def short_description(self):
224
+ short_description = getattr(self.func, "short", "")
225
+ return short_description
226
+
227
+ @property
228
+ def description(self):
229
+ return inspect.getdoc(self.func)
230
+
231
+ def __call__(self, args):
232
+ return self.func(args)
233
+
234
+
235
+ # -----------------------------------------------------------------------------
236
+ # MAIN-COMMAND:
237
+ # -----------------------------------------------------------------------------
238
+ def toxcmd_main(args=None):
239
+ """Command util with subcommands for tox environments."""
240
+ usage = "USAGE: %(prog)s [OPTIONS] COMMAND args..."
241
+ if args is None:
242
+ args = sys.argv[1:]
243
+
244
+ # -- STEP: Build command-line parser.
245
+ parser = argparse.ArgumentParser(description=inspect.getdoc(toxcmd_main),
246
+ formatter_class=FORMATTER_CLASS)
247
+ common_parser = parser.add_argument_group("Common options")
248
+ common_parser.add_argument("--version", action="version", version=VERSION)
249
+ subparsers = parser.add_subparsers(help="commands")
250
+ for command in discover_commands():
251
+ command_parser = subparsers.add_parser(command.name,
252
+ usage=command.usage,
253
+ description=command.description,
254
+ help=command.short_description,
255
+ formatter_class=FORMATTER_CLASS)
256
+ command_parser.set_defaults(func=command)
257
+ command.setup_parser(command_parser)
258
+ command.parser = command_parser
259
+
260
+ # -- STEP: Process command-line and run command.
261
+ options = parser.parse_args(args)
262
+ command_function = options.func
263
+ return command_function(options)
264
+
265
+
266
+ # -----------------------------------------------------------------------------
267
+ # MAIN:
268
+ # -----------------------------------------------------------------------------
269
+ if __name__ == "__main__":
270
+ sys.exit(toxcmd_main())