mirror of
https://gitlab.com/gitlab-org/gitlab-foss.git
synced 2025-08-03 16:04:30 +00:00
87 lines
2.0 KiB
Ruby
87 lines
2.0 KiB
Ruby
# 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,
|
|
:description,
|
|
: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
|