Class: EventEngine::EventSchema

Inherits:
Object
  • Object
show all
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

Instance Method Summary collapse

Constructor Details

#initializeEventSchema

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).

Yield Parameters:

Returns:



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

#eventsArray<Symbol>

Returns all registered event names.

Returns:

  • (Array<Symbol>)


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.

Parameters:

  • event_name (Symbol)

Returns:



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.

Parameters:

Raises:

  • (FrozenError)

    if the schema has been finalized



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.

Parameters:

  • event_name (Symbol)
  • version (Integer)

Returns:



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_eventHash{Symbol => Hash{Integer => EventDefinition::Schema}}

Returns the internal hash of schemas keyed by event name and version.

Returns:



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.

Parameters:

  • event_name (Symbol)

Returns:

  • (Array<Integer>)


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