File: feature_flag.rb

package info (click to toggle)
gitlab 17.6.5-19
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 629,368 kB
  • sloc: ruby: 1,915,304; javascript: 557,307; sql: 60,639; xml: 6,509; sh: 4,567; makefile: 1,239; python: 406
file content (85 lines) | stat: -rw-r--r-- 2,028 bytes parent folder | download
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# frozen_string_literal: true

require 'yaml'
require_relative '../../lib/feature/shared'

module Tooling
  module Danger
    module FeatureFlag
      # `change_type` can be:
      #   - :added
      #   - :modified
      #   - :deleted
      def feature_flag_files(danger_helper:, change_type:)
        files = danger_helper.public_send("#{change_type}_files") # rubocop:disable GitlabSecurity/PublicSend -- we allow calling danger_helper.added_files & danger_helper.modified_files

        files.select { |path| %r{\A(ee/)?config/feature_flags/.*\.yml\z}.match?(path) }.map { |path| Found.build(path) }
      end

      Found = Struct.new(
        :path,
        :lines,
        :name,
        :feature_issue_url,
        :introduced_by_url,
        :rollout_issue_url,
        :milestone,
        :group,
        :type,
        :default_enabled,
        keyword_init: true
      ) do
        def self.build(path)
          raw = File.read(path)
          yaml = YAML.safe_load(raw)

          new(path: path, lines: raw.lines, **yaml)
        rescue Psych::Exception, StandardError
          new(path: path)
        end

        def valid?
          !missing_field?(:name)
        end

        def missing_group?
          missing_field?(:group)
        end

        def missing_feature_issue_url?
          missing_field?(:feature_issue_url)
        end

        def missing_introduced_by_url?
          missing_field?(:introduced_by_url)
        end

        def missing_rollout_issue_url?
          missing_field?(:rollout_issue_url)
        end

        def missing_milestone?
          missing_field?(:milestone)
        end

        def default_enabled?
          !!default_enabled
        end

        def group_match_mr_label?(mr_group_label)
          mr_group_label == group
        end

        def find_line_index(text)
          lines.find_index("#{text}\n")
        end

        private

        def missing_field?(field)
          self[field].nil? || self[field].empty?
        end
      end
    end
  end
end