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

rubocop:disable Metrics/ParameterLists



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/rigor/plugin/manifest.rb', line 43

def initialize( # rubocop:disable Metrics/ParameterLists
  id:, version:,
  description: nil, protocols: [], config_schema: {},
  produces: [], consumes: [], owns_receivers: []
)
  validate_id!(id)
  validate_version!(version)
  validate_protocols!(protocols)
  validate_config_schema!(config_schema)
  validate_produces!(produces)
  validate_owns_receivers!(owns_receivers)

  assign_fields(id, version, description, protocols, config_schema, produces, consumes, owns_receivers)
  freeze
end

Instance Attribute Details

#config_schemaObject (readonly)

Returns the value of attribute config_schema.



40
41
42
# File 'lib/rigor/plugin/manifest.rb', line 40

def config_schema
  @config_schema
end

#consumesObject (readonly)

Returns the value of attribute consumes.



40
41
42
# File 'lib/rigor/plugin/manifest.rb', line 40

def consumes
  @consumes
end

#descriptionObject (readonly)

Returns the value of attribute description.



40
41
42
# File 'lib/rigor/plugin/manifest.rb', line 40

def description
  @description
end

#idObject (readonly)

Returns the value of attribute id.



40
41
42
# File 'lib/rigor/plugin/manifest.rb', line 40

def id
  @id
end

#owns_receiversObject (readonly)

Returns the value of attribute owns_receivers.



40
41
42
# File 'lib/rigor/plugin/manifest.rb', line 40

def owns_receivers
  @owns_receivers
end

#producesObject (readonly)

Returns the value of attribute produces.



40
41
42
# File 'lib/rigor/plugin/manifest.rb', line 40

def produces
  @produces
end

#protocolsObject (readonly)

Returns the value of attribute protocols.



40
41
42
# File 'lib/rigor/plugin/manifest.rb', line 40

def protocols
  @protocols
end

#versionObject (readonly)

Returns the value of attribute version.



40
41
42
# File 'lib/rigor/plugin/manifest.rb', line 40

def version
  @version
end

Instance Method Details

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



112
113
114
# File 'lib/rigor/plugin/manifest.rb', line 112

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

#hashObject



117
118
119
# File 'lib/rigor/plugin/manifest.rb', line 117

def hash
  to_h.hash
end

#to_hObject



99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/rigor/plugin/manifest.rb', line 99

def to_h
  {
    "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
  }
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.



81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/rigor/plugin/manifest.rb', line 81

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