class Avromatic::ModelRegistry

The ModelRegistry class is used to store and fetch nested models by their fullname. An optional namespace prefix can be removed from the full name that is used to store and fetch models.

Public Class Methods

new(remove_namespace_prefix: nil) click to toggle source
# File lib/avromatic/model_registry.rb, line 11
def initialize(remove_namespace_prefix: nil)
  @prefix = remove_namespace_prefix
  @hash = Hash.new
end

Public Instance Methods

[](fullname) click to toggle source
# File lib/avromatic/model_registry.rb, line 20
def [](fullname)
  @hash.fetch(fullname)
end
Also aliased as: fetch
clear() click to toggle source
# File lib/avromatic/model_registry.rb, line 16
def clear
  @hash.clear
end
ensure_registered_model(model) click to toggle source
# File lib/avromatic/model_registry.rb, line 44
def ensure_registered_model(model)
  name = model_fullname(model)
  if registered?(name)
    existing_model = fetch(name)
    unless existing_model.equal?(model)
      raise "Attempted to replace existing Avromatic model #{model_debug_name(existing_model)} with new model " \
        "#{model_debug_name(model)} as '#{name}'. Perhaps '#{model_debug_name(model)}' needs to be eager loaded " \
        'via the Avromatic eager_load_models setting?'
    end
  else
    register(model)
  end
end
fetch(fullname)
Alias for: []
model_fullname(model) click to toggle source
# File lib/avromatic/model_registry.rb, line 39
def model_fullname(model)
  name = model.avro_schema.fullname
  remove_prefix(name)
end
register(model) click to toggle source
# File lib/avromatic/model_registry.rb, line 25
def register(model)
  raise 'models with a key schema are not supported' if model.key_avro_schema

  name = model_fullname(model)
  raise "'#{name}' has already been registered" if registered?(name)

  @hash[name] = model
end
registered?(fullname_or_model) click to toggle source
# File lib/avromatic/model_registry.rb, line 34
def registered?(fullname_or_model)
  fullname = fullname_or_model.is_a?(String) ? fullname_or_model : model_fullname(fullname_or_model)
  @hash.key?(fullname)
end
remove_prefix(name) click to toggle source
# File lib/avromatic/model_registry.rb, line 58
def remove_prefix(name)
  return name if @prefix.nil?

  value =
    case @prefix
    when String
      name.start_with?(@prefix) ? name.from(@prefix.length) : name
    when Regexp
      name.sub(@prefix, '')
    else
      raise "unsupported `remove_namespace_prefix` value: #{@prefix}"
    end

  value.start_with?('.') ? value.from(1) : value
end

Private Instance Methods

model_debug_name(model) click to toggle source
# File lib/avromatic/model_registry.rb, line 76
def model_debug_name(model)
  model.name || model.to_s
end