5bbd1d38c9271ba6319a46f0827ff90ec8c25efd ceisenhart Thu Oct 22 19:25:39 2015 -0700 Adding a check to the argparse module that causes the program to spit help with no arguments. This replicates the C code style. Refs #16156 diff --git src/utils/newPythonProg/newPythonProg.c src/utils/newPythonProg/newPythonProg.c index cde87f0..319c951 100644 --- src/utils/newPythonProg/newPythonProg.c +++ src/utils/newPythonProg/newPythonProg.c @@ -1,107 +1,108 @@ /* newPythonProg - Make a skeleton for a new python program. */ #include "common.h" #include "portable.h" #include "dystring.h" #include "options.h" void usage() /* Explain usage and exit. */ { errAbort( "newPythonProg - Make a skeleton for a new python program\n" "usage:\n" " newPythonProg programName \"The usage statement\"\n" "options:\n" " -xxx=XXX\n" ); } /* Command line validation table. */ static struct optionSpec options[] = { {NULL, 0}, }; void makeMakefile(char *progName, char *makeName) /* Make makefile. */ { char *upLevel; //char *L; //char *myLibs; FILE *f = mustOpen(makeName, "w"); if (fileExists("../inc/common.mk")) upLevel = cloneString(".."); else if (fileExists("../../inc/common.mk")) upLevel = cloneString("../.."); else if (fileExists("../../../inc/common.mk")) upLevel = cloneString("../../.."); else if (fileExists("../../../../inc/common.mk")) upLevel = cloneString("../../../.."); else if (fileExists("../../../../../inc/common.mk")) upLevel = cloneString("../../../../.."); else { warn("WARNING: can not find inc/common.mk 1 to 4 directories up, fix the makefile"); upLevel = cloneString("../../../../.."); } fprintf(f, "normal::\n\t cp -p %s ${HOME}/bin\n\t cp -p %s ${HOME}/kent/src/pyLib/scripts\n" "test::\n\t@if test -d tests -a -s tests/makefile; then (cd tests && ${MAKE} test); \\ " "\n\telse echo \"# no tests directory (or perhaps no tests/makefile) in $(CURDIR)\"; fi" , progName, progName); fclose(f); } void writeProgram(char *fileName, char *programName, char *usage) { FILE *programFile = mustOpen(fileName, "w"); // Write the python skeleton fprintf(programFile, "#!/usr/bin/env python2.7\n# %s\n\"\"\"%s\"\"\"\n", programName, usage); fprintf(programFile, "import os\nimport sys\nimport collections\nimport argparse\n" "\n" "# import the UCSC kent python library\n" "sys.path.append(os.path.join(os.path.dirname(__file__), 'pyLib'))\n" "import common\n\n"); fprintf(programFile, "def parseArgs(args):\n \"\"\"\n Parse the command line arguments.\n \"\"\"\n parser" "= argparse.ArgumentParser(description = __doc__)\n parser.add_argument (\"inpu" "tFile\",\n help = \" The input file. \",\n type = argparse.FileType(\"r\"))\n "); fprintf(programFile, "parser.add_argument (\"outputFile\",\n help = \" The output file. \",\n type =" - "argparse.FileType(\"w\"))\n options = parser.parse_args()\n return options\n\n"); + "argparse.FileType(\"w\"))\n if (len(sys.argv) == 1):\n parser.print_help()\n" + " exit(1)\n options = parser.parse_args()\n return options\n\n"); fprintf(programFile, "def main(args):\n \"\"\"\n Initialized options and calls other functions.\n \"\"\"\n " "options = parseArgs(args)\n\nif __name__ == \"" "__main__\" : \n sys.exit(main(sys.argv))"); } void newPythonProg(char *programName, char *usage) /* newPythonProg - Make a skeleton for a new python program. */ { char fileName[512]; char dirName[512]; //char fileOnly[128]; safef(dirName, sizeof(dirName), "%s", programName); makeDir(dirName); // Stolen code from newProg safef(fileName, sizeof(fileName), "%s/%s", programName, programName); writeProgram(fileName, programName, usage); setCurrentDir(dirName); makeMakefile(programName, "makefile"); // Change file permissions char cmd[1024]; safef(cmd, 1024, "chmod 755 %s",programName); mustSystem(cmd); } int main(int argc, char *argv[]) /* Process command line. */ { optionInit(&argc, argv, options); if (argc != 3) usage(); newPythonProg(argv[1], argv[2]); return 0; }