From 38fae60b8beaf9c7b37c65325d2d285e62b6cb85 Mon Sep 17 00:00:00 2001 From: jvoisin Date: Fri, 18 May 2018 23:52:40 +0200 Subject: Rename some files to simplify packaging - the `src` folder is now `libmat2` - the `main.py` script is now `mat2.py` --- libmat2/parser_factory.py | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 libmat2/parser_factory.py (limited to 'libmat2/parser_factory.py') diff --git a/libmat2/parser_factory.py b/libmat2/parser_factory.py new file mode 100644 index 0000000..dbe68b9 --- /dev/null +++ b/libmat2/parser_factory.py @@ -0,0 +1,42 @@ +import os +import mimetypes +import importlib +import pkgutil +from typing import TypeVar + +from . import abstract, unsupported_extensions + + +T = TypeVar('T', bound='abstract.AbstractParser') + +# This loads every parser in a dynamic way +for module_loader, name, ispkg in pkgutil.walk_packages('.libmat2'): + if not name.startswith('libmat2.'): + continue + elif name == 'libmat2.abstract': + continue + importlib.import_module(name) + + +def _get_parsers() -> list: + """ Get all our parsers!""" + def __get_parsers(cls): + return cls.__subclasses__() + \ + [g for s in cls.__subclasses__() for g in __get_parsers(s)] + return __get_parsers(abstract.AbstractParser) + + +def get_parser(filename: str) -> (T, str): + mtype, _ = mimetypes.guess_type(filename) + + _, extension = os.path.splitext(filename) + if extension in unsupported_extensions: + return None, mtype + + for c in _get_parsers(): + if mtype in c.mimetypes: + try: + return c(filename), mtype + except ValueError: + return None, mtype + return None, mtype -- cgit v1.3