56 lines
1.3 KiB
Ruby
56 lines
1.3 KiB
Ruby
|
|
# frozen_string_literal: true
|
||
|
|
|
||
|
|
require 'json'
|
||
|
|
|
||
|
|
module PluginConfig
|
||
|
|
class SchemaError < StandardError
|
||
|
|
attr_reader :check_result
|
||
|
|
|
||
|
|
def initialize(check_result)
|
||
|
|
@check_result = check_result
|
||
|
|
super(check_result[:error])
|
||
|
|
end
|
||
|
|
|
||
|
|
def to_diagnostic_json
|
||
|
|
{
|
||
|
|
error: 'schema_mismatch',
|
||
|
|
details: check_result
|
||
|
|
}
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
module Expectations
|
||
|
|
SETTINGS = {
|
||
|
|
description: 'Project settings file',
|
||
|
|
required_keys: %w[enabledPlugins]
|
||
|
|
}.freeze
|
||
|
|
|
||
|
|
MARKETPLACE = {
|
||
|
|
description: 'Marketplace registry',
|
||
|
|
required_keys: %w[name plugins]
|
||
|
|
}.freeze
|
||
|
|
|
||
|
|
INSTALLED_PLUGINS = {
|
||
|
|
description: 'Installed plugins registry',
|
||
|
|
required_keys: %w[plugins]
|
||
|
|
}.freeze
|
||
|
|
|
||
|
|
def self.check(file_path, expected_keys)
|
||
|
|
unless File.exist?(file_path)
|
||
|
|
return { ok: false, error: "File not found: #{file_path}", missing_keys: expected_keys }
|
||
|
|
end
|
||
|
|
|
||
|
|
data = JSON.parse(File.read(file_path))
|
||
|
|
missing = expected_keys.reject { |key| data.key?(key) }
|
||
|
|
|
||
|
|
if missing.empty?
|
||
|
|
{ ok: true }
|
||
|
|
else
|
||
|
|
{ ok: false, error: "Missing required keys in #{file_path}", missing_keys: missing }
|
||
|
|
end
|
||
|
|
rescue JSON::ParserError => e
|
||
|
|
{ ok: false, error: "Invalid JSON in #{file_path}: #{e.message}", missing_keys: expected_keys }
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|