Class: Avromatic::ModelRegistry

Inherits:
Object
  • Object
show all
Defined in:
lib/avromatic/model_registry.rb

Overview

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.

Instance Method Summary collapse

Constructor Details

#initialize(remove_namespace_prefix: nil) ⇒ ModelRegistry

Returns a new instance of ModelRegistry.



9
10
11
12
# File 'lib/avromatic/model_registry.rb', line 9

def initialize(remove_namespace_prefix: nil)
  @prefix = remove_namespace_prefix
  @hash = Hash.new
end

Instance Method Details

#[](fullname) ⇒ Object Also known as: fetch



18
19
20
# File 'lib/avromatic/model_registry.rb', line 18

def [](fullname)
  @hash.fetch(fullname)
end

#clearObject



14
15
16
# File 'lib/avromatic/model_registry.rb', line 14

def clear
  @hash.clear
end

#ensure_registered_model(model) ⇒ Object



39
40
41
42
43
44
45
46
47
48
# File 'lib/avromatic/model_registry.rb', line 39

def ensure_registered_model(model)
  name = model_fullname(model)
  if registered?(name)
    unless fetch(name).equal?(model)
      raise "attempted to replace existing model #{fetch(name)} with new model #{model} as '#{name}'"
    end
  else
    register(model)
  end
end

#model_fullname(model) ⇒ Object



34
35
36
37
# File 'lib/avromatic/model_registry.rb', line 34

def model_fullname(model)
  name = model.avro_schema.fullname
  remove_prefix(name)
end

#register(model) ⇒ Object



23
24
25
26
27
28
# File 'lib/avromatic/model_registry.rb', line 23

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) ⇒ Boolean

Returns:

  • (Boolean)


30
31
32
# File 'lib/avromatic/model_registry.rb', line 30

def registered?(fullname)
  @hash.key?(fullname)
end

#remove_prefix(name) ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/avromatic/model_registry.rb', line 50

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