debian-mirror-gitlab/lib/generators/gitlab/usage_metric_definition_generator.rb
2021-04-17 20:07:23 +05:30

112 lines
2.9 KiB
Ruby

# frozen_string_literal: true
require 'rails/generators'
module Gitlab
class UsageMetricDefinitionGenerator < Rails::Generators::Base
Directory = Struct.new(:name, :time_frame, :value_type) do
def match?(str)
(name == str || time_frame == str) && str != 'none'
end
end
TIME_FRAME_DIRS = [
Directory.new('counts_7d', '7d', 'number'),
Directory.new('counts_28d', '28d', 'number'),
Directory.new('counts_all', 'all', 'number'),
Directory.new('settings', 'none', 'boolean'),
Directory.new('license', 'none', 'string')
].freeze
TOP_LEVEL_DIR = 'config'
TOP_LEVEL_DIR_EE = 'ee'
VALID_INPUT_DIRS = (TIME_FRAME_DIRS.flat_map { |d| [d.name, d.time_frame] } - %w(none)).freeze
source_root File.expand_path('../../../generator_templates/usage_metric_definition', __dir__)
desc 'Generates a metric definition yml file'
class_option :ee, type: :boolean, optional: true, default: false, desc: 'Indicates if metric is for ee'
class_option :dir,
type: :string, desc: "Indicates the metric location. It must be one of: #{VALID_INPUT_DIRS.join(', ')}"
argument :key_path, type: :string, desc: 'Unique JSON key path for the metric'
def create_metric_file
validate!
template "metric_definition.yml", file_path
end
def time_frame
directory&.time_frame
end
def value_type
directory&.value_type
end
def distribution
value = ['- ce']
value << '- ee' if ee?
value.join("\n")
end
def milestone
Gitlab::VERSION.match('(\d+\.\d+)').captures.first
end
private
def metric_name_suggestion
return unless Feature.enabled?(:product_intelligence_metrics_names_suggestions, default_enabled: :yaml)
"\nname: #{Usage::Metrics::NamesSuggestions::Generator.generate(key_path)}"
end
def file_path
path = File.join(TOP_LEVEL_DIR, 'metrics', directory&.name, "#{file_name}.yml")
path = File.join(TOP_LEVEL_DIR_EE, path) if ee?
path
end
def validate!
raise "--dir option is required" unless input_dir.present?
raise "Invalid dir #{input_dir}, allowed options are #{VALID_INPUT_DIRS.join(', ')}" unless directory.present?
raise "Metric definition with key path '#{key_path}' already exists" if metric_definition_exists?
end
def ee?
options[:ee]
end
def input_dir
options[:dir]
end
# Example of file name
#
# 20210201124931_g_project_management_issue_title_changed_weekly.yml
def file_name
"#{Time.now.utc.strftime("%Y%m%d%H%M%S")}_#{metric_name}"
end
def directory
@directory ||= TIME_FRAME_DIRS.find { |d| d.match?(input_dir) }
end
def metric_name
key_path.split('.').last
end
def metric_definitions
@definitions ||= Gitlab::Usage::MetricDefinition.definitions
end
def metric_definition_exists?
metric_definitions[key_path].present?
end
end
end