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
|