ó
X¾÷Xc           @   sa   d  Z  d d l m Z d d l m Z d e j f d „  ƒ  YZ e d e j ƒ  ƒ Z d „  Z d S(	   sR  A database of Python protocol buffer generated symbols.

SymbolDatabase is the MessageFactory for messages generated at compile time,
and makes it easy to create new instances of a registered type, given only the
type's protocol buffer symbol name.

Example usage:

  db = symbol_database.SymbolDatabase()

  # Register symbols of interest, from one or multiple files.
  db.RegisterFileDescriptor(my_proto_pb2.DESCRIPTOR)
  db.RegisterMessage(my_proto_pb2.MyMessage)
  db.RegisterEnumDescriptor(my_proto_pb2.MyEnum.DESCRIPTOR)

  # The database can be used as a MessageFactory, to generate types based on
  # their name:
  types = db.GetMessages(['my_proto.proto'])
  my_message_instance = types['MyMessage']()

  # The database's underlying descriptor pool can be queried, so it's not
  # necessary to know a type's filename to be able to generate it:
  filename = db.pool.FindFileContainingSymbol('MyMessage')
  my_message_instance = db.GetMessages([filename])['MyMessage']()

  # This functionality is also provided directly via a convenience method:
  my_message_instance = db.GetSymbol('MyMessage')()
iÿÿÿÿ(   t   descriptor_pool(   t   message_factoryt   SymbolDatabasec           B   s;   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   s'   A database of Python generated symbols.c         C   s-   | j  } | |  j | j <|  j j | ƒ | S(   s÷   Registers the given message type in the local database.

    Calls to GetSymbol() and GetMessages() will return messages registered here.

    Args:
      message: a message.Message, to be registered.

    Returns:
      The provided message.
    (   t
   DESCRIPTORt   _classest	   full_namet   poolt   AddDescriptor(   t   selft   messaget   desc(    (    sA   /tmp/pip-build-h1VYrz/protobuf/google/protobuf/symbol_database.pyt   RegisterMessageD   s    	c         C   s   |  j  j | ƒ | S(   s«   Registers the given enum descriptor in the local database.

    Args:
      enum_descriptor: a descriptor.EnumDescriptor.

    Returns:
      The provided descriptor.
    (   R   t   AddEnumDescriptor(   R   t   enum_descriptor(    (    sA   /tmp/pip-build-h1VYrz/protobuf/google/protobuf/symbol_database.pyt   RegisterEnumDescriptorU   s    	c         C   s   |  j  j | ƒ d S(   s«   Registers the given file descriptor in the local database.

    Args:
      file_descriptor: a descriptor.FileDescriptor.

    Returns:
      The provided descriptor.
    N(   R   t   AddFileDescriptor(   R   t   file_descriptor(    (    sA   /tmp/pip-build-h1VYrz/protobuf/google/protobuf/symbol_database.pyt   RegisterFileDescriptora   s    	c         C   s   |  j  | S(   sx  Tries to find a symbol in the local database.

    Currently, this method only returns message.Message instances, however, if
    may be extended in future to support other symbol types.

    Args:
      symbol: A str, a protocol buffer symbol.

    Returns:
      A Python class corresponding to the symbol.

    Raises:
      KeyError: if the symbol could not be found.
    (   R   (   R   t   symbol(    (    sA   /tmp/pip-build-h1VYrz/protobuf/google/protobuf/symbol_database.pyt	   GetSymboll   s    c            s–   ‡  f d †  ‰  i  } xz | D]r } |  j  j | ƒ } xW | j j ƒ  D]F } x= ˆ  | ƒ D]/ } y |  j | | | <WqW t k
 r… qW XqW WqD Wq W| S(   s  Gets all registered messages from a specified file.

    Only messages already created and registered will be returned; (this is the
    case for imported _pb2 modules)
    But unlike MessageFactory, this version also returns already defined nested
    messages, but does not register any message extensions.

    Args:
      files: The file names to extract messages from.

    Returns:
      A dictionary mapping proto names to the message classes.

    Raises:
      KeyError: if a file could not be found.
    c         3   s<   |  j  Vx- |  j D]" } x ˆ  | ƒ D] } | Vq% Wq Wd S(   sC   Walk a message Descriptor and recursively yields all message names.N(   R   t   nested_types(   R
   t   msg_descR   (   t   _GetAllMessageNames(    sA   /tmp/pip-build-h1VYrz/protobuf/google/protobuf/symbol_database.pyR   ‘   s    (   R   t   FindFileByNamet   message_types_by_namet   valuesR   t   KeyError(   R   t   filest   resultt	   file_namet	   file_descR   R   (    (   R   sA   /tmp/pip-build-h1VYrz/protobuf/google/protobuf/symbol_database.pyt   GetMessages~   s    (   t   __name__t
   __module__t   __doc__R   R   R   R   R   (    (    (    sA   /tmp/pip-build-h1VYrz/protobuf/google/protobuf/symbol_database.pyR   A   s   				R   c           C   s   t  S(   s#   Returns the default SymbolDatabase.(   t   _DEFAULT(    (    (    sA   /tmp/pip-build-h1VYrz/protobuf/google/protobuf/symbol_database.pyt   Default¨   s    N(   R"   t   google.protobufR    R   t   MessageFactoryR   R$   R#   (    (    (    sA   /tmp/pip-build-h1VYrz/protobuf/google/protobuf/symbol_database.pyt   <module>:   s
   d