diff --git a/bakta/config.py b/bakta/config.py index 0c3c1695..32078c7f 100644 --- a/bakta/config.py +++ b/bakta/config.py @@ -9,6 +9,7 @@ from datetime import datetime from pathlib import Path +import bakta import bakta.constants as bc @@ -26,6 +27,7 @@ debug = None # input / output configuration +version = bakta.__version__ db_path = None db_info = None tmp_path = None diff --git a/bakta/db.py b/bakta/db.py index fdd9e808..64a6ce5b 100644 --- a/bakta/db.py +++ b/bakta/db.py @@ -86,10 +86,10 @@ def check(db_path: Path) -> dict: log.info('detected: major=%i, minor=%i, type=%s, date=%s', db_info['major'], db_info['minor'], db_info['type'], db_info['date']) if(db_info['major'] < bakta.__db_schema_version__): log.error('wrong database version detected! required=%i, detected=%i', bakta.__db_schema_version__, db_info['major']) - sys.exit(f"ERROR: wrong database version detected!\nBakta version {bakta.__version__} requires database version {bakta.__db_schema_version__}.x, but {db_info['major']}.{db_info['minor']} was detected. Please, update the database from https://doi.org/10.5281/zenodo.4247253") + sys.exit(f"ERROR: wrong database version detected!\nBakta version {cfg.version} requires database version {bakta.__db_schema_version__}.x, but {db_info['major']}.{db_info['minor']} was detected. Please, update the database from https://doi.org/10.5281/zenodo.4247253") elif(db_info['major'] > bakta.__db_schema_version__): log.error('wrong database version detected! required=%i, detected=%i', bakta.__db_schema_version__, db_info['major']) - sys.exit(f"ERROR: wrong database version detected!\nBakta version {bakta.__version__} requires database version {bakta.__db_schema_version__}.x, but {db_info['major']}.{db_info['minor']} was detected. Please, update Bakta or download a compatible database version from https://doi.org/10.5281/zenodo.4247253") + sys.exit(f"ERROR: wrong database version detected!\nBakta version {cfg.version} requires database version {bakta.__db_schema_version__}.x, but {db_info['major']}.{db_info['minor']} was detected. Please, update Bakta or download a compatible database version from https://doi.org/10.5281/zenodo.4247253") required_db_files = FILE_NAMES required_db_files.append('psc.dmnd' if db_info['type'] == 'full' else 'pscc.dmnd') @@ -150,7 +150,7 @@ def main(): parser = bu.init_parser(sub_command='_db') group_runtime = parser.add_argument_group('Runtime & auxiliary options') group_runtime.add_argument('--help', '-h', action='help', help='Show this help message and exit') - group_runtime.add_argument('--version', '-V', action='version', version=f'%(prog)s {bakta.__version__}') + group_runtime.add_argument('--version', '-V', action='version', version=f'%(prog)s {cfg.version}') subparsers = parser.add_subparsers(dest='subcommand', help='sub-command help') parser_list = subparsers.add_parser('list', help='List available database versions') # add list sub-command options @@ -166,7 +166,7 @@ def main(): parser_update.add_argument('--tmp-dir', '-t', action='store', dest='tmp_dir', default=Path.cwd(), help='Temporary directory to download & extract (default = current working directory)') args = parser.parse_args() - print(f'Bakta software version: {bakta.__version__}') + print(f'Bakta software version: {cfg.version}') print(f'Required database schema version: {bakta.__db_schema_version__}\n') if(args.subcommand == 'list'): versions = fetch_db_versions() diff --git a/bakta/io/gff.py b/bakta/io/gff.py index 69e7d8b1..b0ad0e95 100644 --- a/bakta/io/gff.py +++ b/bakta/io/gff.py @@ -27,7 +27,7 @@ def write_features(data: dict, features_by_sequence: Dict[str, dict], gff3_path: fh.write(f"# organism {data['genome']['taxon']}\n") fh.write('# Annotated with Bakta\n') - fh.write(f'# Software: v{bakta.__version__}\n') + fh.write(f'# Software: v{cfg.version}\n') fh.write(f"# Database: v{cfg.db_info['major']}.{cfg.db_info['minor']}, {cfg.db_info['type']}\n") fh.write(f'# DOI: {bc.BAKTA_DOI}\n') fh.write(f'# URL: {bc.BAKTA_URL}\n') diff --git a/bakta/io/insdc.py b/bakta/io/insdc.py index 1962e2f0..e8054e7c 100644 --- a/bakta/io/insdc.py +++ b/bakta/io/insdc.py @@ -9,7 +9,6 @@ from Bio.Seq import Seq from Bio.SeqFeature import SeqFeature, FeatureLocation, CompoundLocation, AfterPosition, BeforePosition -import bakta import bakta.config as cfg import bakta.constants as bc import bakta.features.annotation as ba @@ -27,7 +26,7 @@ def build_biopython_sequence_list(data: dict, features: Sequence[dict]): sequence_features = [feat for feat in features if feat['sequence'] == seq['id']] if 'sequence' in features[0] else [feat for feat in features if feat['contig'] == seq['id']] # <1.10.0 compatibility comment = ( 'Annotated with Bakta', - f"Software: v{bakta.__version__}\n", + f"Software: v{cfg.version}\n", f"Database: v{cfg.db_info['major']}.{cfg.db_info['minor']}, {cfg.db_info['type']}\n", f'DOI: {bc.BAKTA_DOI}\n', f'URL: {bc.BAKTA_URL}\n', @@ -49,7 +48,7 @@ def build_biopython_sequence_list(data: dict, features: Sequence[dict]): sequence_annotations = { 'molecule_type': 'DNA', 'source': data['genome'].get('taxon', ''), - 'date': date.today().strftime('%d-%b-%Y').upper(), + 'date': cfg.run_end.strftime('%d-%b-%Y').upper(), 'topology': seq['topology'], 'data_file_division': 'HGT' if seq['type'] == bc.REPLICON_CONTIG else 'BCT', # 'accession': '*', # hold back until EMBL output bug is fixed in BioPython (https://github.com/biopython/biopython/pull/3572) @@ -140,7 +139,7 @@ def build_biopython_sequence_list(data: dict, features: Sequence[dict]): else: inference.append('ab initio prediction:Prodigal:2.6') else: - inference.append(f"ab initio prediction:Bakta:{'.'.join(bakta.__version__.split('.')[0:2])}") + inference.append(f"ab initio prediction:Bakta:{'.'.join(cfg.version.split('.')[0:2])}") if('ncbi_nrp_id' in feature.get('ups', {})): nrp_id = feature['ups']['ncbi_nrp_id'] inference.append(f'similar to AA sequence:{bc.DB_XREF_REFSEQ_NRP}:{nrp_id}') diff --git a/bakta/io/json.py b/bakta/io/json.py index a10cdc84..eda81652 100644 --- a/bakta/io/json.py +++ b/bakta/io/json.py @@ -32,7 +32,7 @@ def write_json(data: dict, features: Sequence[dict], json_path: Path): psc.pop('db_xrefs') version = OrderedDict() - version['bakta'] = bakta.__version__ + version['bakta'] = cfg.version version['db'] = { 'version': f"{cfg.db_info['major']}.{cfg.db_info['minor']}", 'type': cfg.db_info['type'] diff --git a/bakta/io/tsv.py b/bakta/io/tsv.py index 639e1cdf..ad5603e4 100644 --- a/bakta/io/tsv.py +++ b/bakta/io/tsv.py @@ -22,7 +22,7 @@ def write_features(sequences: Sequence[dict], features_by_sequence: Dict[str, di with tsv_path.open('wt') as fh: fh.write('# Annotated with Bakta\n') - fh.write(f'# Software: v{bakta.__version__}\n') + fh.write(f'# Software: v{cfg.version}\n') fh.write(f"# Database: v{cfg.db_info['major']}.{cfg.db_info['minor']}, {cfg.db_info['type']}\n") fh.write(f'# DOI: {bc.BAKTA_DOI}\n') fh.write(f'# URL: {bc.BAKTA_URL}\n') @@ -82,7 +82,7 @@ def write_feature_inferences(sequences: Sequence[dict], features_by_sequence: Di with tsv_path.open('wt') as fh: fh.write('# Annotated with Bakta\n') - fh.write(f'# Software: v{bakta.__version__}\n') + fh.write(f'# Software: v{cfg.version}\n') fh.write(f"# Database: v{cfg.db_info['major']}.{cfg.db_info['minor']}, {cfg.db_info['type']}\n") fh.write(f'# DOI: {bc.BAKTA_DOI}\n') fh.write(f'# URL: {bc.BAKTA_URL}\n') @@ -150,7 +150,7 @@ def write_protein_features(features: Sequence[dict], header_columns: Sequence[st log.info('write protein feature tsv: path=%s', tsv_path) with tsv_path.open('wt') as fh: - fh.write(f'#Annotated with Bakta (v{bakta.__version__}): https://github.com/oschwengers/bakta\n') + fh.write(f'#Annotated with Bakta (v{cfg.version}): https://github.com/oschwengers/bakta\n') fh.write(f"#Database (v{cfg.db_info['major']}.{cfg.db_info['minor']}): https://doi.org/10.5281/zenodo.4247252\n") fh.write('\t'.join(header_columns)) fh.write('\n') @@ -166,7 +166,7 @@ def write_hypotheticals(hypotheticals: Sequence[dict], tsv_path: Path): log.info('write hypothetical tsv: path=%s', tsv_path) with tsv_path.open('wt') as fh: - fh.write(f'#Annotated with Bakta v{bakta.__version__}, https://github.com/oschwengers/bakta\n') + fh.write(f'#Annotated with Bakta v{cfg.version}, https://github.com/oschwengers/bakta\n') fh.write(f"#Database v{cfg.db_info['major']}.{cfg.db_info['minor']}, https://doi.org/10.5281/zenodo.4247252\n") fh.write('#Sequence Id\tStart\tStop\tStrand\tLocus Tag\tMol Weight [kDa]\tIso El. Point\tPfam hits\tDbxrefs\n') for hypo in hypotheticals: diff --git a/bakta/json_io.py b/bakta/json_io.py index ddade471..9e583411 100644 --- a/bakta/json_io.py +++ b/bakta/json_io.py @@ -38,7 +38,7 @@ def main(): arg_group_general.add_argument('--verbose', '-v', action='store_true', help='Print verbose information') arg_group_general.add_argument('--debug', action='store_true', help='Run Bakta in debug mode. Temp data will not be removed.') arg_group_general.add_argument('--tmp-dir', action='store', default=None, dest='tmp_dir', help='Location for temporary files (default = system dependent auto detection)') - arg_group_general.add_argument('--version', '-V', action='version', version=f'%(prog)s {bakta.__version__}') + arg_group_general.add_argument('--version', '-V', action='version', version=f'%(prog)s {cfg.version}') args = parser.parse_args() ############################################################################ @@ -77,7 +77,7 @@ def main(): log.info('verbose=%s', cfg.verbose) if(cfg.verbose): - print(f'Bakta v{bakta.__version__}') + print(f'Bakta v{cfg.version}') print('Options and arguments:') print(f'\tinput: {annotation_path}') print(f'\toutput: {cfg.output_path}') @@ -103,6 +103,7 @@ def main(): sequence_features.append(feature) # set global config objects based on information from imported JSON document + cfg.version = data['version']['bakta'] cfg.db_info = { 'type': data['version']['db']['type'], 'major': data['version']['db']['version'].split('.')[0], @@ -188,7 +189,7 @@ def main(): fh_out.write(f"oriVs: {len([feat for feat in features if feat['type'] == bc.FEATURE_ORIV])}\n") fh_out.write(f"oriTs: {len([feat for feat in features if feat['type'] == bc.FEATURE_ORIT])}\n") fh_out.write('\nBakta:\n') - fh_out.write(f'Software: v{bakta.__version__}\n') + fh_out.write(f'Software: v{cfg.version}\n') fh_out.write(f"Database: v{cfg.db_info['major']}.{cfg.db_info['minor']}, {cfg.db_info['type']}\n") fh_out.write('DOI: 10.1099/mgen.0.000685\n') fh_out.write('URL: github.com/oschwengers/bakta\n') diff --git a/bakta/main.py b/bakta/main.py index cbcd6689..59fe8219 100755 --- a/bakta/main.py +++ b/bakta/main.py @@ -58,7 +58,7 @@ def main(): cfg.db_info = db.check(cfg.db_path) bu.test_dependencies() if(cfg.verbose): - print(f'Bakta v{bakta.__version__}') + print(f'Bakta v{cfg.version}') print('Options and arguments:') print(f'\tinput: {cfg.genome_path}') print(f"\tdb: {cfg.db_path}, version {cfg.db_info['major']}.{cfg.db_info['minor']}, {cfg.db_info['type']}") @@ -614,7 +614,7 @@ def main(): fh_out.write(f"oriVs: {len([feat for feat in features if feat['type'] == bc.FEATURE_ORIV])}\n") fh_out.write(f"oriTs: {len([feat for feat in features if feat['type'] == bc.FEATURE_ORIT])}\n") fh_out.write('\nBakta:\n') - fh_out.write(f'Software: v{bakta.__version__}\n') + fh_out.write(f'Software: v{cfg.version}\n') fh_out.write(f"Database: v{cfg.db_info['major']}.{cfg.db_info['minor']}, {cfg.db_info['type']}\n") fh_out.write('DOI: 10.1099/mgen.0.000685\n') fh_out.write('URL: github.com/oschwengers/bakta\n') diff --git a/bakta/plot.py b/bakta/plot.py index b3034823..080a7d9e 100644 --- a/bakta/plot.py +++ b/bakta/plot.py @@ -99,7 +99,7 @@ def main(): arg_group_general.add_argument('--verbose', '-v', action='store_true', help='Print verbose information') arg_group_general.add_argument('--debug', action='store_true', help='Run Bakta in debug mode. Temp data will not be removed.') arg_group_general.add_argument('--tmp-dir', action='store', default=None, dest='tmp_dir', help='Location for temporary files (default = system dependent auto detection)') - arg_group_general.add_argument('--version', action='version', version=f'%(prog)s {bakta.__version__}') + arg_group_general.add_argument('--version', action='version', version=f'%(prog)s {cfg.version}') args = parser.parse_args() ############################################################################ @@ -163,7 +163,7 @@ def main(): bu.test_dependencies() if(cfg.verbose): - print(f'Bakta v{bakta.__version__}') + print(f'Bakta v{cfg.version}') print('Options and arguments:') print(f'\tinput: {annotation_path}') if(args.config): print(f'\tconfig: {args.config}') diff --git a/bakta/proteins.py b/bakta/proteins.py index f0485d25..50732e5b 100644 --- a/bakta/proteins.py +++ b/bakta/proteins.py @@ -51,7 +51,7 @@ def main(): arg_group_general.add_argument('--debug', action='store_true', help='Run Bakta in debug mode. Temp data will not be removed.') arg_group_general.add_argument('--threads', '-t', action='store', type=int, default=0, help='Number of threads to use (default = number of available CPUs)') arg_group_general.add_argument('--tmp-dir', action='store', default=None, dest='tmp_dir', help='Location for temporary files (default = system dependent auto detection)') - arg_group_general.add_argument('--version', '-V', action='version', version=f'%(prog)s {bakta.__version__}') + arg_group_general.add_argument('--version', '-V', action='version', version=f'%(prog)s {cfg.version}') args = parser.parse_args() ############################################################################ @@ -108,7 +108,7 @@ def main(): bu.test_dependencies() if(cfg.verbose): - print(f'Bakta v{bakta.__version__}') + print(f'Bakta v{cfg.version}') print('Options and arguments:') print(f'\tinput: {aa_path}') print(f"\tdb: {cfg.db_path}, version {cfg.db_info['major']}.{cfg.db_info['minor']}") diff --git a/bakta/utils.py b/bakta/utils.py index 14e87dee..83e267bc 100644 --- a/bakta/utils.py +++ b/bakta/utils.py @@ -54,7 +54,7 @@ def init_parser(sub_command: str=''): parser = argparse.ArgumentParser( prog=f'bakta{sub_command}', description='Rapid & standardized annotation of bacterial genomes, MAGs & plasmids', - epilog=f'Version: {bakta.__version__}\nDOI: {bc.BAKTA_DOI}\nURL: github.com/oschwengers/bakta\n\nCitation:\n{bc.BAKTA_CITATION}', + epilog=f'Version: {cfg.version}\nDOI: {bc.BAKTA_DOI}\nURL: github.com/oschwengers/bakta\n\nCitation:\n{bc.BAKTA_CITATION}', formatter_class=argparse.RawDescriptionHelpFormatter, add_help=False ) @@ -115,7 +115,7 @@ def parse_arguments(): arg_group_general.add_argument('--debug', action='store_true', help='Run Bakta in debug mode. Temp data will not be removed.') arg_group_general.add_argument('--threads', '-t', action='store', type=int, default=0, help='Number of threads to use (default = number of available CPUs)') arg_group_general.add_argument('--tmp-dir', action='store', default=None, dest='tmp_dir', help='Location for temporary files (default = system dependent auto detection)') - arg_group_general.add_argument('--version', action='version', version=f'%(prog)s {bakta.__version__}') + arg_group_general.add_argument('--version', action='version', version=f'%(prog)s {cfg.version}') return parser.parse_args() @@ -127,7 +127,7 @@ def setup_logger(output_path: Path, prefix: str, args: Namespace): datefmt='%H:%M:%S', level=logging.DEBUG if args.debug else logging.INFO ) - log.info('version=%s', bakta.__version__) + log.info('version=%s', cfg.version) log.info('developer: Oliver Schwengers, github.com/oschwengers') log.info('command: %s', ' '.join(sys.argv)) log.info('local time: %s', datetime.now().strftime('%Y-%m-%d %H:%M:%S'))