Writing your own commands¶
Maybe you will be interested in helping us in the future by sharing your own commands. We provide an example below of the development of a very basic command that prints a GTF file.
Just do the following things to declare a new command named ‘print_gtf’:
Write a script using the template provided below. This script can be run as a stand-alone script or as a gtftk plugin.
Add this script to the gtftk/plugins or ~/.gtftk/plugins/ directories.
Call gtftk -u to update the plugin list. A new command should be available upon gtftk -h.
You can propose new commands by sending us pull requests.
#!/usr/bin/env python
"""
This is the doc about the command that will appear when gtftk my_command -h
is called...
"""
import sys
import argparse
from pygtftk.cmd_object import CmdObject
from pygtftk.gtf_interface import GTF
from pygtftk import arg_formatter
#-------------------------------------------------------------------------
# NOTES: Just place this file into ~/.gtftk/plugins
# and ask for:
# gtftk --update-plugins
# gtftk will load the plugin next time it is called.
#-------------------------------------------------------------------------
#-------------------------------------------------------------------------
# Message can be of type "INFO" (default), "WARNING" or "ERROR"
# When using message it will adapt to the user-declared level of
# verbosity
#-------------------------------------------------------------------------
from pygtftk.utils import message
#-------------------------------------------------------------------------
# Any temporary file created using the make_tmp_file function
# will be deleted upon exit or may be kept into a target directory (see -K
# command-wise argument)
# This command should thus be used to create any temporary file.
#-------------------------------------------------------------------------
from pygtftk.utils import make_tmp_file
#-------------------------------------------------------------------------
# Command information
#-------------------------------------------------------------------------
__notes__ = """
-- A note that will appear when 'gtftk my_command -h' will be called.
-- Another note. If you want to refer to long form arguments use '\'. e.g -\-distance.
"""
#-------------------------------------------------------------------------
# First define the function/command arguments.
# Note that the syntax is the same that would be used for a regular program
# implementing an argument parser.
# Make use as possible of argparse.FileType and more complexes types as
# found in gtftk.arg_formatter.
#-------------------------------------------------------------------------
def make_parser():
parser = argparse.ArgumentParser(add_help=True)
parser_grp = parser.add_argument_group('Arguments')
parser_grp.add_argument('-i', '--inputfile',
help="Path to the GTF file. Default to STDIN",
default=sys.stdin,
metavar="GTF",
type=arg_formatter.FormattedFile(mode='r', file_ext=('gtf', 'gtf.gz')))
parser_grp.add_argument('-o', '--outputfile',
help="Output file.",
default=sys.stdout,
metavar="GTF",
type=arg_formatter.FormattedFile(mode='w', file_ext=('gtf')))
return parser
#-------------------------------------------------------------------------
# Now we declare a main function, as would be done
# for a regular program
#-------------------------------------------------------------------------
# NB: The verbosity, tmp_dir=None and logger_file are mandatory arguments
def print_gtf(inputfile=None,
outputfile=None,
tmp_dir=None,
logger_file=None,
verbosity=0):
"""This function will only print a GTF..."""
message("Reading GTF")
gtf = GTF(inputfile)
gtf.write(outputfile)
#-------------------------------------------------------------------------
# Now we check if the python interpreter is running this module
# as the main program or whether it is called by the plugin manager.
#-------------------------------------------------------------------------
def main():
"""The main function."""
args = make_parser().parse_args()
args = dict(args.__dict__)
print_gtf(**args)
if __name__ == '__main__':
main()
else:
# Just declare a new command object
# That will call the command manager.
# With the user-passed arguments.
# Available groups are: editing, information, selection, conversion,
# coordinates, annotation, sequences, coverage,
# and miscellaneous.
cmd = CmdObject(name="print_gtf",
message="Print a GTF",
parser=make_parser(),
fun=os.path.abspath(__file__),
group="miscellaneous",
desc=__doc__,
notes=__notes__)