Class: EventEngine::EventSchema
- Inherits:
-
Object
- Object
- EventEngine::EventSchema
- Defined in:
- lib/event_engine/event_schema.rb
Overview
Container for all event schemas, organized by event name and version. This is the data structure loaded from the compiled db/event_schema.rb file and used by SchemaRegistry at runtime.
Defined Under Namespace
Classes: DuplicateEventNameError
Class Method Summary collapse
-
.define {|schema| ... } ⇒ EventSchema
Creates an EventSchema using a block DSL (used by the schema file).
Instance Method Summary collapse
-
#events ⇒ Array<Symbol>
Returns all registered event names.
-
#finalize! ⇒ void
Freezes the schema, preventing further registrations.
- #guard_duplicate_event_name!(existing, incoming) ⇒ Object
-
#initialize ⇒ EventSchema
constructor
A new instance of EventSchema.
-
#latest_for(event_name) ⇒ EventDefinition::Schema?
Returns the latest (highest version) schema for an event.
-
#register(schema) ⇒ Object
Registers a schema for a specific event name and version.
-
#schema_for(event_name, version) ⇒ EventDefinition::Schema?
Returns the schema for a specific event name and version.
-
#schemas_by_event ⇒ Hash{Symbol => Hash{Integer => EventDefinition::Schema}}
Returns the internal hash of schemas keyed by event name and version.
-
#versions_for(event_name) ⇒ Array<Integer>
Returns sorted version numbers for a given event.
Constructor Details
#initialize ⇒ EventSchema
Returns a new instance of EventSchema.
18 19 20 21 |
# File 'lib/event_engine/event_schema.rb', line 18 def initialize @schemas_by_event = {} @finalized = false end |
Class Method Details
.define {|schema| ... } ⇒ EventSchema
Creates an EventSchema using a block DSL (used by the schema file).
12 13 14 15 16 |
# File 'lib/event_engine/event_schema.rb', line 12 def self.define(&block) schema = new block.call(schema) schema end |
Instance Method Details
#events ⇒ Array<Symbol>
Returns all registered event names.
49 50 51 |
# File 'lib/event_engine/event_schema.rb', line 49 def events @schemas_by_event.keys end |
#finalize! ⇒ void
This method returns an undefined value.
Freezes the schema, preventing further registrations.
85 86 87 88 89 90 |
# File 'lib/event_engine/event_schema.rb', line 85 def finalize! @finalized = true @schemas_by_event.each_value(&:freeze) @schemas_by_event.freeze freeze end |
#guard_duplicate_event_name!(existing, incoming) ⇒ Object
37 38 39 40 41 42 43 44 |
# File 'lib/event_engine/event_schema.rb', line 37 def guard_duplicate_event_name!(existing, incoming) return unless existing raise DuplicateEventNameError, "duplicate event_name #{incoming.event_name.inspect}: " \ "already registered with domain #{existing.domain.inspect}, " \ "cannot register again with domain #{incoming.domain.inspect}" end |
#latest_for(event_name) ⇒ EventDefinition::Schema?
Returns the latest (highest version) schema for an event.
76 77 78 79 80 |
# File 'lib/event_engine/event_schema.rb', line 76 def latest_for(event_name) versions = @schemas_by_event[event_name] return nil unless versions && !versions.empty? versions[versions.keys.max] end |
#register(schema) ⇒ Object
Registers a schema for a specific event name and version.
27 28 29 30 31 32 33 34 35 |
# File 'lib/event_engine/event_schema.rb', line 27 def register(schema) raise FrozenError, "EventSchema is finalized" if @finalized event_name = schema.event_name version = schema.event_version @schemas_by_event[event_name] ||= {} guard_duplicate_event_name!(@schemas_by_event[event_name][version], schema) @schemas_by_event[event_name][version] = schema end |
#schema_for(event_name, version) ⇒ EventDefinition::Schema?
Returns the schema for a specific event name and version.
68 69 70 |
# File 'lib/event_engine/event_schema.rb', line 68 def schema_for(event_name, version) @schemas_by_event.dig(event_name, version) end |
#schemas_by_event ⇒ Hash{Symbol => Hash{Integer => EventDefinition::Schema}}
Returns the internal hash of schemas keyed by event name and version.
95 96 97 |
# File 'lib/event_engine/event_schema.rb', line 95 def schemas_by_event @schemas_by_event end |
#versions_for(event_name) ⇒ Array<Integer>
Returns sorted version numbers for a given event.
57 58 59 60 61 |
# File 'lib/event_engine/event_schema.rb', line 57 def versions_for(event_name) versions = @schemas_by_event[event_name] return [] unless versions versions.keys.sort end |