diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-01-26 06:07:24 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-01-26 06:07:24 +0300 |
commit | 694926dda342630084c55ad7eba1655fa266b161 (patch) | |
tree | a6d446bce6da7710c6a9432c4167143677f5b726 /tooling | |
parent | e5fec17b5823511bda9bb1ac0dc64ab9c84a2a2f (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'tooling')
-rw-r--r-- | tooling/danger/config_files.rb | 23 | ||||
-rw-r--r-- | tooling/danger/feature_flag.rb | 20 | ||||
-rw-r--r-- | tooling/danger/specs.rb | 84 | ||||
-rw-r--r-- | tooling/danger/suggestor.rb | 63 |
4 files changed, 100 insertions, 90 deletions
diff --git a/tooling/danger/config_files.rb b/tooling/danger/config_files.rb index 914605a3783..1b09da6c8c9 100644 --- a/tooling/danger/config_files.rb +++ b/tooling/danger/config_files.rb @@ -1,15 +1,14 @@ # frozen_string_literal: true require 'yaml' +require_relative 'suggestor' module Tooling module Danger module ConfigFiles - SUGGEST_INTRODUCED_BY_COMMENT = <<~SUGGEST_COMMENT - ```suggestion - introduced_by_url: %<url> - ``` - SUGGEST_COMMENT + include ::Tooling::Danger::Suggestor + + MISSING_INTRODUCED_BY_REGEX = /^\+?(?<attr_name>\s*introduced_by_url):\s*$/ CONFIG_DIRS = %w[ config/feature_flags @@ -18,14 +17,12 @@ module Tooling ].freeze def add_suggestion_for_missing_introduced_by_url - new_config_files.each do |file_name| - config_file_lines = project_helper.file_lines(file_name) - - config_file_lines.each_with_index do |added_line, i| - next unless added_line =~ /^introduced_by_url:\s?$/ - - markdown(format(SUGGEST_INTRODUCED_BY_COMMENT, url: helper.mr_web_url), file: file_name, line: i + 1) - end + new_config_files.each do |filename| + add_suggestion( + filename: filename, + regex: MISSING_INTRODUCED_BY_REGEX, + replacement: "\\k<attr_name>: #{helper.mr_web_url}" + ) end end diff --git a/tooling/danger/feature_flag.rb b/tooling/danger/feature_flag.rb index cef64e52af3..da0b7053af1 100644 --- a/tooling/danger/feature_flag.rb +++ b/tooling/danger/feature_flag.rb @@ -16,26 +16,22 @@ module Tooling end class Found + ATTRIBUTES = %w[name introduced_by_url rollout_issue_url milestone type group default_enabled].freeze + attr_reader :path def initialize(path) @path = path end - def raw - @raw ||= File.read(path) - end - - def group - @group ||= yaml['group'] + ATTRIBUTES.each do |attribute| + define_method(attribute) do + yaml[attribute] + end end - def default_enabled - @default_enabled ||= yaml['default_enabled'] - end - - def rollout_issue_url - @rollout_issue_url ||= yaml['rollout_issue_url'] + def raw + @raw ||= File.read(path) end def group_match_mr_label?(mr_group_label) diff --git a/tooling/danger/specs.rb b/tooling/danger/specs.rb index 04f3c9d4c9a..f95a798d53e 100644 --- a/tooling/danger/specs.rb +++ b/tooling/danger/specs.rb @@ -1,12 +1,14 @@ # frozen_string_literal: true +require_relative 'suggestor' + module Tooling module Danger module Specs + include ::Tooling::Danger::Suggestor + SPEC_FILES_REGEX = 'spec/' EE_PREFIX = 'ee/' - MATCH_WITH_ARRAY_REGEX = /(?<to>to\(?\s*)(?<matcher>match|eq)(?<expectation>[( ]?\[(?=.*,)[^\]]+)/.freeze - MATCH_WITH_ARRAY_REPLACEMENT = '\k<to>match_array\k<expectation>' PROJECT_FACTORIES = %w[ :project @@ -29,22 +31,18 @@ module Tooling /x.freeze PROJECT_FACTORY_REPLACEMENT = '\k<head>let_it_be\k<tail>' - SUGGESTION_MARKDOWN = <<~SUGGESTION_MARKDOWN - ```suggestion - %<suggested_line>s - ``` - SUGGESTION_MARKDOWN - - MATCH_WITH_ARRAY_SUGGESTION = <<~SUGGEST_COMMENT - If order of the result is not important, please consider using `match_array` to avoid flakiness. - SUGGEST_COMMENT - PROJECT_FACTORY_SUGGESTION = <<~SUGGEST_COMMENT Project creations are very slow. Use `let_it_be`, `build` or `build_stubbed` if possible. See [testing best practices](https://docs.gitlab.com/ee/development/testing_guide/best_practices.html#optimize-factory-usage) for background information and alternative options. SUGGEST_COMMENT + MATCH_WITH_ARRAY_REGEX = /(?<to>to\(?\s*)(?<matcher>match|eq)(?<expectation>[( ]?\[(?=.*,)[^\]]+)/.freeze + MATCH_WITH_ARRAY_REPLACEMENT = '\k<to>match_array\k<expectation>' + MATCH_WITH_ARRAY_SUGGESTION = <<~SUGGEST_COMMENT + If order of the result is not important, please consider using `match_array` to avoid flakiness. + SUGGEST_COMMENT + RSPEC_TOP_LEVEL_DESCRIBE_REGEX = /^\+.?RSpec\.describe(.+)/.freeze FEATURE_CATEGORY_SUGGESTION = <<~SUGGESTION_MARKDOWN Consider adding `feature_category: <feature_category_name>` for this example if it is not set already. @@ -69,19 +67,19 @@ module Tooling def add_suggestions_for_match_with_array(filename) add_suggestion( - filename, - MATCH_WITH_ARRAY_REGEX, - MATCH_WITH_ARRAY_SUGGESTION, - MATCH_WITH_ARRAY_REPLACEMENT + filename: filename, + regex: MATCH_WITH_ARRAY_REGEX, + replacement: MATCH_WITH_ARRAY_REPLACEMENT, + comment_text: MATCH_WITH_ARRAY_SUGGESTION ) end def add_suggestions_for_project_factory_usage(filename) add_suggestion( - filename, - PROJECT_FACTORY_REGEX, - PROJECT_FACTORY_SUGGESTION, - PROJECT_FACTORY_REPLACEMENT + filename: filename, + regex: PROJECT_FACTORY_REGEX, + replacement: PROJECT_FACTORY_REPLACEMENT, + comment_text: PROJECT_FACTORY_SUGGESTION ) end @@ -103,53 +101,9 @@ module Tooling suggested_line = file_lines[line_number] - text = format(comment(FEATURE_CATEGORY_SUGGESTION), suggested_line: suggested_line) - markdown(text, file: filename, line: line_number + 1) + markdown(comment(FEATURE_CATEGORY_SUGGESTION, suggested_line), file: filename, line: line_number.succ) end end - - private - - def added_lines_matching(filename, regex) - helper.changed_lines(filename).grep(/\A\+( )?/).grep(regex) - end - - def add_suggestion(filename, regex, comment_text, replacement = nil, exclude = nil) - added_lines = added_lines_matching(filename, regex) - - 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) - next unless line_number - next if !exclude.nil? && added_line.include?(exclude) - - processed_line_numbers << line_number - - suggested_line = spec_file_lines[line_number] - suggested_line = suggested_line.gsub(regex, replacement) unless replacement.nil? - - text = format(comment(comment_text), suggested_line: suggested_line) - markdown(text, file: filename, line: line_number.succ) - end - end - - def comment(comment_text) - <<~COMMENT_BODY.chomp - #{SUGGESTION_MARKDOWN} - #{comment_text} - COMMENT_BODY - end - - def find_line_number(file_lines, searched_line, exclude_indexes: []) - _, index = file_lines.each_with_index.find do |file_line, index| - file_line == searched_line && !exclude_indexes.include?(index) - end - - index - end end end end diff --git a/tooling/danger/suggestor.rb b/tooling/danger/suggestor.rb new file mode 100644 index 00000000000..ffda98e67d0 --- /dev/null +++ b/tooling/danger/suggestor.rb @@ -0,0 +1,63 @@ +# frozen_string_literal: true +module Tooling + module Danger + module Suggestor + # For file lines matching `regex` adds suggestion `replacement` with `comment_text` added. + def add_suggestion(filename:, regex:, replacement: nil, comment_text: nil, exclude: nil) + added_lines = added_lines_matching(filename, regex) + + return if added_lines.empty? + + file_lines = project_helper.file_lines(filename) + + added_lines.each_with_object([]) do |added_line, processed_line_numbers| + line_number = find_line_number(file_lines, added_line.delete_prefix('+'), +exclude_indexes: processed_line_numbers) + + next unless line_number + next if !exclude.nil? && added_line.include?(exclude) + + processed_line_numbers << line_number + + if replacement + suggestion_text = file_lines[line_number] + suggestion_text = suggestion_text.gsub(regex, replacement) + end + + markdown(comment(comment_text, suggestion_text), file: filename, line: line_number.succ) + end + end + + private + + def added_lines_matching(filename, regex) + helper.changed_lines(filename).grep(/\A\+( )?/).grep(regex) + end + + def find_line_number(file_lines, searched_line, exclude_indexes: []) + _, index = file_lines.each_with_index.find do |file_line, index| + file_line == searched_line && !exclude_indexes.include?(index) # rubocop:disable Rails/NegateInclude + end + + index + end + + def comment(comment_text = nil, suggested_line = nil) + if suggested_line + suggestion_text = <<~SUGGESTION + ```suggestion + %<suggested_line>s + ``` + SUGGESTION + end + + comment_body = <<~COMMENT_BODY.chomp + #{suggestion_text} + #{comment_text} + COMMENT_BODY + + format(comment_body.chomp, suggested_line: suggested_line) + end + end + end +end |