Sha256: 9ea325b76cd9cadd9ca7a2be410ecf64544d0b5f4ecb9b97b8df9287713cc474

Contents?: true

Size: 1.24 KB

Versions: 3

Compression:

Stored size: 1.24 KB

Contents

require 'active_support/core_ext/string/access'

module Avromatic
  # 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.
  class ModelRegistry

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

    def clear
      @hash.clear
    end

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

    def register(model)
      raise 'models with a key schema are not supported' if model.key_avro_schema
      name = model.avro_schema.fullname
      name = remove_prefix(name)
      raise "'#{name}' has already been registered" if registered?(name)
      @hash[name] = model
    end

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

    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
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
avromatic-0.10.0 lib/avromatic/model_registry.rb
avromatic-0.10.0.rc1 lib/avromatic/model_registry.rb
avromatic-0.10.0.rc0 lib/avromatic/model_registry.rb