summaryrefslogtreecommitdiff
path: root/tooling/danger/specs/project_factory_suggestion.rb
diff options
context:
space:
mode:
Diffstat (limited to 'tooling/danger/specs/project_factory_suggestion.rb')
-rw-r--r--tooling/danger/specs/project_factory_suggestion.rb38
1 files changed, 38 insertions, 0 deletions
diff --git a/tooling/danger/specs/project_factory_suggestion.rb b/tooling/danger/specs/project_factory_suggestion.rb
new file mode 100644
index 00000000000..4e5a70ac8e5
--- /dev/null
+++ b/tooling/danger/specs/project_factory_suggestion.rb
@@ -0,0 +1,38 @@
+# frozen_string_literal: true
+
+require_relative '../suggestion'
+
+module Tooling
+ module Danger
+ module Specs
+ class ProjectFactorySuggestion < Suggestion
+ PROJECT_FACTORIES = %w[
+ :project
+ :project_empty_repo
+ :forked_project_with_submodules
+ :project_with_design
+ ].freeze
+
+ MATCH = /
+ ^\+? # Start of the line, which may or may not have a `+`
+ (?<head>\s*) # 0-many leading whitespace captured in a group named head
+ let!? # Literal `let` which may or may not end in `!`
+ (?<tail> # capture group named tail
+ \([^)]+\) # Two parenthesis with any non-parenthesis characters between them
+ \s*\{\s* # Opening curly brace surrounded by 0-many whitespace characters
+ create\( # literal
+ (?:#{PROJECT_FACTORIES.join('|')}) # Any of the project factory names
+ \W # Non-word character, avoid matching factories like :project_badge
+ ) # end capture group named tail
+ /x
+
+ REPLACEMENT = '\k<head>let_it_be\k<tail>'
+ 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
+ end
+ end
+ end
+end