class Avro::Builder::DefinitionCache
This class is used to cache previously defined schema objects preventing direct access via the DSL
.
Attributes
builder[R]
schema_names[R]
schema_objects[R]
Public Class Methods
new(builder)
click to toggle source
# File lib/avro/builder/definition_cache.rb, line 9 def initialize(builder) @builder = builder @schema_objects = {} @schema_names = Set.new end
Public Instance Methods
add_schema_object(object)
click to toggle source
Cache and schema object by name (for convenience) and fullname. The schema object is only available by name if the unqualified name is unique.
# File lib/avro/builder/definition_cache.rb, line 17 def add_schema_object(object) store_by_name(object) if object.namespace store_by_fullname(object) end
add_type_by_name(type_object, name, namespace = nil)
click to toggle source
Add a type object directly with the specified name. The type_object may not have a name or namespace.
# File lib/avro/builder/definition_cache.rb, line 37 def add_type_by_name(type_object, name, namespace = nil) fullname = Avro::Name.make_fullname(name.to_s, namespace && namespace.to_s) name = fullname.split('.').last store_by_name(type_object, name) store_by_fullname(type_object, fullname) if name != fullname end
lookup_named_type(key, namespace = nil)
click to toggle source
Lookup an Avro
schema object by name, possibly fully qualified by namespace.
# File lib/avro/builder/definition_cache.rb, line 23 def lookup_named_type(key, namespace = nil) key_str = Avro::Name.make_fullname(key.to_s, namespace && namespace.to_s) object = schema_objects[key_str] object = builder.import(key) if object.nil? && !schema_names.include?(key.to_s) raise DefinitionNotFoundError.new(key) if object.nil? && namespace.nil? # Return object or retry without namespace object || lookup_named_type(key, nil) end
Private Instance Methods
store_by_fullname(object, fullname = object.fullname)
click to toggle source
# File lib/avro/builder/definition_cache.rb, line 60 def store_by_fullname(object, fullname = object.fullname) raise DuplicateDefinitionError.new(fullname, object, schema_objects[fullname]) if schema_objects.key?(fullname) schema_objects.store(fullname, object) end
store_by_name(object, name = object.name.to_s)
click to toggle source
Schemas are stored by name, provided that the name is unique. If the unqualified name is ambiguous then it is removed from the cache. A set of unqualified names is kept to avoid reloading files for ambiguous references.
# File lib/avro/builder/definition_cache.rb, line 51 def store_by_name(object, name = object.name.to_s) if schema_objects.key?(name) schema_objects.delete(name) elsif !schema_names.include?(name) schema_objects.store(name, object) end schema_names.add(name) end