Welcome to mirror list, hosted at ThFree Co, Russian Federation.

datateam.rb « danger « tooling - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 1354e684d508193d1e425aaf35ec0fa151a1baf5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# frozen_string_literal: true

module Tooling
  module Danger
    module Datateam
      CHANGED_SCHEMA_MESSAGE = <<~MSG
        Notification to the Data Team about changes to files with possible impact on Data Warehouse, add label `Data Warehouse::Impact Check`.

        /label ~"Data Warehouse::Impact Check"

        The following files require a review:

      MSG

      DATA_WAREHOUSE_SCOPE = 'Data Warehouse::'
      FILE_PATH_REGEX = %r{((ee|jh)/)?config/metrics(/.+\.yml)}
      PERFORMANCE_INDICATOR_REGEX = %r{gmau|smau|paid_gmau|umau}
      METRIC_REMOVED = %r{\+status: removed}
      DATABASE_REGEX = %r{\Adb/structure\.sql}
      STRUCTURE_SQL_FILE = %w[db/structure.sql].freeze

      def build_message
        return unless impacted?

        CHANGED_SCHEMA_MESSAGE + helper.markdown_list(data_warehouse_impact_files)
      end

      def impacted?
        !labelled_as_datawarehouse? && data_warehouse_impact_files.any?
      end

      private

      def data_warehouse_impact_files
        @impacted_files ||= (metrics_changed_files + database_changed_files)
      end

      def labelled_as_datawarehouse?
        helper.mr_labels.any? { |label| label.start_with?(DATA_WAREHOUSE_SCOPE) }
      end

      def metrics_changed_files
        metrics_definitions_files = helper.modified_files.grep(FILE_PATH_REGEX)

        metrics_definitions_files.select do |file|
          helper.changed_lines(file).any? { |change| performance_indicator_changed?(change) || status_removed?(change) }
        end.compact
      end

      def database_changes?
        !helper.modified_files.grep(DATABASE_REGEX).empty?
      end

      def database_changed_files
        helper.modified_files & STRUCTURE_SQL_FILE
      end

      def performance_indicator_changed?(change)
        change =~ PERFORMANCE_INDICATOR_REGEX
      end

      def status_removed?(change)
        change =~ METRIC_REMOVED
      end
    end
  end
end