summaryrefslogtreecommitdiff
path: root/tooling/danger/product_intelligence.rb
diff options
context:
space:
mode:
Diffstat (limited to 'tooling/danger/product_intelligence.rb')
-rw-r--r--tooling/danger/product_intelligence.rb102
1 files changed, 102 insertions, 0 deletions
diff --git a/tooling/danger/product_intelligence.rb b/tooling/danger/product_intelligence.rb
new file mode 100644
index 00000000000..0f77f6c6a71
--- /dev/null
+++ b/tooling/danger/product_intelligence.rb
@@ -0,0 +1,102 @@
+# frozen_string_literal: true
+# rubocop:disable Style/SignalException
+
+module Tooling
+ module Danger
+ module ProductIntelligence
+ WORKFLOW_LABELS = [
+ 'product intelligence::approved',
+ 'product intelligence::review pending'
+ ].freeze
+
+ TRACKING_FILES = [
+ 'lib/gitlab/tracking.rb',
+ 'spec/lib/gitlab/tracking_spec.rb',
+ 'app/helpers/tracking_helper.rb',
+ 'spec/helpers/tracking_helper_spec.rb',
+ 'app/assets/javascripts/tracking.js',
+ 'spec/frontend/tracking_spec.js',
+ 'generator_templates/usage_metric_definition/metric_definition.yml',
+ 'lib/generators/gitlab/usage_metric/usage_metric_generator.rb',
+ 'lib/generators/gitlab/usage_metric_definition_generator.rb',
+ 'lib/generators/gitlab/usage_metric_definition/redis_hll_generator.rb',
+ 'spec/lib/generators/gitlab/usage_metric_generator_spec.rb',
+ 'spec/lib/generators/gitlab/usage_metric_definition_generator_spec.rb',
+ 'spec/lib/generators/gitlab/usage_metric_definition/redis_hll_generator_spec.rb',
+ 'config/metrics/schema.json'
+ ].freeze
+
+ def missing_labels
+ return [] unless helper.ci?
+
+ labels = []
+ labels << 'product intelligence' unless helper.mr_has_labels?('product intelligence')
+ labels << 'product intelligence::review pending' unless helper.mr_has_labels?(WORKFLOW_LABELS)
+
+ labels
+ end
+
+ def matching_changed_files
+ tracking_changed_files = all_changed_files & TRACKING_FILES
+ usage_data_changed_files = all_changed_files.grep(%r{(usage_data)})
+
+ usage_data_changed_files + tracking_changed_files + metrics_changed_files + dictionary_changed_file + snowplow_changed_files
+ end
+
+ def need_dictionary_changes?
+ required_dictionary_update_changed_files.any? && dictionary_changed_file.empty?
+ end
+
+ private
+
+ def all_changed_files
+ helper.all_changed_files
+ end
+
+ def dictionary_changed_file
+ all_changed_files.grep(%r{(doc/development/usage_ping/dictionary\.md)})
+ end
+
+ def metrics_changed_files
+ all_changed_files.grep(%r{((ee/)?config/metrics/.*\.yml)})
+ end
+
+ def matching_files?(file, extension:, pattern:)
+ return unless file.end_with?(extension)
+
+ helper.changed_lines(file).grep(pattern).any?
+ end
+
+ def snowplow_changed_files
+ js_patterns = Regexp.union(
+ 'Tracking.event',
+ /\btrack\(/,
+ 'data-track-event',
+ 'data-track-action'
+ )
+ all_changed_files.select do |file|
+ matching_files?(file, extension: '.rb', pattern: %r{Gitlab::Tracking\.(event|enabled\?|snowplow_options)$}) ||
+ matching_files?(file, extension: '.js', pattern: js_patterns) ||
+ matching_files?(file, extension: '.vue', pattern: js_patterns) ||
+ matching_files?(file, extension: '.haml', pattern: %r{data: \{ track})
+ end
+ end
+
+ def required_dictionary_update_changed_files
+ dictionary_pattern = Regexp.union(
+ 'key_path:',
+ 'description:',
+ 'product_section:',
+ 'product_stage:',
+ 'product_group:',
+ 'status:',
+ 'tier:'
+ )
+
+ metrics_changed_files.select do |file|
+ matching_files?(file, extension: '.yml', pattern: dictionary_pattern)
+ end
+ end
+ end
+ end
+end