Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'tooling/danger/specs.rb')
-rw-r--r--tooling/danger/specs.rb59
1 files changed, 59 insertions, 0 deletions
diff --git a/tooling/danger/specs.rb b/tooling/danger/specs.rb
new file mode 100644
index 00000000000..466230bb86b
--- /dev/null
+++ b/tooling/danger/specs.rb
@@ -0,0 +1,59 @@
+# frozen_string_literal: true
+
+module Tooling
+ module Danger
+ module Specs
+ SPEC_FILES_REGEX = 'spec/'
+ EE_PREFIX = 'ee/'
+ MATCH_WITH_ARRAY_REGEX = /(?<to>to\(?\s*)(?<matcher>match|eq)(?<expectation>[( ]?\[)/.freeze
+ SUGGEST_MR_COMMENT = <<~SUGGEST_COMMENT
+ ```suggestion
+ %<suggested_line>s
+ ```
+
+ If order of the result is not important, please consider using `match_array` to avoid flakiness.
+ SUGGEST_COMMENT
+
+ def changed_specs_files(ee: :include)
+ changed_files = helper.all_changed_files
+ folder_prefix =
+ case ee
+ when :include
+ "(#{EE_PREFIX})?"
+ when :only
+ EE_PREFIX
+ when :exclude
+ nil
+ end
+
+ changed_files.grep(%r{\A#{folder_prefix}#{SPEC_FILES_REGEX}})
+ end
+
+ def add_suggestions_for_match_with_array(filename)
+ added_lines = added_line_matching_match_with_array(filename)
+ return if added_lines.empty?
+
+ spec_file_lines = project_helper.file_lines(filename)
+
+ added_lines.each_with_object([]) do |added_line, processed_line_numbers|
+ line_number = find_line_number(spec_file_lines, added_line.delete_prefix('+'), exclude_indexes: processed_line_numbers)
+ processed_line_numbers << line_number
+ markdown(format(SUGGEST_MR_COMMENT, suggested_line: spec_file_lines[line_number].gsub(MATCH_WITH_ARRAY_REGEX, '\k<to>match_array\k<expectation>')), file: filename, line: line_number.succ)
+ end
+ end
+
+ def added_line_matching_match_with_array(filename)
+ helper.changed_lines(filename).grep(/\A\+ /).grep(MATCH_WITH_ARRAY_REGEX)
+ end
+
+ private
+
+ def find_line_number(file_lines, searched_line, exclude_indexes: [])
+ file_lines.each_with_index do |file_line, index|
+ next if exclude_indexes.include?(index)
+ break index if file_line == searched_line
+ end
+ end
+ end
+ end
+end