11"""Contains the WorkFlow class"""
22
33from datetime import datetime
4- import glob
54import importlib .resources as resources
65import os
76import shutil
109import urllib .request
1110import urllib .error
1211import yaml
13- from rich import box
1412from rich .table import Table
1513from harpy .common .conda import create_conda_recipes
16- from harpy .common .file_ops import filepath , gzip_file , purge_empty_logs
17- from harpy .common .printing import CONSOLE , print_error
14+ from harpy .common .file_ops import filepath , last_sm_log , purge_empty_logs
15+ from harpy .common .printing import CONSOLE , harpy_table , print_error
1816from harpy .common .launch import launch_snakemake
1917from harpy .common .summaries import Summary
2018
@@ -30,7 +28,6 @@ def __init__(self, name, snakefile, outdir, container, quiet, inputdir = False):
3028 self .name : str = name
3129 self .output_directory : str = outdir
3230 self .workflow_directory = os .path .join (outdir , 'workflow' )
33- self .snakemake_logfile : str = self .snakemake_log (outdir , name )
3431 self .snakemake_cmd_absolute : str = ""
3532 self .snakemake_cmd_relative : str = ""
3633 self .snakefile : str = snakefile
@@ -48,16 +45,6 @@ def __init__(self, name, snakefile, outdir, container, quiet, inputdir = False):
4845 self .summary : str = name .replace ("_" ,"." ).replace (" " ,"." ) + ".summary"
4946 self .summary_text : str = ""
5047
51- def snakemake_log (self , outdir : str , workflow : str ) -> str :
52- """Return a snakemake logfile name. Iterates logfile run number if one exists."""
53- attempts = glob .glob (os .path .join (outdir , "logs" , "snakemake" , "*.log*" ))
54- timestamp = datetime .now ().strftime ("%d_%m_%Y" ) + ".log"
55- if not attempts :
56- os .makedirs (os .path .join (outdir , "logs" , "snakemake" ), exist_ok = True )
57- return os .path .join ("logs" , "snakemake" , f"{ workflow } .1.{ timestamp } " )
58- increment = sorted ([int (i .split ("." )[1 ]) for i in attempts ])[- 1 ] + 1
59- return os .path .join ("logs" , "snakemake" , f"{ workflow } .{ increment } .{ timestamp } " )
60-
6148 def setup_snakemake (self , threads : int , hpc : str | None = None , sm_extra : str | None = None ):
6249 """
6350 Sets up the snakemake command based on hpc, threads, and extra snakemake params.
@@ -214,7 +201,6 @@ def write_workflow_config(self) -> None:
214201 are expected to be a dict
215202 """
216203 self .config ["snakemake" ] = {
217- "log" : self .snakemake_logfile ,
218204 "absolute" : self .snakemake_cmd_absolute ,
219205 "relative" : self .snakemake_cmd_relative ,
220206 "conda_envs" : self .conda
@@ -249,13 +235,15 @@ def print_onsuccess(self):
249235 return
250236 _relpath = os .path .relpath (self .output_directory )
251237 time_text = self .time_elapsed ()
252- datatable = Table ( show_header = False , pad_edge = False , show_edge = False , padding = ( 0 , 0 ), box = box . SIMPLE )
238+ datatable = harpy_table ( )
253239 datatable .add_column ("detail" , justify = "left" , style = "green" , no_wrap = True )
254240 datatable .add_column ("value" , justify = "left" )
255241 datatable .add_row ("Duration:" , time_text )
256242 if self .summary :
257243 datatable .add_row ("Summary: " , os .path .join (_relpath , "workflow" , os .path .basename (self .summary )))
258- datatable .add_row ("Workflow Log:" , os .path .join (_relpath , "logs" , "snakemake" , os .path .basename (f"{ self .snakemake_logfile } .gz" )))
244+ _smlog = last_sm_log (self .output_directory )
245+ if _smlog :
246+ datatable .add_row ("Workflow Log:" , os .path .join (_relpath , ".snakemake" , 'log' , _smlog ))
259247 CONSOLE .rule ("[bold]Workflow Finished[/] [default dim]" + _time .strftime ('%d %b %Y @ %H:%M' ), style = "green" )
260248 CONSOLE .print (datatable )
261249
@@ -283,12 +271,10 @@ def launch(self, absolute:bool = False):
283271 cmd = self .snakemake_cmd_absolute if absolute else self .snakemake_cmd_relative
284272
285273 try :
286- launch_snakemake (cmd , self .output_directory , self .snakemake_logfile , self . quiet )
274+ launch_snakemake (cmd , self .output_directory , self .quiet )
287275 finally :
288276 with open (os .path .join (self .output_directory , "workflow" , f"{ self .name .replace ('_' ,'.' )} .summary" ), "w" ) as f_out :
289277 f_out .write (Summary (self .config ).get_text ())
290278 self .purge_empty_logs ()
291- if os .path .exists (self .snakemake_logfile ):
292- gzip_file (os .path .join (self .output_directory , self .snakemake_logfile ))
293279
294280 self .print_onsuccess ()
0 commit comments