bryanl-gherkin 2.11.1.1-java
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.
- data/.gitattributes +2 -0
- data/.mailmap +2 -0
- data/.rbenv-gemsets +1 -0
- data/.rspec +1 -0
- data/.rvmrc +1 -0
- data/.travis.yml +16 -0
- data/.yardopts +5 -0
- data/Gemfile +5 -0
- data/History.md +788 -0
- data/LICENSE +20 -0
- data/README.md +272 -0
- data/Rakefile +26 -0
- data/build_native_gems.sh +7 -0
- data/cucumber.yml +4 -0
- data/examples/parse_and_output_json.rb +19 -0
- data/features/.cucumber/stepdefs.json +244 -0
- data/features/escaped_pipes.feature +8 -0
- data/features/feature_parser.feature +237 -0
- data/features/json_formatter.feature +498 -0
- data/features/json_parser.feature +331 -0
- data/features/native_lexer.feature +19 -0
- data/features/parser_with_native_lexer.feature +205 -0
- data/features/pretty_formatter.feature +16 -0
- data/features/step_definitions/eyeball_steps.rb +3 -0
- data/features/step_definitions/gherkin_steps.rb +29 -0
- data/features/step_definitions/json_formatter_steps.rb +30 -0
- data/features/step_definitions/json_parser_steps.rb +20 -0
- data/features/step_definitions/pretty_formatter_steps.rb +85 -0
- data/features/steps_parser.feature +46 -0
- data/features/support/env.rb +42 -0
- data/gherkin.gemspec +77 -0
- data/install_mingw_os_x.sh +7 -0
- data/js/.npmignore +1 -0
- data/js/lib/gherkin/lexer/.npmignore +0 -0
- data/lib/gherkin/c_lexer.rb +17 -0
- data/lib/gherkin/formatter/ansi_escapes.rb +97 -0
- data/lib/gherkin/formatter/argument.rb +16 -0
- data/lib/gherkin/formatter/escaping.rb +15 -0
- data/lib/gherkin/formatter/filter_formatter.rb +146 -0
- data/lib/gherkin/formatter/hashable.rb +19 -0
- data/lib/gherkin/formatter/json_formatter.rb +122 -0
- data/lib/gherkin/formatter/line_filter.rb +26 -0
- data/lib/gherkin/formatter/model.rb +281 -0
- data/lib/gherkin/formatter/pretty_formatter.rb +244 -0
- data/lib/gherkin/formatter/regexp_filter.rb +21 -0
- data/lib/gherkin/formatter/step_printer.rb +21 -0
- data/lib/gherkin/formatter/tag_count_formatter.rb +47 -0
- data/lib/gherkin/formatter/tag_filter.rb +19 -0
- data/lib/gherkin/i18n.rb +180 -0
- data/lib/gherkin/i18n.yml +613 -0
- data/lib/gherkin/js_lexer.rb +20 -0
- data/lib/gherkin/json_parser.rb +177 -0
- data/lib/gherkin/lexer/i18n_lexer.rb +46 -0
- data/lib/gherkin/listener/event.rb +45 -0
- data/lib/gherkin/listener/formatter_listener.rb +143 -0
- data/lib/gherkin/native/java.rb +72 -0
- data/lib/gherkin/native/null.rb +5 -0
- data/lib/gherkin/native/therubyracer.rb +39 -0
- data/lib/gherkin/native.rb +7 -0
- data/lib/gherkin/parser/meta.txt +5 -0
- data/lib/gherkin/parser/parser.rb +164 -0
- data/lib/gherkin/parser/root.txt +11 -0
- data/lib/gherkin/parser/steps.txt +4 -0
- data/lib/gherkin/rb_lexer/README.rdoc +8 -0
- data/lib/gherkin/rb_lexer.rb +8 -0
- data/lib/gherkin/rubify.rb +24 -0
- data/lib/gherkin/tag_expression.rb +62 -0
- data/lib/gherkin.jar +0 -0
- data/lib/gherkin.rb +2 -0
- data/ragel/lexer.c.rl.erb +454 -0
- data/ragel/lexer.java.rl.erb +219 -0
- data/ragel/lexer.js.rl.erb +227 -0
- data/ragel/lexer.rb.rl.erb +174 -0
- data/ragel/lexer_common.rl.erb +50 -0
- data/spec/gherkin/c_lexer_spec.rb +22 -0
- data/spec/gherkin/fixtures/1.feature +8 -0
- data/spec/gherkin/fixtures/comments_in_table.feature +9 -0
- data/spec/gherkin/fixtures/complex.feature +45 -0
- data/spec/gherkin/fixtures/complex.json +139 -0
- data/spec/gherkin/fixtures/complex_for_filtering.feature +60 -0
- data/spec/gherkin/fixtures/complex_with_tags.feature +61 -0
- data/spec/gherkin/fixtures/dos_line_endings.feature +45 -0
- data/spec/gherkin/fixtures/examples_with_only_header.feature +14 -0
- data/spec/gherkin/fixtures/hantu_pisang.feature +35 -0
- data/spec/gherkin/fixtures/i18n_fr.feature +14 -0
- data/spec/gherkin/fixtures/i18n_fr2.feature +8 -0
- data/spec/gherkin/fixtures/i18n_no.feature +7 -0
- data/spec/gherkin/fixtures/i18n_pt1.feature +44 -0
- data/spec/gherkin/fixtures/i18n_pt2.feature +4 -0
- data/spec/gherkin/fixtures/i18n_pt3.feature +4 -0
- data/spec/gherkin/fixtures/i18n_pt4.feature +4 -0
- data/spec/gherkin/fixtures/i18n_zh-CN.feature +9 -0
- data/spec/gherkin/fixtures/issue_145.feature +22 -0
- data/spec/gherkin/fixtures/scenario_outline_with_tags.feature +13 -0
- data/spec/gherkin/fixtures/scenario_without_steps.feature +5 -0
- data/spec/gherkin/fixtures/simple_with_comments.feature +7 -0
- data/spec/gherkin/fixtures/simple_with_tags.feature +11 -0
- data/spec/gherkin/fixtures/with_bom.feature +3 -0
- data/spec/gherkin/formatter/ansi_escapes_spec.rb +32 -0
- data/spec/gherkin/formatter/filter_formatter_spec.rb +204 -0
- data/spec/gherkin/formatter/json_formatter_spec.rb +92 -0
- data/spec/gherkin/formatter/model_spec.rb +28 -0
- data/spec/gherkin/formatter/pretty_formatter_spec.rb +177 -0
- data/spec/gherkin/formatter/spaces.feature +9 -0
- data/spec/gherkin/formatter/step_printer_spec.rb +55 -0
- data/spec/gherkin/formatter/tabs.feature +9 -0
- data/spec/gherkin/formatter/tag_count_formatter_spec.rb +30 -0
- data/spec/gherkin/i18n_spec.rb +241 -0
- data/spec/gherkin/java_lexer_spec.rb +20 -0
- data/spec/gherkin/js_lexer_spec.rb +23 -0
- data/spec/gherkin/json_parser_spec.rb +176 -0
- data/spec/gherkin/lexer/i18n_lexer_spec.rb +43 -0
- data/spec/gherkin/output_stream_string_io.rb +20 -0
- data/spec/gherkin/parser/parser_spec.rb +16 -0
- data/spec/gherkin/rb_lexer_spec.rb +20 -0
- data/spec/gherkin/sexp_recorder.rb +59 -0
- data/spec/gherkin/shared/bom_group.rb +20 -0
- data/spec/gherkin/shared/doc_string_group.rb +163 -0
- data/spec/gherkin/shared/lexer_group.rb +591 -0
- data/spec/gherkin/shared/row_group.rb +125 -0
- data/spec/gherkin/shared/tags_group.rb +54 -0
- data/spec/gherkin/tag_expression_spec.rb +142 -0
- data/spec/spec_helper.rb +75 -0
- data/tasks/bench/feature_builder.rb +49 -0
- data/tasks/bench/null_listener.rb +4 -0
- data/tasks/bench.rake +184 -0
- data/tasks/compile.rake +120 -0
- data/tasks/cucumber.rake +22 -0
- data/tasks/gems.rake +31 -0
- data/tasks/ikvm.rake +124 -0
- data/tasks/ragel_task.rb +100 -0
- data/tasks/release.rake +49 -0
- data/tasks/rspec.rake +8 -0
- data/tasks/yard/default/layout/html/bubble_32x32.png +0 -0
- data/tasks/yard/default/layout/html/bubble_48x48.png +0 -0
- data/tasks/yard/default/layout/html/footer.erb +5 -0
- data/tasks/yard/default/layout/html/index.erb +1 -0
- data/tasks/yard/default/layout/html/layout.erb +25 -0
- data/tasks/yard/default/layout/html/logo.erb +1 -0
- data/tasks/yard/default/layout/html/setup.rb +4 -0
- data/tasks/yard.rake +7 -0
- metadata +412 -0
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
module Gherkin
|
|
2
|
+
module Formatter
|
|
3
|
+
class TagCountFormatter
|
|
4
|
+
def initialize(formatter, tag_counts)
|
|
5
|
+
@formatter = formatter
|
|
6
|
+
@tag_counts = tag_counts
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def uri(uri)
|
|
10
|
+
@uri = uri
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def feature(feature)
|
|
14
|
+
@feature_tags = feature.tags
|
|
15
|
+
@formatter.feature(feature)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def scenario(scenario)
|
|
19
|
+
record_tags((@feature_tags.to_a + scenario.tags.to_a).uniq, scenario.line)
|
|
20
|
+
@formatter.scenario(scenario)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def scenario_outline(scenario_outline)
|
|
24
|
+
@scenario_outline_tags = scenario_outline.tags
|
|
25
|
+
@formatter.scenario_outline(scenario_outline)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def examples(examples)
|
|
29
|
+
record_tags((@feature_tags.to_a + @scenario_outline_tags.to_a + examples.tags.to_a).uniq, examples.line)
|
|
30
|
+
@formatter.examples(examples)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
private
|
|
34
|
+
|
|
35
|
+
def record_tags(tags, line)
|
|
36
|
+
tags.each do |tag|
|
|
37
|
+
@tag_counts[tag.name] ||= []
|
|
38
|
+
@tag_counts[tag.name] << "#{@uri}:#{line}"
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def method_missing(*args)
|
|
43
|
+
@formatter.__send__(*args)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
require 'gherkin/tag_expression'
|
|
2
|
+
|
|
3
|
+
module Gherkin
|
|
4
|
+
module Formatter
|
|
5
|
+
class TagFilter
|
|
6
|
+
def initialize(tags)
|
|
7
|
+
@tag_expression = TagExpression.new(tags)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def eval(tags, names, ranges)
|
|
11
|
+
@tag_expression.eval(tags.uniq)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def filter_table_body_rows(rows)
|
|
15
|
+
rows
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
data/lib/gherkin/i18n.rb
ADDED
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
require 'yaml'
|
|
2
|
+
require 'gherkin/rubify'
|
|
3
|
+
require 'gherkin/native'
|
|
4
|
+
|
|
5
|
+
module Gherkin
|
|
6
|
+
class I18n
|
|
7
|
+
LexerNotFound = Class.new(LoadError)
|
|
8
|
+
|
|
9
|
+
native_impl('gherkin') unless defined?(BYPASS_NATIVE_IMPL)
|
|
10
|
+
|
|
11
|
+
FEATURE_ELEMENT_KEYS = %w{feature background scenario scenario_outline examples}
|
|
12
|
+
STEP_KEYWORD_KEYS = %w{given when then and but}
|
|
13
|
+
KEYWORD_KEYS = FEATURE_ELEMENT_KEYS + STEP_KEYWORD_KEYS
|
|
14
|
+
LANGUAGES = YAML.load_file(File.dirname(__FILE__) + '/i18n.yml')
|
|
15
|
+
|
|
16
|
+
class << self
|
|
17
|
+
include Rubify
|
|
18
|
+
|
|
19
|
+
# Used by code generators for other lexer tools like pygments lexer and textmate bundle
|
|
20
|
+
def all
|
|
21
|
+
LANGUAGES.keys.sort.map{|iso_code| get(iso_code)}
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def get(iso_code)
|
|
25
|
+
languages[iso_code] ||= new(iso_code)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Returns all keyword translations and aliases of +keywords+, escaped and joined with <tt>|</tt>.
|
|
29
|
+
# This method is convenient for editor support and syntax highlighting engines for Gherkin, where
|
|
30
|
+
# there is typically a code generation tool to generate regular expressions for recognising the
|
|
31
|
+
# various I18n translations of Gherkin's keywords.
|
|
32
|
+
#
|
|
33
|
+
# The +keywords+ arguments can be one of <tt>:feature</tt>, <tt>:background</tt>, <tt>:scenario</tt>,
|
|
34
|
+
# <tt>:scenario_outline</tt>, <tt>:examples</tt>, <tt>:step</tt>.
|
|
35
|
+
def keyword_regexp(*keywords)
|
|
36
|
+
unique_keywords = all.map do |i18n|
|
|
37
|
+
keywords.map do |keyword|
|
|
38
|
+
if keyword.to_s == 'step'
|
|
39
|
+
i18n.step_keywords.to_a
|
|
40
|
+
else
|
|
41
|
+
i18n.keywords(keyword).to_a
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
unique_keywords.flatten.compact.map{|kw| kw.to_s}.sort.reverse.uniq.join('|').gsub(/\*/, '\*')
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def code_keywords
|
|
50
|
+
rubify(all.map{|i18n| i18n.code_keywords}).flatten.uniq.sort
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def code_keyword_for(gherkin_keyword)
|
|
54
|
+
gherkin_keyword.gsub(/[\s',!]/, '').strip
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def language_table
|
|
58
|
+
require 'stringio'
|
|
59
|
+
require 'gherkin/formatter/pretty_formatter'
|
|
60
|
+
require 'gherkin/formatter/model'
|
|
61
|
+
io = StringIO.new
|
|
62
|
+
pf = Gherkin::Formatter::PrettyFormatter.new(io, true, false)
|
|
63
|
+
table = all.map do |i18n|
|
|
64
|
+
Formatter::Model::DataTableRow.new([], [i18n.iso_code, i18n.keywords('name')[0], i18n.keywords('native')[0]], nil)
|
|
65
|
+
end
|
|
66
|
+
pf.table(table)
|
|
67
|
+
io.string
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def unicode_escape(word, prefix="\\u")
|
|
71
|
+
word = word.unpack("U*").map do |c|
|
|
72
|
+
if c > 127 || c == 32
|
|
73
|
+
"#{prefix}%04x" % c
|
|
74
|
+
else
|
|
75
|
+
c.chr
|
|
76
|
+
end
|
|
77
|
+
end.join
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
private
|
|
81
|
+
|
|
82
|
+
def languages
|
|
83
|
+
@languages ||= {}
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
attr_reader :iso_code
|
|
88
|
+
|
|
89
|
+
def initialize(iso_code)
|
|
90
|
+
@iso_code = iso_code
|
|
91
|
+
@keywords = LANGUAGES[iso_code]
|
|
92
|
+
raise "Language not supported: #{iso_code.inspect}" if @iso_code.nil?
|
|
93
|
+
@keywords['grammar_name'] = @keywords['name'].gsub(/\s/, '')
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def lexer(listener, force_ruby=false)
|
|
97
|
+
if force_ruby
|
|
98
|
+
rb(listener)
|
|
99
|
+
else
|
|
100
|
+
begin
|
|
101
|
+
c(listener)
|
|
102
|
+
rescue NameError, LoadError => e
|
|
103
|
+
warn("WARNING: #{e.message}. Reverting to Ruby lexer.")
|
|
104
|
+
rb(listener)
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
rescue LoadError => e
|
|
108
|
+
raise LexerNotFound, "No lexer was found for #{iso_code} (#{e.message}). Supported languages are listed in gherkin/i18n.yml."
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def c(listener)
|
|
112
|
+
require 'gherkin/c_lexer'
|
|
113
|
+
CLexer[underscored_iso_code].new(listener)
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def rb(listener)
|
|
117
|
+
require 'gherkin/rb_lexer'
|
|
118
|
+
RbLexer[underscored_iso_code].new(listener)
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def js(listener)
|
|
122
|
+
require 'gherkin/js_lexer'
|
|
123
|
+
JsLexer[underscored_iso_code].new(listener)
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def underscored_iso_code
|
|
127
|
+
@iso_code.gsub(/[\s-]/, '_').downcase
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
# Keywords that can be used in Gherkin source
|
|
131
|
+
def step_keywords
|
|
132
|
+
STEP_KEYWORD_KEYS.map{|iso_code| keywords(iso_code)}.flatten.uniq
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
# Keywords that can be used in code
|
|
136
|
+
def code_keywords
|
|
137
|
+
result = step_keywords.map{|keyword| self.class.code_keyword_for(keyword)}
|
|
138
|
+
result.delete('*')
|
|
139
|
+
result
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def keywords(key)
|
|
143
|
+
key = key.to_s
|
|
144
|
+
raise "No #{key.inspect} in #{@keywords.inspect}" if @keywords[key].nil?
|
|
145
|
+
@keywords[key].split('|').map{|keyword| real_keyword(key, keyword)}
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def keyword_table
|
|
149
|
+
require 'stringio'
|
|
150
|
+
require 'gherkin/formatter/pretty_formatter'
|
|
151
|
+
require 'gherkin/formatter/model'
|
|
152
|
+
io = StringIO.new
|
|
153
|
+
pf = Gherkin::Formatter::PrettyFormatter.new(io, false, false)
|
|
154
|
+
|
|
155
|
+
gherkin_keyword_table = KEYWORD_KEYS.map do |key|
|
|
156
|
+
Formatter::Model::Row.new([], [key, keywords(key).map{|keyword| %{"#{keyword}"}}.join(', ')], nil)
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
code_keyword_table = STEP_KEYWORD_KEYS.map do |key|
|
|
160
|
+
code_keywords = keywords(key).reject{|keyword| keyword == '* '}.map do |keyword|
|
|
161
|
+
%{"#{self.class.code_keyword_for(keyword)}"}
|
|
162
|
+
end.join(', ')
|
|
163
|
+
Formatter::Model::Row.new([], ["#{key} (code)", code_keywords], nil)
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
pf.table(gherkin_keyword_table + code_keyword_table)
|
|
167
|
+
io.string
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
private
|
|
171
|
+
|
|
172
|
+
def real_keyword(key, keyword)
|
|
173
|
+
if(STEP_KEYWORD_KEYS.index(key))
|
|
174
|
+
(keyword + ' ').sub(/< $/, '')
|
|
175
|
+
else
|
|
176
|
+
keyword
|
|
177
|
+
end
|
|
178
|
+
end
|
|
179
|
+
end
|
|
180
|
+
end
|