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,17 @@
1
+ Feature: Local Context Parameters defined in Scenarios (Steps)
2
+
3
+ . SPECIFICATION:
4
+ . * When a step adds/modifies an attribute in the Context object,
5
+ . then its value is only available to other steps in this scenario.
6
+ . * After a scenario is executed all Context object changes are undone.
7
+
8
+ Scenario: Add Local Context parameter in Scenario/Step
9
+ Given the behave context does not have a parameter "local_name"
10
+ When I set the context parameter "local_name" to "Alice"
11
+ Then the behave context should have a parameter "local_name"
12
+ And the behave context should contain:
13
+ | Parameter | Value |
14
+ | local_name | "Alice" |
15
+
16
+ Scenario: Ensure that Local Context parameter is not available to next Scenario
17
+ Then the behave context should not have a parameter "local_name"
@@ -0,0 +1,147 @@
1
+ Feature: Advanced, more complex directory layout (Variant 2)
2
+
3
+ As a story/test writer
4
+ I want a deeper, more structured directory structure when many feature files exist
5
+ So that I have the parts better under control (more managable)
6
+
7
+ . ADVANCED, MORE COMPLEX DIRECTORY LAYOUT STRUCTURE:
8
+ . features/
9
+ . +-- group1.features/
10
+ . | +-- *.feature
11
+ . +-- group2.features/
12
+ . | +-- *.feature
13
+ . +-- steps/*.py # Step definitions or step-library imports.
14
+ . +-- environment.py # OPTIONAL: environment setup/hooks.
15
+ .
16
+ . SEE ALSO:
17
+ . * http://pythonhosted.org/behave/gherkin.html#layout-variations
18
+ .
19
+ . RELATED:
20
+ . * issue #99: Layout variation "a directory containing your feature files" ...
21
+
22
+ @setup
23
+ Scenario: Setup directory structure
24
+ Given a new working directory
25
+ And a file named "features/steps/steps.py" with:
26
+ """
27
+ from behave import step
28
+
29
+ @step('{word:w} step passes')
30
+ def step_passes(context, word):
31
+ pass
32
+
33
+ @step('{word:w} step fails')
34
+ def step_fails(context, word):
35
+ assert False, "XFAIL-STEP"
36
+ """
37
+ And a file named "features/steps/environment_steps.py" with:
38
+ """
39
+ from behave import step
40
+
41
+ @step('environment setup was done')
42
+ def step_ensure_environment_setup(context):
43
+ assert context.setup_magic == 42
44
+ """
45
+ And a file named "features/environment.py" with:
46
+ """
47
+ def before_all(context):
48
+ context.setup_magic = 42
49
+ """
50
+ And a file named "features/group1/alice.feature" with:
51
+ """
52
+ Feature: Alice
53
+ Scenario: A1
54
+ Given a step passes
55
+ When another step passes
56
+ Then a step passes
57
+
58
+ Scenario: A2
59
+ Then environment setup was done
60
+ """
61
+ And a file named "features/group1/bob.feature" with:
62
+ """
63
+ Feature: Bob
64
+ Scenario: B1
65
+ When a step passes
66
+ Then another step passes
67
+ """
68
+ And a file named "features/group2/charly.feature" with:
69
+ """
70
+ Feature: Charly
71
+ Scenario: C1
72
+ Given another step passes
73
+ Then a step passes
74
+ """
75
+
76
+
77
+ Scenario: Run behave with feature directory
78
+ When I run "behave -f progress features/"
79
+ Then it should pass with:
80
+ """
81
+ 3 features passed, 0 failed, 0 skipped
82
+ 4 scenarios passed, 0 failed, 0 skipped
83
+ 8 steps passed, 0 failed, 0 skipped, 0 undefined
84
+ """
85
+
86
+ Scenario: Run behave with feature subdirectory (CASE 1)
87
+ When I run "behave -f progress features/group1/"
88
+ Then it should pass with:
89
+ """
90
+ 2 features passed, 0 failed, 0 skipped
91
+ 3 scenarios passed, 0 failed, 0 skipped
92
+ 6 steps passed, 0 failed, 0 skipped, 0 undefined
93
+ """
94
+
95
+ Scenario: Run behave with feature subdirectory (CASE 2)
96
+ When I run "behave -f progress features/group2/"
97
+ Then it should pass with:
98
+ """
99
+ 1 feature passed, 0 failed, 0 skipped
100
+ 1 scenario passed, 0 failed, 0 skipped
101
+ 2 steps passed, 0 failed, 0 skipped, 0 undefined
102
+ """
103
+
104
+ Scenario: Run behave with one feature file
105
+ When I run "behave -f progress features/group1/alice.feature"
106
+ Then it should pass with:
107
+ """
108
+ 1 feature passed, 0 failed, 0 skipped
109
+ 2 scenarios passed, 0 failed, 0 skipped
110
+ 4 steps passed, 0 failed, 0 skipped, 0 undefined
111
+ """
112
+ When I run "behave -f progress features/group2/charly.feature"
113
+ Then it should pass with:
114
+ """
115
+ 1 feature passed, 0 failed, 0 skipped
116
+ 1 scenario passed, 0 failed, 0 skipped
117
+ 2 steps passed, 0 failed, 0 skipped, 0 undefined
118
+ """
119
+
120
+
121
+ Scenario: Run behave with two feature files (CASE 1)
122
+ Given a file named "one.featureset" with:
123
+ """
124
+ features/group1/alice.feature
125
+ features/group2/charly.feature
126
+ """
127
+ When I run "behave -f progress @one.featureset"
128
+ Then it should pass with:
129
+ """
130
+ 2 features passed, 0 failed, 0 skipped
131
+ 3 scenarios passed, 0 failed, 0 skipped
132
+ 6 steps passed, 0 failed, 0 skipped, 0 undefined
133
+ """
134
+
135
+ Scenario: Run behave with two feature files (CASE 2: different ordering)
136
+ Given a file named "two.featureset" with:
137
+ """
138
+ features/group2/charly.feature
139
+ features/group1/alice.feature
140
+ """
141
+ When I run "behave -f progress @two.featureset"
142
+ Then it should pass with:
143
+ """
144
+ 2 features passed, 0 failed, 0 skipped
145
+ 3 scenarios passed, 0 failed, 0 skipped
146
+ 6 steps passed, 0 failed, 0 skipped, 0 undefined
147
+ """
@@ -0,0 +1,75 @@
1
+ Feature: Basic directory layout (Variant 1)
2
+
3
+ As a story/test writer
4
+ I want a simple, non-deep directory structure
5
+ So that I can easily get an overview which stories/tests exist
6
+
7
+ . BASIC DIRECTORY LAYOUT STRUCTURE:
8
+ . features/
9
+ . +-- steps/*.py # Step definitions or step-library imports.
10
+ . +-- *.feature # Feature files.
11
+ . +-- environment.py # OPTIONAL: environment setup/hooks.
12
+ .
13
+ . SEE ALSO:
14
+ . * http://pythonhosted.org/behave/gherkin.html#layout-variations
15
+
16
+
17
+ @setup
18
+ Scenario: Setup directory structure
19
+ Given a new working directory
20
+ And a file named "features/steps/steps.py" with:
21
+ """
22
+ from behave import step
23
+
24
+ @step('{word:w} step passes')
25
+ def step_passes(context, word):
26
+ pass
27
+
28
+ @step('{word:w} step fails')
29
+ def step_fails(context, word):
30
+ assert False, "XFAIL-STEP"
31
+ """
32
+ And a file named "features/alice.feature" with:
33
+ """
34
+ Feature: Alice
35
+ Scenario: A1
36
+ Given a step passes
37
+ When another step passes
38
+ Then a step passes
39
+ """
40
+ And a file named "features/bob.feature" with:
41
+ """
42
+ Feature: Bob
43
+ Scenario: B1
44
+ When a step passes
45
+ Then another step passes
46
+ """
47
+
48
+
49
+ Scenario: Run behave with feature directory
50
+ When I run "behave -f progress features/"
51
+ Then it should pass with:
52
+ """
53
+ 2 features passed, 0 failed, 0 skipped
54
+ 2 scenarios passed, 0 failed, 0 skipped
55
+ 5 steps passed, 0 failed, 0 skipped, 0 undefined
56
+ """
57
+
58
+ Scenario: Run behave with one feature file
59
+ When I run "behave -f progress features/alice.feature"
60
+ Then it should pass with:
61
+ """
62
+ 1 feature passed, 0 failed, 0 skipped
63
+ 1 scenario passed, 0 failed, 0 skipped
64
+ 3 steps passed, 0 failed, 0 skipped, 0 undefined
65
+ """
66
+
67
+
68
+ Scenario: Run behave with two feature files
69
+ When I run "behave -f progress features/alice.feature features/bob.feature"
70
+ Then it should pass with:
71
+ """
72
+ 2 features passed, 0 failed, 0 skipped
73
+ 2 scenarios passed, 0 failed, 0 skipped
74
+ 5 steps passed, 0 failed, 0 skipped, 0 undefined
75
+ """
@@ -0,0 +1,87 @@
1
+ Feature: Basic directory layout (Variant 1B)
2
+
3
+ As a story/test writer
4
+ I want a simple, non-deep directory structure
5
+ So that I can easily get an overview which stories/tests exist
6
+
7
+ . BASIC DIRECTORY LAYOUT STRUCTURE:
8
+ . testing/features/
9
+ . +-- steps/*.py # Step definitions or step-library imports.
10
+ . +-- *.feature # Feature files.
11
+ . +-- environment.py # OPTIONAL: environment setup/hooks.
12
+ .
13
+ . SEE ALSO:
14
+ . * http://pythonhosted.org/behave/gherkin.html#layout-variations
15
+
16
+
17
+ @setup
18
+ Scenario: Setup directory structure
19
+ Given a new working directory
20
+ And a file named "testing/features/steps/steps.py" with:
21
+ """
22
+ from behave import step
23
+
24
+ @step('{word:w} step passes')
25
+ def step_passes(context, word):
26
+ pass
27
+
28
+ @step('{word:w} step fails')
29
+ def step_fails(context, word):
30
+ assert False, "XFAIL-STEP"
31
+ """
32
+ And a file named "testing/features/alice.feature" with:
33
+ """
34
+ Feature: Alice
35
+ Scenario: A1
36
+ Given a step passes
37
+ When another step passes
38
+ Then a step passes
39
+ """
40
+ And a file named "testing/features/bob.feature" with:
41
+ """
42
+ Feature: Bob
43
+ Scenario: B1
44
+ When a step passes
45
+ Then another step passes
46
+ """
47
+
48
+
49
+ Scenario: Run behave with testing directory
50
+ When I run "behave -f progress testing/"
51
+ Then it should fail with:
52
+ """
53
+ ConfigError: No steps directory in '{__WORKDIR__}/testing'
54
+ """
55
+
56
+ Scenario: Run behave with feature subdirectory
57
+ When I run "behave -f progress testing/features/"
58
+ Then it should pass with:
59
+ """
60
+ 2 features passed, 0 failed, 0 skipped
61
+ 2 scenarios passed, 0 failed, 0 skipped
62
+ 5 steps passed, 0 failed, 0 skipped, 0 undefined
63
+ """
64
+
65
+ Scenario: Run behave with one feature file
66
+ When I run "behave -f progress testing/features/alice.feature"
67
+ Then it should pass with:
68
+ """
69
+ 1 feature passed, 0 failed, 0 skipped
70
+ 1 scenario passed, 0 failed, 0 skipped
71
+ 3 steps passed, 0 failed, 0 skipped, 0 undefined
72
+ """
73
+
74
+
75
+ Scenario: Run behave with two feature files
76
+ Given a file named "one.featureset" with:
77
+ """
78
+ testing/features/alice.feature
79
+ testing/features/bob.feature
80
+ """
81
+ When I run "behave -f progress @one.featureset"
82
+ Then it should pass with:
83
+ """
84
+ 2 features passed, 0 failed, 0 skipped
85
+ 2 scenarios passed, 0 failed, 0 skipped
86
+ 5 steps passed, 0 failed, 0 skipped, 0 undefined
87
+ """
@@ -0,0 +1,53 @@
1
+ # -*- coding: UTF-8 -*-
2
+
3
+ from behave.tag_matcher import ActiveTagMatcher, setup_active_tag_values
4
+ from behave4cmd0.setup_command_shell import setup_command_shell_processors4behave
5
+ import platform
6
+ import sys
7
+ import six
8
+
9
+ # -- MATCHES ANY TAGS: @use.with_{category}={value}
10
+ # NOTE: active_tag_value_provider provides category values for active tags.
11
+ python_version = "%s.%s" % sys.version_info[:2]
12
+ active_tag_value_provider = {
13
+ "python2": str(six.PY2).lower(),
14
+ "python3": str(six.PY3).lower(),
15
+ "python.version": python_version,
16
+ # -- python.implementation: cpython, pypy, jython, ironpython
17
+ "python.implementation": platform.python_implementation().lower(),
18
+ "pypy": str("__pypy__" in sys.modules).lower(),
19
+ "os": sys.platform,
20
+ }
21
+ active_tag_matcher = ActiveTagMatcher(active_tag_value_provider)
22
+
23
+ # -----------------------------------------------------------------------------
24
+ # HOOKS:
25
+ # -----------------------------------------------------------------------------
26
+ def before_all(context):
27
+ # -- SETUP ACTIVE-TAG MATCHER (with userdata):
28
+ # USE: behave -D browser=safari ...
29
+ setup_active_tag_values(active_tag_value_provider, context.config.userdata)
30
+ setup_python_path()
31
+ setup_context_with_global_params_test(context)
32
+ setup_command_shell_processors4behave()
33
+
34
+ def before_feature(context, feature):
35
+ if active_tag_matcher.should_exclude_with(feature.tags):
36
+ feature.skip(reason=active_tag_matcher.exclude_reason)
37
+
38
+ def before_scenario(context, scenario):
39
+ if active_tag_matcher.should_exclude_with(scenario.effective_tags):
40
+ scenario.skip(reason=active_tag_matcher.exclude_reason)
41
+
42
+ # -----------------------------------------------------------------------------
43
+ # SPECIFIC FUNCTIONALITY:
44
+ # -----------------------------------------------------------------------------
45
+ def setup_context_with_global_params_test(context):
46
+ context.global_name = "env:Alice"
47
+ context.global_age = 12
48
+
49
+ def setup_python_path():
50
+ # -- NEEDED-FOR: formatter.user_defined.feature
51
+ import os
52
+ PYTHONPATH = os.environ.get("PYTHONPATH", "")
53
+ os.environ["PYTHONPATH"] = "."+ os.pathsep + PYTHONPATH
@@ -0,0 +1,141 @@
1
+ Feature: Exploratory Testing with Tables and Table Annotations
2
+
3
+ As a tester
4
+ I want sometimes to explore a problem domain
5
+ And see not only the expected results
6
+ But also the actual results in a table.
7
+
8
+ . HINT: Does not work with monochrome format in pretty formatter:
9
+ . behave -f pretty --no-color ...
10
+ . behave -c ...
11
+
12
+
13
+ @setup
14
+ Scenario: Feature Setup
15
+ Given a new working directory
16
+ And a file named "features/steps/explore_with_table_steps.py" with:
17
+ """
18
+ from behave import given, when, then, step
19
+
20
+ database = {
21
+ "Alice": { "age": 10 },
22
+ "Bob": { "age": 11 },
23
+ }
24
+
25
+ @when('I query the database with')
26
+ def step_query_database_and_update_table(context):
27
+ assert context.table, "REQUIRE: table"
28
+ context.table.require_column("Name")
29
+ age_index = context.table.ensure_column_exists("Age")
30
+ for index, row in enumerate(context.table.rows):
31
+ name = row["Name"]
32
+ person = database.get(name, None)
33
+ if person:
34
+ row.cells[age_index] = str(person["age"])
35
+ context.current_table = context.table
36
+
37
+ @when('I add {number:n} to column "{column}"')
38
+ def step_query_and_annotate_database(context, number, column):
39
+ assert context.current_table, "REQUIRE: current_table"
40
+ age_index = context.current_table.ensure_column_exists("Age")
41
+ for row in context.current_table.rows:
42
+ value = int(row.cells[age_index]) or 0
43
+ row.cells[age_index] = str(value + number)
44
+
45
+ @step('note that the "{name}" column was added to the table')
46
+ def step_note_that_column_was_added(context, name):
47
+ assert context.current_table.has_column(name)
48
+
49
+ @then('note that the "{name}" column was modified in the table')
50
+ def step_note_that_column_was_modified(context, name):
51
+ pass
52
+
53
+ @then('I inspect the table')
54
+ def step_inspect_table(context):
55
+ assert context.current_table
56
+ context.table = context.current_table
57
+
58
+ @then('the table contains')
59
+ def step_inspect_table(context):
60
+ assert context.table, "REQUIRE: table"
61
+ assert context.current_table, "REQUIRE: current_table"
62
+ assert context.table == context.current_table
63
+ """
64
+
65
+
66
+ Scenario: Add table column with new data in a step and ensure changes are shown
67
+ Given a file named "features/table.set_column_data.feature" with:
68
+ """
69
+ Feature:
70
+ Scenario:
71
+ When I query the database with:
72
+ | Name |
73
+ | Alice |
74
+ | Bob |
75
+ Then note that the "Age" column was added to the table
76
+ """
77
+ When I run "behave -f plain features/table.set_column_data.feature"
78
+ Then it should pass with:
79
+ """
80
+ 1 scenario passed, 0 failed, 0 skipped
81
+ 2 steps passed, 0 failed, 0 skipped, 0 undefined
82
+ """
83
+ And the command output should contain:
84
+ """
85
+ | Name | Age |
86
+ | Alice | 10 |
87
+ | Bob | 11 |
88
+ """
89
+ But note that "the Age table column was added by the step"
90
+
91
+
92
+ Scenario: Modify table cells in a column and ensure changes are shown
93
+ Given a file named "features/table.modify_column.feature" with:
94
+ """
95
+ Feature:
96
+ Scenario:
97
+ When I query the database with:
98
+ | Name | Age |
99
+ | Alice | 222 |
100
+ | Bob | 333 |
101
+ Then note that the "Age" column was modified in the table
102
+ Then the table contains:
103
+ | Name | Age |
104
+ | Alice | 10 |
105
+ | Bob | 11 |
106
+ """
107
+ When I run "behave -f plain features/table.modify_column.feature"
108
+ Then it should pass with:
109
+ """
110
+ 1 scenario passed, 0 failed, 0 skipped
111
+ 3 steps passed, 0 failed, 0 skipped, 0 undefined
112
+ """
113
+ And the command output should contain:
114
+ """
115
+ | Name | Age |
116
+ | Alice | 10 |
117
+ | Bob | 11 |
118
+ """
119
+ But note that "the Age column was modified in the table"
120
+ And the command output should not contain:
121
+ """
122
+ | Name | Age |
123
+ | Alice | 222 |
124
+ | Bob | 333 |
125
+ """
126
+
127
+
128
+ Scenario: Modify table cells in a column (formatter=pretty with colors)
129
+ When I run "behave -f pretty features/table.modify_column.feature"
130
+ Then it should pass with:
131
+ """
132
+ 1 scenario passed, 0 failed, 0 skipped
133
+ 3 steps passed, 0 failed, 0 skipped, 0 undefined
134
+ """
135
+ And the command output should contain:
136
+ """
137
+ | Name | Age |
138
+ | Alice | 10 |
139
+ | Bob | 11 |
140
+ """
141
+ But note that "the Age column was modified in the table"