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, protocols: [], 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: nil) ⇒ Manifest

rubocop:disable Metrics/ParameterLists



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

def initialize( # rubocop:disable Metrics/ParameterLists
  id:, version:,
  description: nil, protocols: [], 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: nil
)
  validate_id!(id)
  validate_version!(version)
  validate_protocols!(protocols)
  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_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)

  assign_fields(id, version, description, protocols, 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)
  freeze
end

Instance Attribute Details

#block_as_methodsObject (readonly)

Returns the value of attribute block_as_methods.



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

def block_as_methods
  @block_as_methods
end

#config_schemaObject (readonly)

Returns the value of attribute config_schema.



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

def config_schema
  @config_schema
end

#consumesObject (readonly)

Returns the value of attribute consumes.



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

def consumes
  @consumes
end

#descriptionObject (readonly)

Returns the value of attribute description.



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

def description
  @description
end

#external_filesObject (readonly)

Returns the value of attribute external_files.



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

def external_files
  @external_files
end

#heredoc_templatesObject (readonly)

Returns the value of attribute heredoc_templates.



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

def heredoc_templates
  @heredoc_templates
end

#hkt_definitionsObject (readonly)

Returns the value of attribute hkt_definitions.



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

def hkt_definitions
  @hkt_definitions
end

#hkt_registrationsObject (readonly)

Returns the value of attribute hkt_registrations.



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

def hkt_registrations
  @hkt_registrations
end

#idObject (readonly)

Returns the value of attribute id.



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

def id
  @id
end

#open_receiversObject (readonly)

Returns the value of attribute open_receivers.



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

def open_receivers
  @open_receivers
end

#owns_receiversObject (readonly)

Returns the value of attribute owns_receivers.



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

def owns_receivers
  @owns_receivers
end

#producesObject (readonly)

Returns the value of attribute produces.



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

def produces
  @produces
end

#protocol_contractsObject (readonly)

Returns the value of attribute protocol_contracts.



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

def protocol_contracts
  @protocol_contracts
end

#protocolsObject (readonly)

Returns the value of attribute protocols.



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

def protocols
  @protocols
end

#signature_pathsObject (readonly)

Returns the value of attribute signature_paths.



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

def signature_paths
  @signature_paths
end

#source_rbs_synthesizerObject (readonly)

Returns the value of attribute source_rbs_synthesizer.



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

def source_rbs_synthesizer
  @source_rbs_synthesizer
end

#trait_registriesObject (readonly)

Returns the value of attribute trait_registries.



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

def trait_registries
  @trait_registries
end

#type_node_resolversObject (readonly)

Returns the value of attribute type_node_resolvers.



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

def type_node_resolvers
  @type_node_resolvers
end

#versionObject (readonly)

Returns the value of attribute version.



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

def version
  @version
end

Instance Method Details

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



159
160
161
# File 'lib/rigor/plugin/manifest.rb', line 159

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

#hashObject



164
165
166
# File 'lib/rigor/plugin/manifest.rb', line 164

def hash
  to_h.hash
end

#to_hObject

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



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

def to_h # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
  {
    "id" => id,
    "version" => version,
    "description" => description,
    "protocols" => protocols.map(&:to_s),
    "config_schema" => config_schema.to_h { |k, v| [k, v.to_s] },
    "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),
    "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
  }
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.



117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# File 'lib/rigor/plugin/manifest.rb', line 117

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