def validate_type(self): if self.type == str: return compat.is_string(self.value) else: return isinstance(self.value, self.type)
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