Source code for papis.format
import logging
from typing import Optional, Union, Any, Dict
import papis.config
import papis.plugin
import papis.document
from papis.document import Document
FormatDocType = Union[Document, Dict[str, Any]]
logger = logging.getLogger("format")
_FORMATER = None # type: Optional[Formater]
class InvalidFormatterValue(Exception):
pass
class Formater:
def format(self,
fmt: str,
doc: FormatDocType,
doc_key: str = "",
additional: Dict[str, Any] = {}) -> str:
"""
:param fmt: Python-like format string.
:type fmt: str
:param doc: Papis document
:type doc: FormatDocType
:param doc_key: Name of the document in the format string
:type doc: str
:param additional: Additional named keys available to the format string
:returns: Formated string
:rtype: str
"""
...
[docs]class PythonFormater(Formater):
"""Construct a string using a pythonic format string and a document.
You can activate this formatter by setting ``formater = python``.
"""
def format(self,
fmt: str,
doc: FormatDocType,
doc_key: str = "",
additional: Dict[str, Any] = {}) -> str:
doc_name = doc_key or papis.config.getstring("format-doc-name")
fdoc = Document()
fdoc.update(doc)
try:
return fmt.format(**{doc_name: fdoc}, **additional)
except Exception as exception:
return str(exception)
[docs]class Jinja2Formater(Formater):
"""Construct a Jinja2 formated string.
You can activate this formatter by setting ``formater = jinja2``.
"""
def __init__(self) -> None:
try:
import jinja2
except ImportError:
logger.exception("""
You're trying to format strings using jinja2
Jinja2 is not installed by default, so just install it
pip3 install jinja2
""")
else:
self.jinja2 = jinja2
def format(self,
fmt: str,
doc: FormatDocType,
doc_key: str = "",
additional: Dict[str, Any] = {}) -> str:
doc_name = doc_key or papis.config.getstring("format-doc-name")
try:
return str(self.jinja2
.Template(fmt)
.render(**{doc_name: doc}, **additional))
except Exception as exception:
return str(exception)
def _extension_name() -> str:
return "papis.format"
def get_formater() -> Formater:
"""Get the formatter named 'name' declared as a plugin"""
global _FORMATER
if _FORMATER is None:
name = papis.config.getstring("formater")
try:
_FORMATER = papis.plugin.get_extension_manager(
_extension_name())[name].plugin()
except KeyError:
logger.error("Invalid formatter: %s", name)
raise InvalidFormatterValue(
"Registered formatters are: %s",
papis.plugin.get_available_entrypoints(_extension_name()))
logger.debug("Getting %s", name)
return _FORMATER
def format(fmt: str,
doc: FormatDocType,
doc_key: str = "",
additional: Dict[str, Any] = {}) -> str:
formater = get_formater()
return formater.format(fmt, doc, doc_key=doc_key, additional=additional)