fuzzy_gherkin 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 7b493153f4f8988dc261ffdd67ee06b687ec74c5
4
+ data.tar.gz: f33185b1c79b31eafabd0c9e4bc568ed8bcee092
5
+ SHA512:
6
+ metadata.gz: a9ed55ce72124339a3145a870af5251dcb1161f74063c49c52a9a893ebe32f3f558b094455c01e542a9b7e61e4295ee0be89db8301ebc3c00d3851d0d73537f2
7
+ data.tar.gz: 5dc6a80d2f7662c4e9d54c6678307f754908284ce3d68737a4da58039562d98384f68bc54de22838f727ba323c22156b6936ee0d89ca7f0c2449d6db7293ab8b
data/.gitignore ADDED
@@ -0,0 +1,112 @@
1
+
2
+ # Created by https://www.gitignore.io/api/ruby,rubymine
3
+
4
+ ### Ruby ###
5
+ *.gem
6
+ *.rbc
7
+ /.config
8
+ /coverage/
9
+ /InstalledFiles
10
+ /pkg/
11
+ /spec/reports/
12
+ /spec/examples.txt
13
+ /test/tmp/
14
+ /test/version_tmp/
15
+ /tmp/
16
+
17
+ # Used by dotenv library to load environment variables.
18
+ # .env
19
+
20
+ ## Specific to RubyMotion:
21
+ .dat*
22
+ .repl_history
23
+ build/
24
+ *.bridgesupport
25
+ build-iPhoneOS/
26
+ build-iPhoneSimulator/
27
+
28
+ ## Specific to RubyMotion (use of CocoaPods):
29
+ #
30
+ # We recommend against adding the Pods directory to your .gitignore. However
31
+ # you should judge for yourself, the pros and cons are mentioned at:
32
+ # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
33
+ #
34
+ # vendor/Pods/
35
+
36
+ ## Documentation cache and generated files:
37
+ /.yardoc/
38
+ /_yardoc/
39
+ /doc/
40
+ /rdoc/
41
+
42
+ ## Environment normalization:
43
+ /.bundle/
44
+ /vendor/bundle
45
+ /lib/bundler/man/
46
+
47
+ # for a library or gem, you might want to ignore these files since the code is
48
+ # intended to run in multiple environments; otherwise, check them in:
49
+ # Gemfile.lock
50
+ # .ruby-version
51
+ # .ruby-gemset
52
+
53
+ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
54
+ .rvmrc
55
+
56
+
57
+ ### RubyMine ###
58
+ # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm
59
+ # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
60
+
61
+ # User-specific stuff:
62
+ .idea/workspace.xml
63
+ .idea/tasks.xml
64
+ .idea/dictionaries
65
+ .idea/vcs.xml
66
+ .idea/jsLibraryMappings.xml
67
+
68
+ # Sensitive or high-churn files:
69
+ .idea/dataSources.ids
70
+ .idea/dataSources.xml
71
+ .idea/dataSources.local.xml
72
+ .idea/sqlDataSources.xml
73
+ .idea/dynamic.xml
74
+ .idea/uiDesigner.xml
75
+
76
+ # Gradle:
77
+ .idea/gradle.xml
78
+ .idea/libraries
79
+
80
+ # Mongo Explorer plugin:
81
+ .idea/mongoSettings.xml
82
+
83
+ ## File-based project format:
84
+ *.iws
85
+
86
+ ## Plugin-specific files:
87
+
88
+ # IntelliJ
89
+ /out/
90
+
91
+ # mpeltonen/sbt-idea plugin
92
+ .idea_modules/
93
+
94
+ # JIRA plugin
95
+ atlassian-ide-plugin.xml
96
+
97
+ # Crashlytics plugin (for Android Studio and IntelliJ)
98
+ com_crashlytics_export_strings.xml
99
+ crashlytics.properties
100
+ crashlytics-build.properties
101
+ fabric.properties
102
+
103
+ ### RubyMine Patch ###
104
+ # Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721
105
+
106
+ # *.iml
107
+ # modules.xml
108
+ # .idea/misc.xml
109
+ # *.ipr
110
+
111
+ results.json
112
+ config.yml
data/.rubocop_todo.yml ADDED
@@ -0,0 +1,16 @@
1
+ # This configuration was generated by
2
+ # `rubocop --auto-gen-config`
3
+ # on 2016-08-11 10:13:54 -0400 using RuboCop version 0.42.0.
4
+ # The point is for the user to remove these configuration records
5
+ # one by one as the offenses are removed from the code base.
6
+ # Note that changes in the inspected code, or installation of new
7
+ # versions of RuboCop, may require this file to be generated again.
8
+ AllCops:
9
+ Exclude:
10
+ - 'fuzzy_gherkin.gemspec'
11
+ - 'lib/fuzzy_gherkin/version.rb'
12
+ # Offense count: 7
13
+ # Configuration parameters: AllowHeredoc, AllowURI, URISchemes.
14
+ # URISchemes: http, https
15
+ Metrics/LineLength:
16
+ Max: 150
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.1.2
4
+ before_install: gem install bundler -v 1.10.6
@@ -0,0 +1,13 @@
1
+ # Contributor Code of Conduct
2
+
3
+ As contributors and maintainers of this project, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities.
4
+
5
+ We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, or religion.
6
+
7
+ Examples of unacceptable behavior by participants include the use of sexual language or imagery, derogatory comments or personal attacks, trolling, public or private harassment, insults, or other unprofessional conduct.
8
+
9
+ Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct. Project maintainers who do not follow the Code of Conduct may be removed from the project team.
10
+
11
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by opening an issue or contacting one or more of the project maintainers.
12
+
13
+ This Code of Conduct is adapted from the [Contributor Covenant](http://contributor-covenant.org), version 1.0.0, available at [http://contributor-covenant.org/version/1/0/0/](http://contributor-covenant.org/version/1/0/0/)
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in fuzzy_gherkin.gemspec
4
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,40 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ fuzzy_gherkin (0.1.0)
5
+ fuzzy-string-match (~> 0.9.7)
6
+ gherkin (~> 4.0)
7
+ json (~> 2.0, >= 2.0.2)
8
+ pry (~> 0.10.4)
9
+ thor (~> 0)
10
+
11
+ GEM
12
+ remote: https://rubygems.org/
13
+ specs:
14
+ RubyInline (3.12.4)
15
+ ZenTest (~> 4.3)
16
+ ZenTest (4.11.1)
17
+ coderay (1.1.1)
18
+ fuzzy-string-match (0.9.7)
19
+ RubyInline (>= 3.8.6)
20
+ gherkin (4.0.0)
21
+ json (2.0.2)
22
+ method_source (0.8.2)
23
+ pry (0.10.4)
24
+ coderay (~> 1.1.0)
25
+ method_source (~> 0.8.1)
26
+ slop (~> 3.4)
27
+ rake (10.5.0)
28
+ slop (3.6.0)
29
+ thor (0.19.1)
30
+
31
+ PLATFORMS
32
+ ruby
33
+
34
+ DEPENDENCIES
35
+ bundler (~> 1.12)
36
+ fuzzy_gherkin!
37
+ rake (~> 10.0)
38
+
39
+ BUNDLED WITH
40
+ 1.12.5
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2016 Nick Stalter
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,30 @@
1
+ # FuzzyGherkin
2
+
3
+ Fuzzy Matching Gherkin steps to show where potential similarities may exist and where code can be refactored or combined. *WIP*
4
+
5
+ ## Installation
6
+
7
+ ```ruby
8
+ gem install fuzzy_gherkin
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ The gem is a command line app that will search for your feature files in the directory you run the command in.
14
+ The output will be spit into a json file sorted by similarity %s.
15
+
16
+ The compare command is broken into two parts, the base step and the threshold. Threshold will default to 0.80.
17
+
18
+ ```ruby
19
+ fuzzy_gherkin compare "Step you want to compare against", 0.85
20
+ ```
21
+
22
+ ## Contributing
23
+
24
+ Bug reports and pull requests are welcome on GitLab at https://gitlab.com/u/distortia. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](contributor-covenant.org) code of conduct.
25
+
26
+
27
+ ## License
28
+
29
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
30
+
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require 'bundler/gem_tasks'
data/bin/fuzzy_gherkin ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "fuzzy_gherkin"
4
+
5
+ FuzzyGherkin::Main.start(ARGV)
@@ -0,0 +1,32 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'fuzzy_gherkin/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'fuzzy_gherkin'
8
+ spec.version = FuzzyGherkin::VERSION
9
+ spec.authors = ['Nick Stalter']
10
+ spec.email = ['nickstalter@gmail.com']
11
+
12
+ spec.summary = %q({Fuzzy Matching Gherkin steps})
13
+ spec.description = %q({Fuzzy Matching Gherkin steps to show where potential similarities may exist and where code can be refactored or combined.})
14
+ spec.homepage = 'https://gitlab.com/distortia/fuzzy_gherkin'
15
+ spec.license = 'MIT'
16
+
17
+ spec.files = `git ls-files`.split($/)
18
+ spec.bindir = 'bin'
19
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
20
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
21
+ spec.require_paths = ['lib']
22
+
23
+ spec.add_dependency 'fuzzy-string-match', '~> 0.9.7'
24
+ spec.add_dependency 'pry', '~> 0.10.4'
25
+ spec.add_dependency 'gherkin', '~> 4.0'
26
+ spec.add_dependency 'json', '~> 2.0', '>= 2.0.2'
27
+ spec.add_dependency 'thor', "~> 0"
28
+
29
+ spec.add_development_dependency 'bundler', '~> 1.12'
30
+ spec.add_development_dependency 'rake', '~> 10.0'
31
+
32
+ end
@@ -0,0 +1,26 @@
1
+ require 'fuzzy_gherkin/version'
2
+ require 'fuzzystringmatch'
3
+ require 'gherkin/parser'
4
+ require 'gherkin/pickles/compiler'
5
+ require 'fuzzy_gherkin/comparitor'
6
+ require 'fuzzy_gherkin/io'
7
+ require 'json'
8
+ require 'pry'
9
+ require 'thor'
10
+
11
+ module FuzzyGherkin
12
+ # Main Class to keep everything in for the time being
13
+ class Main < Thor
14
+
15
+ include FuzzyStringMatch
16
+ include Gherkin
17
+
18
+ desc "compare 'step', (0.00 to 1.00)[optional]", "Compares the step given to the other steps in all feature files"
19
+ def compare(base_step = 'I press the latte button', threshold = 0.80)
20
+ comparitor = Comparitor.new(base_step, threshold)
21
+ comparitor.compare_all_steps_in_files
22
+ io = IO.new(comparitor.base_step, comparitor.similar_steps)
23
+ io.write_results
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,60 @@
1
+ module FuzzyGherkin
2
+ class Comparitor
3
+
4
+ attr_accessor :threshold, :fsm, :similar_steps, :base_step, :all_steps
5
+
6
+ def initialize(base_step, threshold)
7
+ @threshold = threshold.to_f
8
+ @similar_steps = []
9
+ @base_step = base_step
10
+ @all_steps = []
11
+ @fsm = FuzzyStringMatch::JaroWinkler.create(:pure)
12
+ end
13
+
14
+ def all_feature_files
15
+ Dir['**/*.feature']
16
+ end
17
+
18
+ def all_steps_in_files
19
+ all_steps = []
20
+ all_feature_files.each do |file|
21
+ scenarios = parse_feature_file(file)
22
+ scenarios.each do |scenario|
23
+ all_steps << scenario[:steps].map! { |step| step[:text] }
24
+ end
25
+ end
26
+ all_steps.flatten.uniq
27
+ end
28
+
29
+ def compare_all_steps_in_files
30
+ start_time = Time.now
31
+ all_steps_in_files.each do |step|
32
+ compare_step_to_base_step(step)
33
+ end
34
+ end_time = Time.now
35
+ puts "Comparison ended after #{end_time - start_time} seconds!"
36
+ end
37
+
38
+ # Returns background and sceanrios in feature file
39
+ def parse_feature_file(feature_file)
40
+ parser = Gherkin::Parser.new
41
+ raise "FAILURE: File not found at #{feature_path}" unless File.file?(feature_file)
42
+ gherkin_document = parser.parse(File.read(feature_file))
43
+ gherkin_document[:feature][:children]
44
+ end
45
+
46
+ # Compares the given step to the base step
47
+ def compare_step_to_base_step(comparing_step)
48
+ puts "Comparing base step to: '#{comparing_step}'"
49
+ distance = @fsm.getDistance(@base_step, comparing_step)
50
+ puts "distance: #{distance}"
51
+ # 1.0 is a perfect match.
52
+ # This means its a repeated step and we can ignore.
53
+ if distance >= @threshold && distance != 1.0
54
+ @similar_steps << "#{(distance * 100).round(2)}% - " + comparing_step
55
+ else
56
+ distance
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,15 @@
1
+ Feature: Serve coffee
2
+
3
+ Background:
4
+ Given I want some coffee
5
+ And the office has some in stock
6
+
7
+ Scenario: Making espresso
8
+ When I press the espresso button
9
+ And I press the brew coffee button
10
+ Then espresso should be brewing
11
+
12
+ Scenario: Making Coffee
13
+ When I press the coffee button
14
+ And I press the brew button
15
+ Then coffee should be brewing
@@ -0,0 +1,13 @@
1
+ Feature: Stock coffee
2
+
3
+ Background:
4
+ Given we are out of coffee
5
+ And the staff is getting upset
6
+
7
+ Scenario: Restock the coffee supply
8
+ And I restock the coffee
9
+ Then the staff is happy
10
+
11
+ Scenario: Catastrophic Failure
12
+ And we are out of coffee
13
+ Then there is a revolt
@@ -0,0 +1,31 @@
1
+ module FuzzyGherkin
2
+ class IO
3
+ # {
4
+ # "base-step" : [
5
+ # "first.feature" : [
6
+ # "matching % - step that matches base"
7
+ # ],
8
+ # "second.feature" : [
9
+ # "matching % - step that matches base"
10
+ # ]
11
+ # ]
12
+ # }
13
+
14
+ def initialize(base_step, similar_steps)
15
+ @base_step = base_step
16
+ @similar_steps = similar_steps
17
+ end
18
+
19
+ def format_similar_steps_hash
20
+ { @base_step => @similar_steps.uniq.sort.reverse }
21
+ end
22
+
23
+ def write_results
24
+ file_name = 'results.json'
25
+ f = File.new(file_name, 'w+')
26
+ f.write(JSON.pretty_generate(format_similar_steps_hash))
27
+ f.close
28
+ puts "Writing results to file: #{file_name}"
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,3 @@
1
+ module FuzzyGherkin
2
+ VERSION = "0.1.0"
3
+ end
metadata ADDED
@@ -0,0 +1,167 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fuzzy_gherkin
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Nick Stalter
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-09-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: fuzzy-string-match
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.9.7
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.9.7
27
+ - !ruby/object:Gem::Dependency
28
+ name: pry
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.10.4
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.10.4
41
+ - !ruby/object:Gem::Dependency
42
+ name: gherkin
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '4.0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '4.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: json
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '2.0'
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: 2.0.2
65
+ type: :runtime
66
+ prerelease: false
67
+ version_requirements: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - "~>"
70
+ - !ruby/object:Gem::Version
71
+ version: '2.0'
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: 2.0.2
75
+ - !ruby/object:Gem::Dependency
76
+ name: thor
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ type: :runtime
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ - !ruby/object:Gem::Dependency
90
+ name: bundler
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '1.12'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '1.12'
103
+ - !ruby/object:Gem::Dependency
104
+ name: rake
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '10.0'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '10.0'
117
+ description: "{Fuzzy Matching Gherkin steps to show where potential similarities may
118
+ exist and where code can be refactored or combined.}"
119
+ email:
120
+ - nickstalter@gmail.com
121
+ executables:
122
+ - fuzzy_gherkin
123
+ extensions: []
124
+ extra_rdoc_files: []
125
+ files:
126
+ - ".gitignore"
127
+ - ".rubocop_todo.yml"
128
+ - ".travis.yml"
129
+ - CODE_OF_CONDUCT.md
130
+ - Gemfile
131
+ - Gemfile.lock
132
+ - LICENSE.txt
133
+ - README.md
134
+ - Rakefile
135
+ - bin/fuzzy_gherkin
136
+ - fuzzy_gherkin.gemspec
137
+ - lib/fuzzy_gherkin.rb
138
+ - lib/fuzzy_gherkin/comparitor.rb
139
+ - lib/fuzzy_gherkin/example.feature
140
+ - lib/fuzzy_gherkin/example2.feature
141
+ - lib/fuzzy_gherkin/io.rb
142
+ - lib/fuzzy_gherkin/version.rb
143
+ homepage: https://gitlab.com/distortia/fuzzy_gherkin
144
+ licenses:
145
+ - MIT
146
+ metadata: {}
147
+ post_install_message:
148
+ rdoc_options: []
149
+ require_paths:
150
+ - lib
151
+ required_ruby_version: !ruby/object:Gem::Requirement
152
+ requirements:
153
+ - - ">="
154
+ - !ruby/object:Gem::Version
155
+ version: '0'
156
+ required_rubygems_version: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - ">="
159
+ - !ruby/object:Gem::Version
160
+ version: '0'
161
+ requirements: []
162
+ rubyforge_project:
163
+ rubygems_version: 2.4.5.1
164
+ signing_key:
165
+ specification_version: 4
166
+ summary: "{Fuzzy Matching Gherkin steps}"
167
+ test_files: []