kosmas58-cucumber 0.1.16.6 → 0.1.99.21

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 (248) hide show
  1. data/History.txt +126 -2
  2. data/License.txt +1 -1
  3. data/Manifest.txt +0 -270
  4. data/Rakefile +1 -1
  5. data/bin/cucumber +2 -2
  6. data/config/hoe.rb +7 -2
  7. data/examples/cs/features/step_definitons/calculator_steps.rb +1 -1
  8. data/examples/i18n/README.textile +1 -1
  9. data/examples/i18n/Rakefile +3 -3
  10. data/examples/i18n/ar/features/step_definitons/calculator_steps.rb +1 -6
  11. data/examples/i18n/da/features/step_definitons/kalkulator_steps.rb +1 -1
  12. data/examples/i18n/de/features/addition.feature +6 -6
  13. data/examples/i18n/de/features/step_definitons/calculator_steps.rb +2 -2
  14. data/examples/i18n/en/features/addition.feature +6 -6
  15. data/examples/i18n/en/features/step_definitons/calculator_steps.rb +2 -2
  16. data/examples/i18n/es/features/adicion.feature +11 -12
  17. data/examples/i18n/es/features/step_definitons/calculador_steps.rb +7 -10
  18. data/examples/i18n/es/lib/calculador.rb +4 -1
  19. data/examples/i18n/et/features/liitmine.feature +7 -6
  20. data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +1 -1
  21. data/examples/i18n/fi/features/step_definitons/laskin_steps.rb +1 -1
  22. data/examples/i18n/fi/features/yhteenlasku.feature +2 -2
  23. data/examples/i18n/fr/features/addition.feature +2 -2
  24. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +1 -1
  25. data/examples/i18n/id/features/addition.feature +6 -6
  26. data/examples/i18n/id/features/step_definitons/calculator_steps.rb +2 -2
  27. data/examples/i18n/it/features/step_definitons/calcolatrice_steps.rb +1 -1
  28. data/examples/i18n/ja/features/step_definitons/calculator_steps.rb +2 -3
  29. data/examples/i18n/ko/features/step_definitons/calculator_steps.rb +1 -1
  30. data/examples/i18n/lt/features/addition.feature +7 -6
  31. data/examples/i18n/lt/features/step_definitons/calculator_steps.rb +2 -2
  32. data/examples/i18n/no/features/step_definitons/kalkulator_steps.rb +7 -7
  33. data/examples/i18n/no/features/summering.feature +1 -0
  34. data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +1 -1
  35. data/examples/i18n/ro/features/step_definitons/calculator_steps.rb +1 -1
  36. data/examples/i18n/se/features/step_definitons/kalkulator_steps.rb +1 -1
  37. data/examples/i18n/zh-CN/features/step_definitons/calculator_steps.rb +2 -2
  38. data/examples/java/src/cucumber/demo/Hello.java +16 -0
  39. data/examples/jbehave/README.textile +17 -0
  40. data/examples/jbehave/features/support/env.rb +7 -0
  41. data/examples/jbehave/features/trading.feature +24 -0
  42. data/examples/jbehave/pom.xml +48 -0
  43. data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/converters/TraderConverter.java +32 -0
  44. data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/model/Stock.java +42 -0
  45. data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/model/Trader.java +29 -0
  46. data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/persistence/TraderPersister.java +22 -0
  47. data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/scenarios/TraderSteps.java +65 -0
  48. data/examples/self_test/README.textile +4 -1
  49. data/examples/{calculator_ruby_features → self_test}/Rakefile +3 -3
  50. data/examples/self_test/features/background/failing_background.feature +10 -0
  51. data/examples/self_test/features/background/failing_background_after_success.feature +11 -0
  52. data/examples/self_test/features/background/multiline_args_background.feature +32 -0
  53. data/examples/self_test/features/background/passing_background.feature +10 -0
  54. data/examples/self_test/features/background/pending_background.feature +10 -0
  55. data/examples/self_test/features/background/scenario_outline_failing_background.feature +16 -0
  56. data/examples/self_test/features/background/scenario_outline_passing_background.feature +16 -0
  57. data/examples/self_test/features/call_undefined_step_from_step_def.feature +7 -0
  58. data/examples/self_test/features/lots_of_undefined.feature +8 -0
  59. data/examples/self_test/features/outline_sample.feature +11 -5
  60. data/examples/self_test/features/sample.feature +8 -3
  61. data/examples/self_test/features/step_definitions/sample_steps.rb +53 -4
  62. data/examples/self_test/features/support/env.rb +1 -0
  63. data/examples/self_test/features/support/tag_count_formatter.rb +25 -0
  64. data/examples/tickets/features/172.feature +28 -0
  65. data/examples/tickets/features/177/1.feature +29 -0
  66. data/examples/tickets/features/177/2.feature +21 -0
  67. data/examples/tickets/features/177/3.feature +18 -0
  68. data/examples/tickets/features/180.feature +7 -0
  69. data/examples/tickets/features/scenario_outline.feature +6 -1
  70. data/examples/tickets/features/step_definitons/tickets_steps.rb +27 -3
  71. data/examples/tickets/features/tickets.feature +4 -0
  72. data/features/background.feature +223 -0
  73. data/features/cucumber_cli.feature +218 -98
  74. data/features/cucumber_cli_outlines.feature +54 -37
  75. data/features/custom_formatter.feature +11 -0
  76. data/features/report_called_undefined_steps.feature +32 -0
  77. data/features/step_definitions/cucumber_steps.rb +7 -3
  78. data/features/step_definitions/extra_steps.rb +1 -1
  79. data/features/support/env.rb +2 -1
  80. data/gem_tasks/flog.rake +1 -1
  81. data/gem_tasks/gemspec.rake +2 -2
  82. data/gem_tasks/jar.rake +67 -0
  83. data/lib/autotest/cucumber_mixin.rb +17 -23
  84. data/lib/cucumber.rb +63 -11
  85. data/lib/cucumber/ast.rb +29 -0
  86. data/lib/cucumber/ast/background.rb +88 -0
  87. data/lib/cucumber/ast/comment.rb +26 -0
  88. data/lib/cucumber/ast/examples.rb +26 -0
  89. data/lib/cucumber/ast/feature.rb +66 -0
  90. data/lib/cucumber/ast/features.rb +39 -0
  91. data/lib/cucumber/ast/filter.rb +22 -0
  92. data/lib/cucumber/ast/outline_table.rb +49 -0
  93. data/lib/cucumber/ast/py_string.rb +52 -0
  94. data/lib/cucumber/ast/scenario.rb +103 -0
  95. data/lib/cucumber/ast/scenario_outline.rb +92 -0
  96. data/lib/cucumber/ast/step.rb +161 -0
  97. data/lib/cucumber/ast/steps.rb +13 -0
  98. data/lib/cucumber/ast/table.rb +218 -0
  99. data/lib/cucumber/ast/tags.rb +40 -0
  100. data/lib/cucumber/ast/visitor.rb +109 -0
  101. data/lib/cucumber/broadcaster.rb +1 -6
  102. data/lib/cucumber/cli/configuration.rb +339 -0
  103. data/lib/cucumber/cli/language_help_formatter.rb +59 -0
  104. data/lib/cucumber/cli/main.rb +100 -0
  105. data/lib/cucumber/core_ext/exception.rb +41 -8
  106. data/lib/cucumber/core_ext/instance_exec.rb +54 -0
  107. data/lib/cucumber/core_ext/proc.rb +29 -65
  108. data/lib/cucumber/core_ext/string.rb +19 -0
  109. data/lib/cucumber/formatter.rb +1 -0
  110. data/lib/cucumber/{formatters → formatter}/ansicolor.rb +14 -16
  111. data/lib/cucumber/formatter/color_io.rb +17 -0
  112. data/lib/cucumber/formatter/console.rb +119 -0
  113. data/lib/cucumber/formatter/cucumber.css +55 -0
  114. data/lib/cucumber/formatter/cucumber.sass +49 -0
  115. data/lib/cucumber/formatter/html.rb +121 -0
  116. data/lib/cucumber/formatter/pretty.rb +167 -0
  117. data/lib/cucumber/formatter/profile.rb +77 -0
  118. data/lib/cucumber/formatter/progress.rb +68 -0
  119. data/lib/cucumber/formatter/rerun.rb +35 -0
  120. data/lib/cucumber/formatter/unicode.rb +35 -0
  121. data/lib/cucumber/formatters/unicode.rb +2 -35
  122. data/lib/cucumber/jbehave.rb +102 -0
  123. data/lib/cucumber/languages.yml +128 -75
  124. data/lib/cucumber/parser.rb +43 -0
  125. data/lib/cucumber/parser/basic.rb +0 -0
  126. data/lib/cucumber/parser/feature.rb +1490 -0
  127. data/lib/cucumber/parser/feature.tt +188 -0
  128. data/lib/cucumber/parser/i18n.tt +31 -0
  129. data/lib/cucumber/parser/table.rb +402 -0
  130. data/lib/cucumber/parser/table.tt +59 -0
  131. data/lib/cucumber/parser/treetop_ext.rb +75 -0
  132. data/lib/cucumber/platform.rb +3 -17
  133. data/lib/cucumber/rails/rspec.rb +5 -2
  134. data/lib/cucumber/step_definition.rb +87 -0
  135. data/lib/cucumber/step_mother.rb +151 -66
  136. data/lib/cucumber/version.rb +2 -2
  137. data/rails_generators/cucumber/USAGE +3 -2
  138. data/rails_generators/cucumber/cucumber_generator.rb +33 -23
  139. data/rails_generators/cucumber/templates/cucumber +2 -1
  140. data/rails_generators/cucumber/templates/cucumber.rake +6 -1
  141. data/rails_generators/cucumber/templates/env.rb +1 -1
  142. data/rails_generators/feature/USAGE +3 -0
  143. data/rails_generators/feature/feature_generator.rb +30 -6
  144. data/spec/cucumber/ast/background_spec.rb +58 -0
  145. data/spec/cucumber/ast/feature_factory.rb +54 -0
  146. data/spec/cucumber/ast/feature_spec.rb +60 -0
  147. data/spec/cucumber/ast/py_string_spec.rb +40 -0
  148. data/spec/cucumber/ast/scenario_outline_spec.rb +64 -0
  149. data/spec/cucumber/ast/scenario_spec.rb +82 -0
  150. data/spec/cucumber/ast/step_spec.rb +45 -0
  151. data/spec/cucumber/ast/table_spec.rb +81 -0
  152. data/spec/cucumber/ast/tags_spec.rb +23 -0
  153. data/spec/cucumber/broadcaster_spec.rb +4 -17
  154. data/spec/cucumber/cli/configuration_spec.rb +239 -0
  155. data/spec/cucumber/cli/main_spec.rb +164 -0
  156. data/spec/cucumber/core_ext/proc_spec.rb +27 -35
  157. data/spec/cucumber/core_ext/string_spec.rb +8 -0
  158. data/spec/cucumber/{formatters → formatter}/ansicolor_spec.rb +2 -2
  159. data/spec/cucumber/formatter/html/cucumber.css +37 -0
  160. data/spec/cucumber/formatter/html/cucumber.js +13 -0
  161. data/spec/cucumber/formatter/html/index.html +45 -0
  162. data/spec/cucumber/formatter/html/jquery-1.3.min.js +19 -0
  163. data/spec/cucumber/formatter/html/jquery.uitableedit.js +100 -0
  164. data/spec/cucumber/formatters/profile_formatter_spec.rb +17 -16
  165. data/spec/cucumber/parser/feature_parser_spec.rb +281 -0
  166. data/spec/cucumber/parser/table_parser_spec.rb +48 -0
  167. data/spec/cucumber/step_definition_spec.rb +62 -0
  168. data/spec/cucumber/step_mother_spec.rb +50 -51
  169. data/spec/cucumber/treetop_parser/empty_feature.feature +1 -1
  170. data/spec/cucumber/treetop_parser/scenario_outline.feature +1 -1
  171. data/spec/cucumber/treetop_parser/spaces.feature +3 -1
  172. data/spec/cucumber/treetop_parser/with_comments.feature +1 -1
  173. data/spec/cucumber/treetop_parser/with_tags.feature +18 -0
  174. data/spec/cucumber/world/pending_spec.rb +13 -12
  175. data/spec/spec_helper.rb +1 -1
  176. metadata +107 -79
  177. data/examples/calculator_ruby_features/features/addition.rb +0 -39
  178. data/examples/calculator_ruby_features/features/step_definitons/calculator_steps.rb +0 -43
  179. data/gem_tasks/treetop.rake +0 -41
  180. data/lib/cucumber/cli.rb +0 -355
  181. data/lib/cucumber/executor.rb +0 -205
  182. data/lib/cucumber/formatters.rb +0 -1
  183. data/lib/cucumber/formatters/autotest_formatter.rb +0 -23
  184. data/lib/cucumber/formatters/cucumber.css +0 -132
  185. data/lib/cucumber/formatters/cucumber.js +0 -11
  186. data/lib/cucumber/formatters/html_formatter.rb +0 -152
  187. data/lib/cucumber/formatters/jquery.js +0 -32
  188. data/lib/cucumber/formatters/pretty_formatter.rb +0 -285
  189. data/lib/cucumber/formatters/profile_formatter.rb +0 -92
  190. data/lib/cucumber/formatters/progress_formatter.rb +0 -61
  191. data/lib/cucumber/model.rb +0 -1
  192. data/lib/cucumber/model/table.rb +0 -32
  193. data/lib/cucumber/step_methods.rb +0 -49
  194. data/lib/cucumber/tree.rb +0 -16
  195. data/lib/cucumber/tree/feature.rb +0 -105
  196. data/lib/cucumber/tree/features.rb +0 -21
  197. data/lib/cucumber/tree/given_scenario.rb +0 -13
  198. data/lib/cucumber/tree/scenario.rb +0 -240
  199. data/lib/cucumber/tree/step.rb +0 -173
  200. data/lib/cucumber/tree/table.rb +0 -26
  201. data/lib/cucumber/tree/top_down_visitor.rb +0 -23
  202. data/lib/cucumber/treetop_parser/feature.treetop.erb +0 -254
  203. data/lib/cucumber/treetop_parser/feature_ar.rb +0 -1951
  204. data/lib/cucumber/treetop_parser/feature_cy.rb +0 -1951
  205. data/lib/cucumber/treetop_parser/feature_da.rb +0 -1951
  206. data/lib/cucumber/treetop_parser/feature_de.rb +0 -1951
  207. data/lib/cucumber/treetop_parser/feature_en-lol.rb +0 -1951
  208. data/lib/cucumber/treetop_parser/feature_en-tx.rb +0 -1951
  209. data/lib/cucumber/treetop_parser/feature_en.rb +0 -1951
  210. data/lib/cucumber/treetop_parser/feature_es.rb +0 -1951
  211. data/lib/cucumber/treetop_parser/feature_et.rb +0 -1951
  212. data/lib/cucumber/treetop_parser/feature_fi.rb +0 -1951
  213. data/lib/cucumber/treetop_parser/feature_fr.rb +0 -1951
  214. data/lib/cucumber/treetop_parser/feature_id.rb +0 -1951
  215. data/lib/cucumber/treetop_parser/feature_it.rb +0 -1951
  216. data/lib/cucumber/treetop_parser/feature_ja.rb +0 -1951
  217. data/lib/cucumber/treetop_parser/feature_ko.rb +0 -1951
  218. data/lib/cucumber/treetop_parser/feature_lt.rb +0 -1951
  219. data/lib/cucumber/treetop_parser/feature_nl.rb +0 -1951
  220. data/lib/cucumber/treetop_parser/feature_no.rb +0 -1951
  221. data/lib/cucumber/treetop_parser/feature_parser.rb +0 -36
  222. data/lib/cucumber/treetop_parser/feature_pl.rb +0 -1951
  223. data/lib/cucumber/treetop_parser/feature_pt.rb +0 -1951
  224. data/lib/cucumber/treetop_parser/feature_ro.rb +0 -1951
  225. data/lib/cucumber/treetop_parser/feature_ro2.rb +0 -1951
  226. data/lib/cucumber/treetop_parser/feature_ru.rb +0 -1951
  227. data/lib/cucumber/treetop_parser/feature_se.rb +0 -1951
  228. data/lib/cucumber/treetop_parser/feature_zh-CN.rb +0 -1951
  229. data/lib/cucumber/world.rb +0 -1
  230. data/lib/cucumber/world/pending.rb +0 -22
  231. data/setup.rb +0 -1585
  232. data/spec/cucumber/cli_spec.rb +0 -521
  233. data/spec/cucumber/executor_spec.rb +0 -382
  234. data/spec/cucumber/formatters/autotest_formatter_spec.rb +0 -26
  235. data/spec/cucumber/formatters/features.html +0 -269
  236. data/spec/cucumber/formatters/html_formatter_spec.rb +0 -110
  237. data/spec/cucumber/formatters/pretty_formatter_spec.rb +0 -410
  238. data/spec/cucumber/formatters/progress_formatter_spec.rb +0 -81
  239. data/spec/cucumber/model/table_spec.rb +0 -32
  240. data/spec/cucumber/tree/feature_spec.rb +0 -122
  241. data/spec/cucumber/tree/row_scenario_outline_spec.rb +0 -73
  242. data/spec/cucumber/tree/row_scenario_spec.rb +0 -55
  243. data/spec/cucumber/tree/row_step_outline_spec.rb +0 -38
  244. data/spec/cucumber/tree/scenario_outline_spec.rb +0 -50
  245. data/spec/cucumber/tree/scenario_spec.rb +0 -134
  246. data/spec/cucumber/tree/step_outline_spec.rb +0 -17
  247. data/spec/cucumber/tree/step_spec.rb +0 -59
  248. data/spec/cucumber/treetop_parser/feature_parser_spec.rb +0 -120
@@ -0,0 +1,55 @@
1
+
2
+
3
+
4
+
5
+
6
+ .cucumber {
7
+ background: black;
8
+ color: white;
9
+ padding: 1em;
10
+ }
11
+ .cucumber .passed {
12
+ color: green;
13
+ }
14
+ .cucumber .undefined {
15
+ color: yellow;
16
+ }
17
+ .cucumber .pending {
18
+ color: yellow;
19
+ }
20
+ .cucumber .failed {
21
+ color: red;
22
+ }
23
+ .cucumber .skipped {
24
+ color: cyan;
25
+ }
26
+ .cucumber .outline {
27
+ color: cyan;
28
+ }
29
+ .cucumber .param {
30
+ font-weight: bold;
31
+ }
32
+ .cucumber a {
33
+ text-decoration: none;
34
+ color: inherit;
35
+ }
36
+ .cucumber a:hover {
37
+ text-decoration: underline;
38
+ }
39
+ .cucumber a:visited {
40
+ font-weight: normal;
41
+ }
42
+ .cucumber ol {
43
+ list-style: none;
44
+ }
45
+ .cucumber .stats {
46
+ margin: 2em;
47
+ }
48
+ .cucumber .summary ul.features li {
49
+ display: inline;
50
+ }
51
+ .cucumber .backtrace {
52
+ margin-top: 0;
53
+ margin-bottom: 0;
54
+ margin-left: 1em;
55
+ }
@@ -0,0 +1,49 @@
1
+ # cucumber.css is generated from cucumber.sass
2
+ # Regenerate with the following command:
3
+ #
4
+ # sass -t expanded lib/cucumber/formatter/cucumber.sass > lib/cucumber/formatter/cucumber.css
5
+ #
6
+ .cucumber
7
+ :background black
8
+ :color white
9
+ :padding 1em
10
+
11
+ .passed
12
+ :color green
13
+ .undefined
14
+ :color yellow
15
+ .pending
16
+ :color yellow
17
+ .failed
18
+ :color red
19
+ .skipped
20
+ :color cyan
21
+ .outline
22
+ :color cyan
23
+ .param
24
+ :font-weight bold
25
+
26
+ a
27
+ :text-decoration none
28
+ :color inherit
29
+
30
+ &:hover
31
+ :text-decoration underline
32
+ &:visited
33
+ :font-weight normal
34
+
35
+ ol
36
+ :list-style none
37
+
38
+ .stats
39
+ :margin 2em
40
+
41
+ .summary
42
+ ul.features
43
+ li
44
+ :display inline
45
+
46
+ .backtrace
47
+ :margin-top 0
48
+ :margin-bottom 0
49
+ :margin-left 1em
@@ -0,0 +1,121 @@
1
+ require 'builder'
2
+
3
+ module Cucumber
4
+ module Formatter
5
+ class Html < Ast::Visitor
6
+ def initialize(step_mother, io, options)
7
+ super(step_mother)
8
+ @builder = Builder::XmlMarkup.new(:target => io, :indent => 2)
9
+ end
10
+
11
+ def visit_features(features)
12
+ # <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
13
+ @builder.declare!(
14
+ :DOCTYPE,
15
+ :html,
16
+ :PUBLIC,
17
+ '-//W3C//DTD XHTML 1.0 Strict//EN',
18
+ 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'
19
+ )
20
+ @builder.html(:xmlns => 'http://www.w3.org/1999/xhtml') do
21
+ @builder.head do
22
+ @builder.title 'Cucumber'
23
+ inline_css
24
+ end
25
+ @builder.body do
26
+ @builder.div(:class => 'cucumber') do
27
+ super
28
+ end
29
+ end
30
+ end
31
+ end
32
+
33
+ def visit_feature(feature)
34
+ @builder.div(:class => 'feature') do
35
+ super
36
+ end
37
+ end
38
+
39
+ def visit_feature_name(name)
40
+ lines = name.split(/\r?\n/)
41
+ @builder.h2(lines[0])
42
+ @builder.p do
43
+ lines[1..-1].each do |line|
44
+ @builder.text!(line.strip)
45
+ @builder.br
46
+ end
47
+ end
48
+ end
49
+
50
+ def visit_background(background)
51
+ @builder.div(:class => 'background') do
52
+ @builder.ol do
53
+ super
54
+ end
55
+ end
56
+ end
57
+
58
+ def visit_feature_element(feature_element)
59
+ @builder.div(:class => 'scenario') do
60
+ super
61
+ end
62
+ @open_step_list = true
63
+ end
64
+
65
+ def visit_scenario_name(keyword, name, file_line, source_indent)
66
+ @builder.h3("#{keyword} #{name}")
67
+ end
68
+
69
+ def visit_outline_table(outline_table)
70
+ @builder.table do
71
+ super(outline_table)
72
+ end
73
+ end
74
+
75
+ def visit_examples_name(keyword, name)
76
+ @builder.h4("#{keyword} #{name}")
77
+ end
78
+
79
+ def visit_steps(scenarios)
80
+ @builder.ol do
81
+ super
82
+ end
83
+ end
84
+
85
+ def visit_step_name(keyword, step_name, status, step_definition, source_indent)
86
+ @builder.li("#{keyword} #{step_name}", :class => status)
87
+ end
88
+
89
+ def visit_multiline_arg(multiline_arg, status)
90
+ if Ast::Table === multiline_arg
91
+ @builder.table do
92
+ super(multiline_arg, status)
93
+ end
94
+ else
95
+ @builder.p do
96
+ super(multiline_arg, status)
97
+ end
98
+ end
99
+ end
100
+
101
+ def visit_table_row(table_row, status)
102
+ @builder.tr do
103
+ super(table_row, status)
104
+ end
105
+ end
106
+
107
+ def visit_table_cell_value(value, width, status)
108
+ @builder.td(value, :class => status)
109
+ end
110
+
111
+ private
112
+
113
+ def inline_css
114
+ @builder.style(:type => 'text/css') do
115
+ @builder.text!(File.read(File.dirname(__FILE__) + '/cucumber.css'))
116
+ end
117
+ end
118
+
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,167 @@
1
+ require 'cucumber/formatter/console'
2
+ require 'fileutils'
3
+
4
+ module Cucumber
5
+ module Formatter
6
+ # This formatter prints features to plain text - exactly how they were parsed,
7
+ # just prettier. That means with proper indentation and alignment of table columns.
8
+ #
9
+ # If the output is STDOUT (and not a file), there are bright colours to watch too.
10
+ #
11
+ class Pretty < Ast::Visitor
12
+ include FileUtils
13
+ include Console
14
+ attr_writer :indent
15
+
16
+ def initialize(step_mother, io, options, delim='|')
17
+ super(step_mother)
18
+ @io = io
19
+ @options = options
20
+ @delim = delim
21
+ @indent = 0
22
+ end
23
+
24
+ def visit_features(features)
25
+ super
26
+ print_summary(features) unless @options[:autoformat]
27
+ end
28
+
29
+ def visit_feature(feature)
30
+ @indent = 0
31
+ if @options[:autoformat]
32
+ file = File.join(@options[:autoformat], feature.file)
33
+ dir = File.dirname(file)
34
+ mkdir_p(dir) unless File.directory?(dir)
35
+ File.open(file, Cucumber.file_mode('w')) do |io|
36
+ @io = io
37
+ with_color do
38
+ feature.accept(self)
39
+ end
40
+ end
41
+ else
42
+ with_color do
43
+ feature.accept(self)
44
+ end
45
+ end
46
+ end
47
+
48
+ def visit_comment(comment)
49
+ comment.accept(self)
50
+ end
51
+
52
+ def visit_comment_line(comment_line)
53
+ unless comment_line.blank?
54
+ @io.puts(comment_line.indent(@indent))
55
+ @io.flush
56
+ end
57
+ end
58
+
59
+ def visit_tags(tags)
60
+ tags.accept(self)
61
+ if @indent == 1
62
+ @io.puts
63
+ @io.flush
64
+ end
65
+ end
66
+
67
+ def visit_tag_name(tag_name)
68
+ tag = format_string("@#{tag_name}", :tag).indent(@indent)
69
+ @io.print(tag)
70
+ @io.flush
71
+ @indent = 1
72
+ end
73
+
74
+ def visit_feature_name(name)
75
+ @io.puts(name)
76
+ @io.puts
77
+ @io.flush
78
+ end
79
+
80
+ def visit_feature_element(feature_element)
81
+ @indent = 2
82
+ @last_undefined = feature_element.undefined?
83
+ feature_element.accept(self)
84
+ @io.puts
85
+ @io.flush
86
+ end
87
+
88
+ def visit_background(background)
89
+ @indent = 2
90
+ background_already_visible = background.already_visited_steps?
91
+ background.accept(self)
92
+ @io.puts unless background_already_visible
93
+ end
94
+
95
+ def visit_examples(examples)
96
+ examples.accept(self)
97
+ end
98
+
99
+ def visit_examples_name(keyword, name)
100
+ @io.puts("\n #{keyword} #{name}")
101
+ @io.flush
102
+ @indent = 4
103
+ end
104
+
105
+ def visit_scenario_name(keyword, name, file_line, source_indent)
106
+ line = " #{keyword} #{name}"
107
+ line = format_string(line, :undefined) if @last_undefined
108
+ @io.print(line)
109
+ if @options[:source]
110
+ line_comment = " # #{file_line}".indent(source_indent)
111
+ @io.print(format_string(line_comment, :comment))
112
+ end
113
+ @io.puts
114
+ @io.flush
115
+ end
116
+
117
+ def visit_step(step)
118
+ @indent = 6
119
+ exception = step.accept(self)
120
+ print_exception(exception, @indent) if exception
121
+ end
122
+
123
+ def visit_step_name(keyword, step_name, status, step_definition, source_indent)
124
+ source_indent = nil unless @options[:source]
125
+ formatted_step_name = format_step(keyword, step_name, status, step_definition, source_indent)
126
+ @io.puts(" " + formatted_step_name)
127
+ @io.flush
128
+ end
129
+
130
+ def visit_multiline_arg(multiline_arg, status)
131
+ return if @options[:no_multiline]
132
+ multiline_arg.accept(self, status)
133
+ end
134
+
135
+ def visit_table_row(table_row, status)
136
+ @io.print @delim.indent(@indent)
137
+ exception = table_row.accept(self, status)
138
+ @io.puts
139
+ print_exception(exception, 6) if exception
140
+ end
141
+
142
+ def visit_py_string(string, status)
143
+ s = "\"\"\"\n#{string}\n\"\"\"".indent(@indent)
144
+ s = s.split("\n").map{|l| l =~ /^\s+$/ ? '' : l}.join("\n")
145
+ @io.puts(format_string(s, status))
146
+ @io.flush
147
+ end
148
+
149
+ def visit_table_cell(table_cell, status)
150
+ table_cell.accept(self, status)
151
+ end
152
+
153
+ def visit_table_cell_value(value, width, status)
154
+ @io.print(' ' + format_string((value.to_s || '').ljust(width), status) + " #{@delim}")
155
+ @io.flush
156
+ end
157
+
158
+ private
159
+
160
+ def print_summary(features)
161
+ print_counts(features)
162
+ print_snippets(features, @options)
163
+ end
164
+
165
+ end
166
+ end
167
+ end
@@ -0,0 +1,77 @@
1
+ require 'cucumber/formatter/progress'
2
+
3
+ module Cucumber
4
+ module Formatter
5
+ class Profile < Progress
6
+ NUMBER_OF_STEP_DEFINITONS_TO_SHOW = 10
7
+ NUMBER_OF_STEP_INVOCATIONS_TO_SHOW = 5
8
+
9
+ def initialize(step_mother, io, options)
10
+ super
11
+ @step_definition_durations = Hash.new { |h,step_definition| h[step_definition] = [] }
12
+ end
13
+
14
+ def visit_step(step)
15
+ @step_duration = Time.now
16
+ @step = step
17
+ super
18
+ end
19
+
20
+ def visit_step_name(keyword, step_name, status, step_definition, source_indent)
21
+ duration = Time.now - @step_duration
22
+ super
23
+
24
+ if step_definition # nil for outline steps
25
+ description = format_step(keyword, step_name, status, step_definition, nil)
26
+ @step_definition_durations[step_definition] << [duration, description, @step.file_line]
27
+ end
28
+ end
29
+
30
+ def print_summary(features)
31
+ super
32
+ @io.puts "\n\nTop #{NUMBER_OF_STEP_DEFINITONS_TO_SHOW} average slowest steps with #{NUMBER_OF_STEP_INVOCATIONS_TO_SHOW} slowest matches:\n"
33
+
34
+ mean_durations = map_to_mean_durations(@step_definition_durations)
35
+ mean_durations = mean_durations.sort_by do |duration_description_location, step_definition, mean_duration|
36
+ mean_duration
37
+ end.reverse
38
+
39
+ mean_durations[0...NUMBER_OF_STEP_DEFINITONS_TO_SHOW].each do |duration_description_location, step_definition, mean_duration|
40
+ print_step_definition(step_definition, mean_duration)
41
+ duration_description_location = duration_description_location.sort_by do |duration, description, location|
42
+ duration
43
+ end.reverse
44
+ print_step_definitions(duration_description_location, step_definition)
45
+ end
46
+ end
47
+
48
+ private
49
+
50
+ def map_to_mean_durations(step_definition_durations)
51
+ mean_durations = []
52
+ step_definition_durations.each do |step_definition, duration_description_location|
53
+ total_duration = duration_description_location.inject(0) { |sum, step_details| step_details[0] + sum }
54
+ mean_duration = total_duration / duration_description_location.length
55
+
56
+ mean_durations << [duration_description_location, step_definition, mean_duration]
57
+ end
58
+ mean_durations
59
+ end
60
+
61
+ def print_step_definition(step_definition, mean_duration)
62
+ duration = sprintf("%.7f", mean_duration)
63
+ @io.puts format_string("#{duration} #{step_definition.to_backtrace_line}", :failed)
64
+ end
65
+
66
+ def print_step_definitions(duration_description_location, step_definition)
67
+ max_length = duration_description_location[0...NUMBER_OF_STEP_INVOCATIONS_TO_SHOW].map{|_, d, _| d.jlength}.max
68
+ duration_description_location[0...NUMBER_OF_STEP_INVOCATIONS_TO_SHOW].each do |duration, description, location|
69
+ @io.print format_string(" #{sprintf("%.7f", duration)}", :pending)
70
+ @io.print " #{description}"
71
+ @io.print format_string(" # #{location}".indent(max_length - description.jlength), :comment)
72
+ @io.puts
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end