102 lines
3.4 KiB
Ruby
102 lines
3.4 KiB
Ruby
# 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
|