def inspect_io_obj(obj): """ :param obj: a path string, a pathlib.Path or a file / file-like object :return: A tuple of (objtype, objpath, objopener) :raises: UnknownFileTypeError """ itype = guess_io_type(obj) if itype == IOI_PATH_STR: ipath = anyconfig.utils.normpath(obj) opener = open elif itype == IOI_PATH_OBJ: ipath = anyconfig.utils.normpath(obj.as_posix()) opener = obj.open elif itype == IOI_STREAM: ipath = anyconfig.utils.get_path_from_stream(obj) opener = anyconfig.utils.noop elif itype == IOI_NONE: ipath = None opener = anyconfig.utils.noop else: raise UnknownFileTypeError("%r" % obj) return (itype, ipath, opener)
def find_processor(ipath, cps_by_ext, cps_by_type, forced_type=None): """ :param ipath: file path :param cps_by_ext: A list of pairs (file_extension, [processor_cls]) :param cps_by_type: A list of pairs (processor_type, [processor_cls]) :param forced_type: Forced processor type or processor object :return: Instance of processor class appropriate for the input `ipath` :raises: ValueError, UnknownParserTypeError, UnknownFileTypeError """ if (ipath is None or not ipath) and forced_type is None: raise ValueError("ipath or forced_type must be some value") if isinstance(forced_type, anyconfig.backend.base.Parser): return forced_type if forced_type is None: processor = find_by_filepath(ipath, cps_by_ext) if processor is None: raise UnknownFileTypeError(ipath) return processor() processor = find_by_type(forced_type, cps_by_type) if processor is None: raise UnknownParserTypeError(forced_type) return processor()
def find(obj, prs, forced_type=None, cls=anyconfig.models.processor.Processor): """ :param obj: a file path, file or file-like object, pathlib.Path object or `~anyconfig.globals.IOInfo` (namedtuple) object :param prs: A list of :class:`anyconfig.models.processor.Processor` classes :param forced_type: Forced processor type or processor object itself :param cls: A class object to compare with `forced_type` later :return: an instance of processor class to process `obj` data :raises: ValueError, UnknownProcessorTypeError, UnknownFileTypeError """ if (obj is None or not obj) and forced_type is None: raise ValueError("The first argument 'obj' or the second argument " "'forced_type' must be something other than " "None or False.") if forced_type is None: processor = find_by_maybe_file(obj, prs) if processor is None: raise UnknownFileTypeError(obj) return processor processor = find_by_type(forced_type, prs, cls=cls) if processor is None: raise UnknownProcessorTypeError(forced_type) return processor
def find_by_fileext(fileext, prs): """ :param fileext: File extension :param prs: A list of :class:`anyconfig.models.processor.Processor` classes :return: A list of processor class to processor files with given extension :raises: UnknownFileTypeError """ def pred(pcls): """Predicate""" return fileext in pcls.extensions() pclss = findall_with_pred(pred, prs) if not pclss: raise UnknownFileTypeError("file extension={}".format(fileext)) return pclss # :: [Processor], never []
def find_by_maybe_file(obj, prs): """ :param obj: a file path, file or file-like object, pathlib.Path object or `~anyconfig.globals.IOInfo` (namedtuple) object :param cps_by_ext: A list of processor classes :return: An instance of most appropriate processor class to process given data :raises: UnknownFileTypeError """ if not isinstance(obj, IOInfo): obj = anyconfig.ioinfo.make(obj) processor = find_by_fileext(obj.extension, prs) if processor is None: raise UnknownFileTypeError("file extension={}".format(obj.extension)) return processor()