57 lines
1.6 KiB
Ruby
57 lines
1.6 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
module Gitlab
|
||
|
module Metrics
|
||
|
module Dashboard
|
||
|
module Validator
|
||
|
class Client
|
||
|
# @param content [Hash] Representing a raw, unprocessed
|
||
|
# dashboard object
|
||
|
# @param schema_path [String] Representing path to dashboard schema file
|
||
|
# @param dashboard_path[String] Representing path to dashboard content file
|
||
|
# @param project [Project] Project to validate dashboard against
|
||
|
def initialize(content, schema_path, dashboard_path: nil, project: nil)
|
||
|
@content = content
|
||
|
@schema_path = schema_path
|
||
|
@dashboard_path = dashboard_path
|
||
|
@project = project
|
||
|
end
|
||
|
|
||
|
def execute
|
||
|
errors = validate_against_schema
|
||
|
errors += post_schema_validator.validate
|
||
|
|
||
|
errors.compact
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
attr_reader :content, :schema_path, :project, :dashboard_path
|
||
|
|
||
|
def custom_formats
|
||
|
@custom_formats ||= CustomFormats.new
|
||
|
end
|
||
|
|
||
|
def post_schema_validator
|
||
|
PostSchemaValidator.new(
|
||
|
project: project,
|
||
|
metric_ids: custom_formats.metric_ids_cache,
|
||
|
dashboard_path: dashboard_path
|
||
|
)
|
||
|
end
|
||
|
|
||
|
def schemer
|
||
|
@schemer ||= ::JSONSchemer.schema(Pathname.new(schema_path), formats: custom_formats.format_handlers)
|
||
|
end
|
||
|
|
||
|
def validate_against_schema
|
||
|
schemer.validate(content).map do |error|
|
||
|
Errors::SchemaValidationError.new(error)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|