Source code for vmware.vapi.l10n.bundle

"""
Helper classes for creation of resource bundles
"""

__author__ = 'VMware, Inc.'
__copyright__ = 'Copyright (c) 2015 VMware, Inc.  All rights reserved.'

import six

from vmware.vapi.message import MessageBundle


def _parse_message_data_sets(data_sets):
    """
    Parse the message data sets and extract the messages

    :type  data_sets: :class:`list` of :class:`str`
    :param data_sets: Resource bundle string extracted from the egg file
    :rtype: :class:`dict` of :class:`str`, :class:`str`
    :return: Dictionary of messages
    """
    result = {}
    for data_set in data_sets:
        messages = data_set.splitlines()
        for message in messages:
            if isinstance(message, six.binary_type):
                message = message.decode('utf-8')
            message = message.strip()
            if not message.startswith('#') and '=' in message:
                key, value = message.split('=', 1)
                key = key.strip()
                # To use '=' in the value, it has to be escaped
                value = value.strip().replace(r'\=', '=')
                if not key:
                    raise ValueError('Key not present for value %s', value)
                if not value:
                    raise ValueError('Value not present for key %s', value)
                result[key] = value
    return result


[docs]class PropertiesResourceBundle(MessageBundle): """ Class for creating resource bundles using property files in the distributable. i.e. egg or zip file. """ def __init__(self, property_files): """ Initialize PropertiesResourceBundle :type property_files: :class:`list` of :class:`tuple` or :class:`tuple` :param property_files: List of property files to be processed. The tuple should be of the form (package, resource_name). For ex: If a file named runtime.properties is present in vmware.vapi package, the tuple to be passed is ('vmware.vapi', 'runtime.properties') """ # Importing here so that there is no dependency on pkg_resources # for modules that use other kind of MessageBundle classes from pkg_resources import resource_string if not isinstance(property_files, list): property_files = [property_files] bundles = [resource_string(path, filename) for path, filename in property_files] messages = _parse_message_data_sets(bundles) MessageBundle.__init__(self, messages)
[docs]class FileMessageBundle(MessageBundle): """ Class for creating resource bundles using list of files that contain messages """ def __init__(self, message_files): """ Initialize FileMessageBundle :type message_files: :class:`list` of :class:`str` or :class:`str` :param message_files: List of message files to be processed. Each element in the list should be a fully qualified file path. """ if not isinstance(message_files, list): message_files = [message_files] bundles = [] for message_file in message_files: if six.PY2: with open(message_file, 'r') as fp: bundles.append(fp.read()) else: with open(message_file, 'r', encoding='utf-8') as fp: bundles.append(fp.read()) messages = _parse_message_data_sets(bundles) MessageBundle.__init__(self, messages)
[docs]class DictionaryResourceBundle(MessageBundle): """ Class for creating resource bundles using dictionary of messages """ def __init__(self, msgs): """ Initialize DictionaryResourceBundle :type msgs: :class:`dict` :param msgs: Message bundle """ if not isinstance(msgs, dict): raise TypeError('Messages should be a dictionary') MessageBundle.__init__(self, msgs)