Class: Rigor::Plugin::Manifest

Inherits:
Object
  • Object
show all
Defined in:
lib/rigor/plugin/manifest.rb

Overview

Value object describing one plugin’s identity and metadata. Constructed once per plugin class through Base.manifest; consumed by Loader when matching project configuration entries to registered plugins and by Cache::Descriptor::PluginEntry when deriving cache keys.

The fields are pinned by ADR-2 § “Registration, Configuration, and Caching”; the v0.1.0 plugin contract surface treats this struct as the public manifest shape.

Defined Under Namespace

Classes: Consumption

Constant Summary collapse

VALID_ID =

Same regex Cache::Store::VALID_PRODUCER_ID uses, so plugin ids round-trip through cache producer ids and ‘plugin.<id>.<rule>` diagnostic identifiers without escape.

/\A[a-z][a-z0-9._-]*\z/
VALID_VALUE_KINDS =

The first-implementation ‘config_schema` accepts these value kinds. Slice 1 only checks key presence and shallow value kind; richer schemas (nested maps, enums) land later when the v0.1.0 protocol slices need them.

%i[string boolean integer array hash any].freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(id:, version:, description: nil, config_schema: {}, produces: [], consumes: [], owns_receivers: [], open_receivers: [], type_node_resolvers: [], block_as_methods: [], heredoc_templates: [], nested_class_templates: [], trait_registries: [], external_files: [], hkt_registrations: [], hkt_definitions: [], signature_paths: [], protocol_contracts: [], source_rbs_synthesizer: nil, additional_initializers: []) ⇒ Manifest

rubocop:disable Metrics/ParameterLists



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
# File 'lib/rigor/plugin/manifest.rb', line 50

def initialize( # rubocop:disable Metrics/ParameterLists
  id:, version:,
  description: nil, config_schema: {},
  produces: [], consumes: [], owns_receivers: [], open_receivers: [], type_node_resolvers: [],
  block_as_methods: [], heredoc_templates: [], nested_class_templates: [],
  trait_registries: [], external_files: [],
  hkt_registrations: [], hkt_definitions: [], signature_paths: [], protocol_contracts: [],
  source_rbs_synthesizer: nil, additional_initializers: []
)
  validate_id!(id)
  validate_version!(version)
  validate_config_schema!(config_schema)
  validate_produces!(produces)
  validate_owns_receivers!(owns_receivers)
  validate_open_receivers!(open_receivers)
  validate_type_node_resolvers!(type_node_resolvers)
  validate_block_as_methods!(block_as_methods)
  validate_heredoc_templates!(heredoc_templates)
  validate_nested_class_templates!(nested_class_templates)
  validate_trait_registries!(trait_registries)
  validate_external_files!(external_files)
  validate_hkt_registrations!(hkt_registrations)
  validate_hkt_definitions!(hkt_definitions)
  validate_signature_paths!(signature_paths)
  validate_protocol_contracts!(protocol_contracts)
  validate_source_rbs_synthesizer!(source_rbs_synthesizer)
  validate_additional_initializers!(additional_initializers)

  assign_fields(id, version, description, config_schema, produces, consumes, owns_receivers,
                open_receivers, type_node_resolvers, block_as_methods, heredoc_templates, trait_registries,
                external_files, hkt_registrations, hkt_definitions, signature_paths, protocol_contracts,
                source_rbs_synthesizer)
  assign_nested_class_templates(nested_class_templates)
  assign_additional_initializers(additional_initializers)
  freeze
end

Instance Attribute Details

#additional_initializersObject (readonly)

Returns the value of attribute additional_initializers.



44
45
46
# File 'lib/rigor/plugin/manifest.rb', line 44

def additional_initializers
  @additional_initializers
end

#block_as_methodsObject (readonly)

Returns the value of attribute block_as_methods.



44
45
46
# File 'lib/rigor/plugin/manifest.rb', line 44

def block_as_methods
  @block_as_methods
end

#config_defaultsObject (readonly)

Returns the value of attribute config_defaults.



44
45
46
# File 'lib/rigor/plugin/manifest.rb', line 44

def config_defaults
  @config_defaults
end

#config_schemaObject (readonly)

Returns the value of attribute config_schema.



44
45
46
# File 'lib/rigor/plugin/manifest.rb', line 44

def config_schema
  @config_schema
end

#consumesObject (readonly)

Returns the value of attribute consumes.



44
45
46
# File 'lib/rigor/plugin/manifest.rb', line 44

def consumes
  @consumes
end

#descriptionObject (readonly)

Returns the value of attribute description.



44
45
46
# File 'lib/rigor/plugin/manifest.rb', line 44

def description
  @description
end

#external_filesObject (readonly)

Returns the value of attribute external_files.



44
45
46
# File 'lib/rigor/plugin/manifest.rb', line 44

def external_files
  @external_files
end

#heredoc_templatesObject (readonly)

Returns the value of attribute heredoc_templates.



44
45
46
# File 'lib/rigor/plugin/manifest.rb', line 44

def heredoc_templates
  @heredoc_templates
end

#hkt_definitionsObject (readonly)

Returns the value of attribute hkt_definitions.



44
45
46
# File 'lib/rigor/plugin/manifest.rb', line 44

def hkt_definitions
  @hkt_definitions
end

#hkt_registrationsObject (readonly)

Returns the value of attribute hkt_registrations.



44
45
46
# File 'lib/rigor/plugin/manifest.rb', line 44

def hkt_registrations
  @hkt_registrations
end

#idObject (readonly)

Returns the value of attribute id.



44
45
46
# File 'lib/rigor/plugin/manifest.rb', line 44

def id
  @id
end

#nested_class_templatesObject (readonly)

Returns the value of attribute nested_class_templates.



44
45
46
# File 'lib/rigor/plugin/manifest.rb', line 44

def nested_class_templates
  @nested_class_templates
end

#open_receiversObject (readonly)

Returns the value of attribute open_receivers.



44
45
46
# File 'lib/rigor/plugin/manifest.rb', line 44

def open_receivers
  @open_receivers
end

#owns_receiversObject (readonly)

Returns the value of attribute owns_receivers.



44
45
46
# File 'lib/rigor/plugin/manifest.rb', line 44

def owns_receivers
  @owns_receivers
end

#producesObject (readonly)

Returns the value of attribute produces.



44
45
46
# File 'lib/rigor/plugin/manifest.rb', line 44

def produces
  @produces
end

#protocol_contractsObject (readonly)

Returns the value of attribute protocol_contracts.



44
45
46
# File 'lib/rigor/plugin/manifest.rb', line 44

def protocol_contracts
  @protocol_contracts
end

#signature_pathsObject (readonly)

Returns the value of attribute signature_paths.



44
45
46
# File 'lib/rigor/plugin/manifest.rb', line 44

def signature_paths
  @signature_paths
end

#source_rbs_synthesizerObject (readonly)

Returns the value of attribute source_rbs_synthesizer.



44
45
46
# File 'lib/rigor/plugin/manifest.rb', line 44

def source_rbs_synthesizer
  @source_rbs_synthesizer
end

#trait_registriesObject (readonly)

Returns the value of attribute trait_registries.



44
45
46
# File 'lib/rigor/plugin/manifest.rb', line 44

def trait_registries
  @trait_registries
end

#type_node_resolversObject (readonly)

Returns the value of attribute type_node_resolvers.



44
45
46
# File 'lib/rigor/plugin/manifest.rb', line 44

def type_node_resolvers
  @type_node_resolvers
end

#versionObject (readonly)

Returns the value of attribute version.



44
45
46
# File 'lib/rigor/plugin/manifest.rb', line 44

def version
  @version
end

Instance Method Details

#==(other) ⇒ Object Also known as: eql?



183
184
185
# File 'lib/rigor/plugin/manifest.rb', line 183

def ==(other)
  other.is_a?(Manifest) && to_h == other.to_h
end

#hashObject



188
189
190
# File 'lib/rigor/plugin/manifest.rb', line 188

def hash
  to_h.hash
end

#to_hObject

rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity



157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
# File 'lib/rigor/plugin/manifest.rb', line 157

def to_h # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
  {
    "id" => id,
    "version" => version,
    "description" => description,
    "config_schema" => config_schema.to_h { |k, v| [k, v.to_s] },
    "config_defaults" => config_defaults,
    "produces" => produces.map(&:to_s),
    "consumes" => consumes.map { |c| consumption_hash(c) },
    "owns_receivers" => owns_receivers,
    "open_receivers" => open_receivers,
    "type_node_resolvers" => type_node_resolvers.map { |r| r.class.name },
    "block_as_methods" => block_as_methods.map(&:to_h),
    "heredoc_templates" => heredoc_templates.map(&:to_h),
    "nested_class_templates" => nested_class_templates.map(&:to_h),
    "trait_registries" => trait_registries.map(&:to_h),
    "external_files" => external_files.map(&:to_h),
    "hkt_registrations" => hkt_registrations.map(&:to_h),
    "hkt_definitions" => hkt_definitions.map { |d| { "uri" => d.uri, "params" => d.params } },
    "signature_paths" => signature_paths,
    "protocol_contracts" => protocol_contracts.map(&:to_h),
    "source_rbs_synthesizer" => source_rbs_synthesizer&.class&.name,
    "additional_initializers" => additional_initializers.map(&:to_h)
  }
end

#validate_config(config) ⇒ Object

Validates the user-supplied plugin config block against this manifest’s ‘config_schema`. Returns an array of human-readable error strings (empty when the config is valid). Slice 1 checks only unknown keys and shallow value kind; nested schemas come with later slices.



139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
# File 'lib/rigor/plugin/manifest.rb', line 139

def validate_config(config)
  return ["plugin config must be a Hash, got #{config.class}"] unless config.is_a?(Hash)

  errors = []
  config.each do |key, value|
    key_s = key.to_s
    unless config_schema.key?(key_s)
      errors << "unknown config key #{key_s.inspect} for plugin #{id.inspect}"
      next
    end

    kind = config_schema.fetch(key_s)
    errors << "config key #{key_s.inspect} expected #{kind}, got #{value.class}" unless value_matches?(value,
                                                                                                       kind)
  end
  errors
end