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')
-rw-r--r--tooling/danger/product_intelligence.rb3
-rw-r--r--tooling/danger/project_helper.rb9
-rw-r--r--tooling/danger/specs.rb59
3 files changed, 69 insertions, 2 deletions
diff --git a/tooling/danger/product_intelligence.rb b/tooling/danger/product_intelligence.rb
index 30c961184f5..848f99eeff5 100644
--- a/tooling/danger/product_intelligence.rb
+++ b/tooling/danger/product_intelligence.rb
@@ -30,7 +30,7 @@ module Tooling
].freeze
def missing_labels
- return [] unless helper.ci?
+ return [] if !helper.ci? || helper.mr_has_labels?('growth experiment')
labels = []
labels << 'product intelligence' unless helper.mr_has_labels?('product intelligence')
@@ -66,7 +66,6 @@ module Tooling
js_patterns = Regexp.union(
'Tracking.event',
/\btrack\(/,
- 'data-track-event',
'data-track-action'
)
all_changed_files.select do |file|
diff --git a/tooling/danger/project_helper.rb b/tooling/danger/project_helper.rb
index 109f77ed4d1..c552a75bba8 100644
--- a/tooling/danger/project_helper.rb
+++ b/tooling/danger/project_helper.rb
@@ -113,6 +113,7 @@ module Tooling
generator_templates/usage_metric_definition/metric_definition\.yml)\z}x => [:backend, :product_intelligence],
%r{\A((ee|jh)/)?app/(?!assets|views)[^/]+} => :backend,
%r{\A((ee|jh)/)?(bin|config|generator_templates|lib|rubocop)/} => :backend,
+ %r{\A((ee|jh)/)?spec/migrations} => :database,
%r{\A((ee|jh)/)?spec/} => :backend,
%r{\A((ee|jh)/)?vendor/} => :backend,
%r{\A(Gemfile|Gemfile.lock|Rakefile)\z} => :backend,
@@ -174,8 +175,16 @@ module Tooling
ee? ? 'gitlab' : 'gitlab-foss'
end
+ def file_lines(filename)
+ read_file(filename).lines(chomp: true)
+ end
+
private
+ def read_file(filename)
+ File.read(filename)
+ end
+
def ee?
# Support former project name for `dev` and support local Danger run
%w[gitlab gitlab-ee].include?(ENV['CI_PROJECT_NAME']) || Dir.exist?(File.expand_path('../../../ee', __dir__))
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