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()
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)
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()