Beispiel #1
0
    def __init__(
        self,
        path,
        job,
        caption,
        env,
        category,
        workflow,
        wildcards_overwrite=None,
        mode_embedded=True,
        aux_files=None,
        name_overwrite=None,
        labels=None,
    ):
        self.labels = labels
        self.name_overwrite = name_overwrite
        self.mode_embedded = mode_embedded
        self.path = path
        self.target = os.path.basename(path)
        self.size = os.path.getsize(self.path)
        self.size_mb = f"{self.size / 1e6:.2g} MB"
        logger.info(f"Adding {self.name} ({self.size_mb}).")
        self.raw_caption = caption
        self.mime, _ = mime_from_file(self.path)
        self.workflow = workflow

        h = hashlib.sha256()
        h.update(path.encode())

        self.id = h.hexdigest()
        self.job = job
        self._wildcards = (job.wildcards if wildcards_overwrite is None else
                           wildcards_overwrite)
        self.wildcards = logging.format_wildcards(self._wildcards)
        self.params = (logging.format_dict(job.params).replace("\n",
                                                               r"\n").replace(
                                                                   '"', r"\""))
        self.category = category

        self.aux_files = aux_files or []

        self.data_uri = self._data_uri()
Beispiel #2
0
 def __init__(self, path, job, caption, env, category):
     self.path = path
     self.target = os.path.basename(path)
     self.size = os.path.getsize(self.path)
     logger.info("Adding {} ({:.2g} MB).".format(self.name, self.size / 1e6))
     self.raw_caption = caption
     self.mime, _ = mime_from_file(self.path)
     self.id = uuid.uuid4()
     self.job = job
     self.wildcards = logging.format_wildcards(job.wildcards)
     self.params = logging.format_dict(job.params)
     self.png_uri = None
     self.category = category
     if self.is_img:
         convert = shutil.which("convert")
         if convert is not None:
             try:
                 # 2048 aims at a reasonable balance between what displays
                 # can show in a png-preview image and what renders quick
                 # into a small enough png
                 max_width = "2048"
                 max_height = "2048"
                 # '>' means only larger images scaled down to within max-dimensions
                 max_spec = max_width + "x" + max_height + ">"
                 png = sp.check_output(
                     ["convert", "-resize", max_spec, self.path, "png:-"],
                     stderr=sp.PIPE,
                 )
                 uri = data_uri(
                     png, os.path.basename(self.path) + ".png", mime="image/png"
                 )
                 self.png_uri = uri
             except sp.CalledProcessError as e:
                 logger.warning(
                     "Failed to convert image to png with "
                     "imagemagick convert: {}".format(e.stderr)
                 )
         else:
             logger.warning(
                 "Command convert not in $PATH. Install "
                 "imagemagick in order to have embedded "
                 "images and pdfs in the report."
             )
     if self.is_table:
         if self.size > 1e6:
             logger.warning(
                 "Table {} >1MB. Rendering as generic file.".format(self.path)
             )
         else:
             with open(self.path) as table:
                 dialect = None
                 for prefix in range(10, 17):
                     try:
                         table.seek(0)
                         dialect = csv.Sniffer().sniff(table.read(prefix))
                         break
                     except csv.Error:
                         pass
                     except UnicodeDecodeError:
                         # table is not readable as UTF-8
                         break
                 if dialect is None:
                     logger.warning(
                         "Failed to infer CSV/TSV dialect from table {}. "
                         "Rendering as generic file.".format(self.path)
                     )
                 else:
                     table.seek(0)
                     reader = csv.reader(table, dialect)
                     columns = next(reader)
                     table = map(lambda row: list(map(num_if_possible, row)), reader)
                     template = env.get_template("table.html")
                     html = template.render(
                         columns=columns, table=table, name=self.name
                     ).encode()
                     self.mime = "text/html"
                     self.path = os.path.basename(self.path) + ".html"
                     self.data_uri = data_uri(html, self.path, mime=self.mime)
                     return
     # fallback
     self.data_uri = data_uri_from_file(path)
Beispiel #3
0
    def __init__(
        self,
        path,
        job,
        caption,
        env,
        category,
        wildcards_overwrite=None,
        mode_embedded=True,
    ):
        self.mode_embedded = mode_embedded
        self.path = path
        self.target = os.path.basename(path)
        self.size = os.path.getsize(self.path)
        logger.info("Adding {} ({:.2g} MB).".format(self.name,
                                                    self.size / 1e6))
        self.raw_caption = caption
        self.mime, _ = mime_from_file(self.path)

        h = hashlib.sha256()
        h.update(path.encode())

        self.id = h.hexdigest()
        self.job = job
        self._wildcards = (job.wildcards if wildcards_overwrite is None else
                           wildcards_overwrite)
        self.wildcards = logging.format_wildcards(self._wildcards)
        self.params = (logging.format_dict(job.params).replace("\n",
                                                               r"\n").replace(
                                                                   '"', r"\""))
        self.category = category

        self.table_content = None
        if self.is_table:
            if self.size > 1e6:
                logger.warning(
                    "Table {} >1MB. Rendering as generic file.".format(
                        self.path))
            else:
                with open(self.path) as table:
                    dialect = None
                    for prefix in range(10, 17):
                        try:
                            table.seek(0)
                            dialect = csv.Sniffer().sniff(table.read(prefix))
                            break
                        except csv.Error:
                            pass
                        except UnicodeDecodeError:
                            # table is not readable as UTF-8
                            break
                    if dialect is None:
                        logger.warning(
                            "Failed to infer CSV/TSV dialect from table {}. "
                            "Rendering as generic file.".format(self.path))
                    else:
                        table.seek(0)
                        reader = csv.reader(table, dialect)
                        columns = next(reader)
                        table = map(
                            lambda row: list(map(num_if_possible, row)),
                            reader)
                        template = env.get_template("table.html")
                        html = template.render(columns=columns,
                                               table=table,
                                               name=self.name).encode()

                        self.table_content = html
                        self.mime = "text/html"
                        self.path = os.path.basename(self.path) + ".html"

        self.data_uri = self._data_uri()
        self.png_uri = self._png_uri()