Example #1
0
 def validate_type(self):
     if self.type == str:
         return compat.is_string(self.value)
     else:
         return isinstance(self.value,
                           self.type)
Example #2
0
def _merge_namespace_options(namespace_set=None,
                             ex_namespace_set=None,
                             gridfs_set=None,
                             dest_mapping=None,
                             namespace_options=None,
                             include_fields=None,
                             exclude_fields=None):
    """Merges namespaces options together.

    The first is the set of excluded namespaces and the second is a mapping
    from source namespace to Namespace instances.
    """
    namespace_set = set(namespace_set or [])
    ex_namespace_set = set(ex_namespace_set or [])
    gridfs_set = set(gridfs_set or [])
    dest_mapping = dest_mapping or {}
    namespace_options = namespace_options or {}
    include_fields = set(include_fields or [])
    exclude_fields = set(exclude_fields or [])
    namespaces = {}

    for source_name, options_or_str in namespace_options.items():
        if isinstance(options_or_str, dict):
            namespace_set.add(source_name)
            if options_or_str.get('gridfs'):
                gridfs_set.add(source_name)
            namespaces[source_name] = Namespace(
                dest_name=options_or_str.get('rename'),
                include_fields=options_or_str.get('includeFields'),
                exclude_fields=options_or_str.get('excludeFields'),
                gridfs=options_or_str.get('gridfs', False))
        elif compat.is_string(options_or_str):
            namespace_set.add(source_name)
            namespaces[source_name] = Namespace(dest_name=options_or_str)
        elif options_or_str:
            namespace_set.add(source_name)
        else:
            ex_namespace_set.add(source_name)

    # Add namespaces that are renamed but not in namespace_options
    for source_name, target_name in dest_mapping.items():
        namespaces[source_name] = namespaces.get(
            source_name, Namespace()).with_options(dest_name=target_name)

    # Add namespaces that are included but not in namespace_options
    for included_name in namespace_set:
        if included_name not in namespaces:
            namespaces[included_name] = Namespace()

    # Add namespaces that are excluded but not in namespace_options
    for gridfs_name in gridfs_set:
        namespaces[gridfs_name] = namespaces.get(
            gridfs_name, Namespace()).with_options(gridfs=True)

    # Add source, destination name, and globally included and excluded fields
    for included_name in namespaces:
        namespace = namespaces[included_name]
        namespace = namespace.with_options(
            source_name=included_name,
            include_fields=validate_include_fields(include_fields,
                                                   namespace.include_fields),
            exclude_fields=validate_exclude_fields(exclude_fields,
                                                   namespace.exclude_fields))
        # The default destination name is the same as the source.
        if not namespace.dest_name:
            namespace = namespace.with_options(dest_name=included_name)
        namespaces[included_name] = namespace

    return ex_namespace_set, namespaces
Example #3
0
 def validate_type(self):
     if self.type == str:
         return compat.is_string(self.value)
     else:
         return isinstance(self.value, self.type)
Example #4
0
def _merge_namespace_options(namespace_set=None, ex_namespace_set=None,
                             gridfs_set=None, dest_mapping=None,
                             namespace_options=None,
                             include_fields=None, exclude_fields=None):
    """Merges namespaces options together.

    The first is the set of excluded namespaces and the second is a mapping
    from source namespace to Namespace instances.
    """
    namespace_set = set(namespace_set or [])
    ex_namespace_set = set(ex_namespace_set or [])
    gridfs_set = set(gridfs_set or [])
    dest_mapping = dest_mapping or {}
    namespace_options = namespace_options or {}
    include_fields = set(include_fields or [])
    exclude_fields = set(exclude_fields or [])
    namespaces = {}

    for source_name, options_or_str in namespace_options.items():
        if isinstance(options_or_str, dict):
            namespace_set.add(source_name)
            if options_or_str.get('gridfs'):
                gridfs_set.add(source_name)
            namespaces[source_name] = Namespace(
                dest_name=options_or_str.get('rename'),
                include_fields=options_or_str.get('includeFields'),
                exclude_fields=options_or_str.get('excludeFields'),
                gridfs=options_or_str.get('gridfs', False))
        elif compat.is_string(options_or_str):
            namespace_set.add(source_name)
            namespaces[source_name] = Namespace(dest_name=options_or_str)
        elif options_or_str:
            namespace_set.add(source_name)
        else:
            ex_namespace_set.add(source_name)

    # Add namespaces that are renamed but not in namespace_options
    for source_name, target_name in dest_mapping.items():
        namespaces[source_name] = namespaces.get(
            source_name, Namespace()).with_options(dest_name=target_name)

    # Add namespaces that are included but not in namespace_options
    for included_name in namespace_set:
        if included_name not in namespaces:
            namespaces[included_name] = Namespace()

    # Add namespaces that are excluded but not in namespace_options
    for gridfs_name in gridfs_set:
        namespaces[gridfs_name] = namespaces.get(
            gridfs_name, Namespace()).with_options(gridfs=True)

    # Add source, destination name, and globally included and excluded fields
    for included_name in namespaces:
        namespace = namespaces[included_name]
        namespace = namespace.with_options(
            source_name=included_name,
            include_fields=validate_include_fields(include_fields,
                                                   namespace.include_fields),
            exclude_fields=validate_exclude_fields(exclude_fields,
                                                   namespace.exclude_fields))
        # The default destination name is the same as the source.
        if not namespace.dest_name:
            namespace = namespace.with_options(dest_name=included_name)
        namespaces[included_name] = namespace

    return ex_namespace_set, namespaces