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,8 @@
1
+ #!/bin/sh
2
+ #!/bin/bash
3
+ # RUN INVOKE: From bundled ZIP file.
4
+
5
+ HERE=$(dirname $0)
6
+ export INVOKE_TASKS_USE_VENDOR_BUNDLES="yes"
7
+
8
+ python ${HERE}/../tasks/_vendor/invoke.zip $*
@@ -0,0 +1,9 @@
1
+ @echo off
2
+ REM RUN INVOKE: From bundled ZIP file.
3
+
4
+ setlocal
5
+ set HERE=%~dp0
6
+ set INVOKE_TASKS_USE_VENDOR_BUNDLES="yes"
7
+ if not defined PYTHON set PYTHON=python
8
+
9
+ %PYTHON% %HERE%../tasks/_vendor/invoke.zip "%*"
@@ -0,0 +1,167 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ """
4
+ Utility script to format/beautify one or more JSON files.
5
+
6
+ REQUIRES: Python >= 2.6 (json module is part of Python standard library)
7
+ LICENSE: BSD
8
+ """
9
+
10
+ from __future__ import absolute_import
11
+
12
+ __author__ = "Jens Engel"
13
+ __copyright__ = "(c) 2011-2013 by Jens Engel"
14
+ VERSION = "0.2.2"
15
+
16
+ # -- IMPORTS:
17
+ import os.path
18
+ import glob
19
+ import logging
20
+ from optparse import OptionParser
21
+ import sys
22
+ try:
23
+ import json
24
+ except ImportError:
25
+ import simplejson as json #< BACKWARD-COMPATIBLE: Python <= 2.5
26
+
27
+
28
+ # ----------------------------------------------------------------------------
29
+ # CONSTANTS:
30
+ # ----------------------------------------------------------------------------
31
+ DEFAULT_INDENT_SIZE = 2
32
+
33
+ # ----------------------------------------------------------------------------
34
+ # FUNCTIONS:
35
+ # ----------------------------------------------------------------------------
36
+ def json_format(filename, indent=DEFAULT_INDENT_SIZE, **kwargs):
37
+ """
38
+ Format/Beautify a JSON file.
39
+
40
+ :param filename: Filename of a JSON file to process.
41
+ :param indent: Number of chars to indent per level (default: 4).
42
+ :returns: >= 0, if successful (written=1, skipped=2). Zero(0), otherwise.
43
+ :raises: ValueError, if parsing JSON file contents fails.
44
+ :raises: json.JSONDecodeError, if parsing JSON file contents fails.
45
+ :raises: IOError (Error 2), if file not found.
46
+ """
47
+ console = kwargs.get("console", logging.getLogger("console"))
48
+ encoding = kwargs.get("encoding", None)
49
+ dry_run = kwargs.get("dry_run", False)
50
+ if indent is None:
51
+ sort_keys = False
52
+ else:
53
+ sort_keys = True
54
+
55
+ message = "%s ..." % filename
56
+ # if not (os.path.exists(filename) and os.path.isfile(filename)):
57
+ # console.error("%s ERROR: file not found.", message)
58
+ # return 0
59
+
60
+ contents = open(filename, "r").read()
61
+ data = json.loads(contents, encoding=encoding)
62
+ contents2 = json.dumps(data, indent=indent, sort_keys=sort_keys)
63
+ contents2 = contents2.strip()
64
+ contents2 = "%s\n" % contents2
65
+ if contents == contents2:
66
+ console.info("%s SKIP (already pretty)", message)
67
+ return 2 #< SKIPPED.
68
+ elif not dry_run:
69
+ outfile = open(filename, "w")
70
+ outfile.write(contents2)
71
+ outfile.close()
72
+ console.warn("%s OK", message)
73
+ return 1 #< OK
74
+
75
+ def json_formatall(filenames, indent=DEFAULT_INDENT_SIZE, dry_run=False):
76
+ """
77
+ Format/Beautify a JSON file.
78
+
79
+ :param filenames: Format one or more JSON files.
80
+ :param indent: Number of chars to indent per level (default: 4).
81
+ :returns: 0, if successful. Otherwise, number of errors.
82
+ """
83
+ errors = 0
84
+ console = logging.getLogger("console")
85
+ for filename in filenames:
86
+ try:
87
+ result = json_format(filename, indent=indent, console=console,
88
+ dry_run=dry_run)
89
+ if not result:
90
+ errors += 1
91
+ # except json.decoder.JSONDecodeError, e:
92
+ # console.error("ERROR: %s (filename: %s)", e, filename)
93
+ # errors += 1
94
+ except Exception as e:
95
+ console.error("ERROR %s: %s (filename: %s)",
96
+ e.__class__.__name__, e, filename)
97
+ errors += 1
98
+ return errors
99
+
100
+ # ----------------------------------------------------------------------------
101
+ # MAIN FUNCTION:
102
+ # ----------------------------------------------------------------------------
103
+ def main(args=None):
104
+ """Boilerplate for this script."""
105
+ if args is None:
106
+ args = sys.argv[1:]
107
+
108
+ usage_ = """%prog [OPTIONS] JsonFile [MoreJsonFiles...]
109
+ Format/Beautify one or more JSON file(s)."""
110
+ parser = OptionParser(usage=usage_, version=VERSION)
111
+ parser.add_option("-i", "--indent", dest="indent_size",
112
+ default=DEFAULT_INDENT_SIZE, type="int",
113
+ help="Indent size to use (default: %default).")
114
+ parser.add_option("-c", "--compact", dest="compact",
115
+ action="store_true", default=False,
116
+ help="Use compact format (default: %default).")
117
+ parser.add_option("-n", "--dry-run", dest="dry_run",
118
+ action="store_true", default=False,
119
+ help="Check only if JSON is well-formed (default: %default).")
120
+ options, filenames = parser.parse_args(args) #< pylint: disable=W0612
121
+ if not filenames:
122
+ parser.error("OOPS, no filenames provided.")
123
+ if options.compact:
124
+ options.indent_size = None
125
+
126
+ # -- STEP: Init logging subsystem.
127
+ format_ = "json.format: %(message)s"
128
+ logging.basicConfig(level=logging.WARN, format=format_)
129
+ console = logging.getLogger("console")
130
+
131
+ # -- DOS-SHELL SUPPORT: Perform filename globbing w/ wildcards.
132
+ skipped = 0
133
+ filenames2 = []
134
+ for filename in filenames:
135
+ if "*" in filenames:
136
+ files = glob.glob(filename)
137
+ filenames2.extend(files)
138
+ elif os.path.isdir(filename):
139
+ # -- CONVENIENCE-SHORTCUT: Use DIR as shortcut for JSON files.
140
+ files = glob.glob(os.path.join(filename, "*.json"))
141
+ filenames2.extend(files)
142
+ if not files:
143
+ console.info("SKIP %s, no JSON files found in dir.", filename)
144
+ skipped += 1
145
+ elif not os.path.exists(filename):
146
+ console.warn("SKIP %s, file not found.", filename)
147
+ skipped += 1
148
+ continue
149
+ else:
150
+ assert os.path.exists(filename)
151
+ filenames2.append(filename)
152
+ filenames = filenames2
153
+
154
+ # -- NORMAL PROCESSING:
155
+ errors = json_formatall(filenames, options.indent_size,
156
+ dry_run=options.dry_run)
157
+ console.error("Processed %d files (%d with errors, skipped=%d).",
158
+ len(filenames), errors, skipped)
159
+ if not filenames:
160
+ errors += 1
161
+ return errors
162
+
163
+ # ----------------------------------------------------------------------------
164
+ # AUTO-MAIN:
165
+ # ----------------------------------------------------------------------------
166
+ if __name__ == "__main__":
167
+ sys.exit(main())
@@ -0,0 +1,122 @@
1
+ #!/usr/bin/env python
2
+ # -*- encoding: utf-8 -*-
3
+ """
4
+ Validate a JSON file against its JSON schema.
5
+
6
+ SEE ALSO:
7
+ * https://python-jsonschema.readthedocs.org/
8
+ * https://python-jsonschema.readthedocs.org/en/latest/errors.html
9
+
10
+ REQUIRES:
11
+ Python >= 2.6
12
+ jsonschema >= 1.3.0
13
+ argparse
14
+ """
15
+
16
+ from __future__ import absolute_import, print_function
17
+
18
+ __author__ = "Jens Engel"
19
+ __version__ = "0.1.0"
20
+
21
+ from jsonschema import validate
22
+ import argparse
23
+ import os.path
24
+ import sys
25
+ import textwrap
26
+ try:
27
+ import json
28
+ except ImportError:
29
+ try:
30
+ import simplejson as json
31
+ except ImportError:
32
+ sys.exit("REQUIRE: simplejson (which is not installed)")
33
+
34
+
35
+ # -----------------------------------------------------------------------------
36
+ # CONSTANTS:
37
+ # -----------------------------------------------------------------------------
38
+ HERE = os.path.dirname(__file__)
39
+ TOP = os.path.normpath(os.path.join(HERE, ".."))
40
+ SCHEMA = os.path.join(TOP, "etc", "json", "behave.json-schema")
41
+
42
+
43
+ # -----------------------------------------------------------------------------
44
+ # FUNCTIONS:
45
+ # -----------------------------------------------------------------------------
46
+ def jsonschema_validate(filename, schema, encoding=None):
47
+ f = open(filename, "r")
48
+ contents = f.read()
49
+ f.close()
50
+ data = json.loads(contents, encoding=encoding)
51
+ return validate(data, schema)
52
+
53
+
54
+ def main(args=None):
55
+ """
56
+ Validate JSON files against their JSON schema.
57
+ NOTE: Behave's JSON-schema is used per default.
58
+
59
+ SEE ALSO:
60
+ * http://json-schema.org/
61
+ * http://tools.ietf.org/html/draft-zyp-json-schema-04
62
+ """
63
+ if args is None:
64
+ args = sys.argv[1:]
65
+ default_schema = None
66
+ if os.path.exists(SCHEMA):
67
+ default_schema = SCHEMA
68
+
69
+ parser = argparse.ArgumentParser(
70
+ description=textwrap.dedent(main.__doc__),
71
+ formatter_class=argparse.RawDescriptionHelpFormatter
72
+ )
73
+ parser.add_argument("-v", "--version",
74
+ action="version", version=__version__)
75
+ parser.add_argument("-s", "--schema",
76
+ help="JSON schema to use.")
77
+ parser.add_argument("-e", "--encoding",
78
+ help="Encoding for JSON/JSON schema.")
79
+ parser.add_argument("files", nargs="+", metavar="JSON_FILE",
80
+ help="JSON file to check.")
81
+ parser.set_defaults(
82
+ schema=default_schema,
83
+ encoding="UTF-8"
84
+ )
85
+ options = parser.parse_args(args)
86
+ if not options.schema:
87
+ parser.error("REQUIRE: JSON schema")
88
+ elif not os.path.isfile(options.schema):
89
+ parser.error("SCHEMA not found: %s" % options.schema)
90
+
91
+ try:
92
+ f = open(options.schema, "r")
93
+ contents = f.read()
94
+ f.close()
95
+ schema = json.loads(contents, encoding=options.encoding)
96
+ except Exception as e:
97
+ msg = "ERROR: %s: %s (while loading schema)" % (e.__class__.__name__, e)
98
+ sys.exit(msg)
99
+
100
+ error_count = 0
101
+ for filename in options.files:
102
+ validated = True
103
+ more_info = None
104
+ try:
105
+ print("validate:", filename, "...", end=' ')
106
+ jsonschema_validate(filename, schema, encoding=options.encoding)
107
+ except Exception as e:
108
+ more_info = "%s: %s" % (e.__class__.__name__, e)
109
+ validated = False
110
+ error_count += 1
111
+ if validated:
112
+ print("OK")
113
+ else:
114
+ print("FAILED\n\n%s" % more_info)
115
+ return error_count
116
+
117
+
118
+ # -----------------------------------------------------------------------------
119
+ # AUTO-MAIN
120
+ # -----------------------------------------------------------------------------
121
+ if __name__ == "__main__":
122
+ sys.exit(main())
@@ -0,0 +1,279 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ """
4
+ Utility script to create a pypi-like directory structure (localpi)
5
+ from a number of Python packages in a directory of the local filesystem.
6
+
7
+ DIRECTORY STRUCTURE (before):
8
+ +-- downloads/
9
+ +-- alice-1.0.zip
10
+ +-- alice-1.0.tar.gz
11
+ +-- bob-1.3.0.tar.gz
12
+ +-- bob-1.4.2.tar.gz
13
+ +-- charly-1.0.tar.bz2
14
+
15
+ DIRECTORY STRUCTURE (afterwards):
16
+ +-- downloads/
17
+ +-- simple/
18
+ | +-- alice/index.html --> ../../alice-*.*
19
+ | +-- bob/index.html --> ../../bob-*.*
20
+ | +-- charly/index.html --> ../../charly-*.*
21
+ | +-- index.html --> alice/, bob/, ...
22
+ +-- alice-1.0.zip
23
+ +-- alice-1.0.tar.gz
24
+ +-- bob-1.3.0.tar.gz
25
+ +-- bob-1.4.2.tar.gz
26
+ +-- charly-1.0.tar.bz2
27
+
28
+ USAGE EXAMPLE:
29
+
30
+ mkdir -p /tmp/downloads
31
+ pip install --download=/tmp/downloads argparse Jinja2
32
+ make_localpi.py /tmp/downloads
33
+ pip install --index-url=file:///tmp/downloads/simple argparse Jinja2
34
+
35
+ ALTERNATIVE:
36
+
37
+ pip install --download=/tmp/downloads argparse Jinja2
38
+ pip install --find-links=/tmp/downloads --no-index argparse Jinja2
39
+ """
40
+
41
+ from __future__ import absolute_import, print_function, with_statement
42
+ from fnmatch import fnmatch
43
+ import os.path
44
+ import shutil
45
+ import sys
46
+
47
+
48
+ __author__ = "Jens Engel"
49
+ __version__ = "0.2"
50
+ __license__ = "BSD"
51
+ __copyright__ = "(c) 2013 by Jens Engel"
52
+
53
+
54
+ class Package(object):
55
+ """
56
+ Package entity that keeps track of:
57
+ * one or more versions of this package
58
+ * one or more archive types
59
+ """
60
+ PATTERNS = [
61
+ "*.egg", "*.exe", "*.whl", "*.zip", "*.tar.gz", "*.tar.bz2", "*.7z"
62
+ ]
63
+
64
+ def __init__(self, filename, name=None):
65
+ if not name and filename:
66
+ name = self.get_pkgname(filename)
67
+ self.name = name
68
+ self.files = []
69
+ if filename:
70
+ self.files.append(filename)
71
+
72
+ @property
73
+ def versions(self):
74
+ versions_info = [ self.get_pkgversion(p) for p in self.files ]
75
+ return versions_info
76
+
77
+ @classmethod
78
+ def split_pkgname_parts(cls, filename):
79
+ basename = cls.splitext(os.path.basename(filename))
80
+ if basename.startswith("http") and r"%2F" in basename:
81
+ # -- PIP DOWNLOAD-CACHE PACKAGE FILE NAME SCHEMA:
82
+ pos = basename.rfind("%2F")
83
+ basename = basename[pos+3:]
84
+
85
+ version_part_index = 0
86
+ parts = basename.split("-")
87
+ for index, part in enumerate(parts):
88
+ if index == 0:
89
+ continue
90
+ elif part and part[0].isdigit() and len(part) >= 3:
91
+ version_part_index = index
92
+ break
93
+ name = "-".join(parts[:version_part_index])
94
+ version = "0.0"
95
+ remainder = None
96
+ if version_part_index > 0:
97
+ version = parts[version_part_index]
98
+ if version_part_index+1 < len(parts):
99
+ remainder = "-".join(parts[version_part_index+1:])
100
+ assert name, "OOPS: basename=%s, name='%s'" % (basename, name)
101
+ return (name, version, remainder)
102
+
103
+
104
+ @classmethod
105
+ def get_pkgname(cls, filename):
106
+ return cls.split_pkgname_parts(filename)[0]
107
+
108
+ @classmethod
109
+ def get_pkgversion(cls, filename):
110
+ return cls.split_pkgname_parts(filename)[1]
111
+
112
+ @classmethod
113
+ def make_pkgname_with_version(cls, filename):
114
+ pkg_name = cls.get_pkgname(filename)
115
+ pkg_version = cls.get_pkgversion(filename)
116
+ return "%s-%s" % (pkg_name, pkg_version)
117
+
118
+ @staticmethod
119
+ def splitext(filename):
120
+ fname = os.path.splitext(filename)[0]
121
+ if fname.endswith(".tar"):
122
+ fname = os.path.splitext(fname)[0]
123
+ return fname
124
+
125
+ @classmethod
126
+ def isa(cls, filename):
127
+ basename = os.path.basename(filename)
128
+ if basename.startswith("."):
129
+ return False
130
+ for pattern in cls.PATTERNS:
131
+ if fnmatch(filename, pattern):
132
+ return True
133
+ return False
134
+
135
+ def collect_packages(package_dir, package_map=None):
136
+ if package_map is None:
137
+ package_map = {}
138
+ packages = []
139
+ for filename in sorted(os.listdir(package_dir)):
140
+ if not Package.isa(filename):
141
+ continue
142
+ pkg_filepath = os.path.join(package_dir, filename)
143
+ package_name = Package.get_pkgname(pkg_filepath)
144
+ package = package_map.get(package_name, None)
145
+ if not package:
146
+ # -- NEW PACKAGE DETECTED: Store/register package.
147
+ package = Package(pkg_filepath)
148
+ package_map[package.name] = package
149
+ packages.append(package)
150
+ else:
151
+ # -- SAME PACKAGE: Collect other variant/version.
152
+ package.files.append(pkg_filepath)
153
+ return packages
154
+
155
+ def make_index_for(package, index_dir, verbose=True):
156
+ """
157
+ Create an 'index.html' for one package.
158
+
159
+ :param package: Package object to use.
160
+ :param index_dir: Where 'index.html' should be created.
161
+ """
162
+ index_template = """\
163
+ <html>
164
+ <head><title>{title}</title></head>
165
+ <body>
166
+ <h1>{title}</h1>
167
+ <ul>
168
+ {packages}
169
+ </ul>
170
+ </body>
171
+ </html>
172
+ """
173
+ item_template = '<li><a href="{1}">{0}</a></li>'
174
+ index_filename = os.path.join(index_dir, "index.html")
175
+ if not os.path.isdir(index_dir):
176
+ os.makedirs(index_dir)
177
+
178
+ parts = []
179
+ for pkg_filename in package.files:
180
+ pkg_name = os.path.basename(pkg_filename)
181
+ if pkg_name == "index.html":
182
+ # -- ROOT-INDEX:
183
+ pkg_name = os.path.basename(os.path.dirname(pkg_filename))
184
+ else:
185
+ # pkg_name = package.splitext(pkg_name)
186
+ pkg_name = package.make_pkgname_with_version(pkg_filename)
187
+ pkg_relpath_to = os.path.relpath(pkg_filename, index_dir)
188
+ parts.append(item_template.format(pkg_name, pkg_relpath_to))
189
+
190
+ if not parts:
191
+ print("OOPS: Package %s has no files" % package.name)
192
+ return
193
+
194
+ if verbose:
195
+ root_index = not Package.isa(package.files[0])
196
+ if root_index:
197
+ info = "with %d package(s)" % len(package.files)
198
+ else:
199
+ package_versions = sorted(set(package.versions))
200
+ info = ", ".join(reversed(package_versions))
201
+ message = "%-30s %s" % (package.name, info)
202
+ print(message)
203
+
204
+ with open(index_filename, "w") as f:
205
+ packages = "\n".join(parts)
206
+ text = index_template.format(title=package.name, packages=packages)
207
+ f.write(text.strip())
208
+ f.close()
209
+
210
+
211
+ def make_package_index(download_dir):
212
+ """
213
+ Create a pypi server like file structure below download directory.
214
+
215
+ :param download_dir: Download directory with packages.
216
+
217
+ EXAMPLE BEFORE:
218
+ +-- downloads/
219
+ +-- wheelhouse/bob-1.4.2-*.whl
220
+ +-- alice-1.0.zip
221
+ +-- alice-1.0.tar.gz
222
+ +-- bob-1.3.0.tar.gz
223
+ +-- bob-1.4.2.tar.gz
224
+ +-- charly-1.0.tar.bz2
225
+
226
+ EXAMPLE AFTERWARDS:
227
+ +-- downloads/
228
+ +-- simple/
229
+ | +-- alice/index.html --> ../../alice-*.*
230
+ | +-- bob/index.html --> ../../bob-*.*
231
+ | +-- charly/index.html --> ../../charly-*.*
232
+ | +-- index.html --> alice/index.html, bob/index.html, ...
233
+ +-- wheelhouse/bob-1.4.2-*.whl
234
+ +-- alice-1.0.zip
235
+ +-- alice-1.0.tar.gz
236
+ +-- bob-1.3.0.tar.gz
237
+ +-- bob-1.4.2.tar.gz
238
+ +-- charly-1.0.tar.bz2
239
+ """
240
+ if not os.path.isdir(download_dir):
241
+ raise ValueError("No such directory: %r" % download_dir)
242
+
243
+ pkg_rootdir = os.path.join(download_dir, "simple")
244
+ if os.path.isdir(pkg_rootdir):
245
+ shutil.rmtree(pkg_rootdir, ignore_errors=True)
246
+ os.mkdir(pkg_rootdir)
247
+
248
+ package_dirs = [download_dir]
249
+ wheelhouse_dir = os.path.join(download_dir, "wheelhouse")
250
+ if os.path.isdir(wheelhouse_dir):
251
+ print("Using wheelhouse: %s" % wheelhouse_dir)
252
+ package_dirs.append(wheelhouse_dir)
253
+
254
+ # -- STEP: Collect all packages.
255
+ package_map = {}
256
+ packages = []
257
+ for package_dir in package_dirs:
258
+ new_packages = collect_packages(package_dir, package_map)
259
+ packages.extend(new_packages)
260
+
261
+ # -- STEP: Make local PYTHON PACKAGE INDEX.
262
+ root_package = Package(None, "Python Package Index")
263
+ root_package.files = [ os.path.join(pkg_rootdir, pkg.name, "index.html")
264
+ for pkg in packages ]
265
+ make_index_for(root_package, pkg_rootdir)
266
+ for package in packages:
267
+ index_dir = os.path.join(pkg_rootdir, package.name)
268
+ make_index_for(package, index_dir)
269
+
270
+
271
+ # -----------------------------------------------------------------------------
272
+ # MAIN:
273
+ # -----------------------------------------------------------------------------
274
+ if __name__ == "__main__":
275
+ if (len(sys.argv) != 2) or "-h" in sys.argv[1:] or "--help" in sys.argv[1:]:
276
+ print("USAGE: %s DOWNLOAD_DIR" % os.path.basename(sys.argv[0]))
277
+ print(__doc__)
278
+ sys.exit(1)
279
+ make_package_index(sys.argv[1])