44import sys
55import textwrap
66import tempfile
7- import os
8- import platform
9- import subprocess
10- import shutil
11- import webbrowser
127from argparse import ArgumentParser , RawDescriptionHelpFormatter
138from .make_wide import make_wide
14- from loguru import logger
9+ # from loguru import logger
1510
1611
1712KWARGS = dict (
3227 --------
3328 $ draw -i TRE.nwk -a
3429 $ draw -i TRE.nwk -f png -v
35- $ draw -i TRE.nwk -f html -v -k ...
36- $ draw -i TRE.nwk -f pdf -o /tmp/DRAWING
37- $ draw -i TRE.nwk -v -N fill=red -E stroke=pink -T font-size=10px
30+ $ draw -i TRE.nwk -f html -v -ts c
31+ $ draw -i TRE.nwk -f pdf -o /tmp/DRAWING -ns 8 -nc teal -ta true
32+ $ draw -i TRE.nwk -v -N fill=red -E stroke=pink -T font-size=10px fill=blue
3833 $ root -i TRE.nwk -n R | draw -i - -v
3934 """ )
4035)
@@ -52,24 +47,31 @@ def get_parser_draw(parser: ArgumentParser | None = None) -> ArgumentParser:
5247 parser = ArgumentParser (** KWARGS )
5348
5449 # path args
55- parser .add_argument ("-i" , "--input" , type = Path , metavar = "path" , required = True , help = "input tree file (nwk, nex or nhx)" )
56- parser .add_argument ("-o" , "--output" , type = Path , metavar = "path" , help = "optional basename of outfile path. If None prints to STDOUT " )
50+ parser .add_argument ("-i" , "--input" , type = Path , metavar = "path" , required = True , help = "input tree file (nwk, nex or nhx) or stdin (-) " )
51+ parser .add_argument ("-o" , "--output" , type = Path , metavar = "path" , help = "optional basename of output [/tmp/toytree]. " )
5752 # option
5853 parser .add_argument ("-a" , "--ascii" , action = "store_true" , help = "print ascii tree (overrides other draw args)" )
59- parser .add_argument ("-f" , "--format" , choices = ["html" , "svg" , "pdf" , "png" ], default = "png" , help = "file format of drawing [png]" )
60- parser .add_argument ("-v" , "--view" , type = str , metavar = "app" , const = "auto" , nargs = "?" , help = "open drawing in default viewer, or provide an app name" )
6154 parser .add_argument ("-e" , "--ladderize" , action = "store_true" , help = "ladderize the tree" )
62- parser .add_argument ("-k" , "--kwargs" , type = str , metavar = "str" , nargs = "*" , help = "any supported toytree.draw kwargs as 'key=val'" )
55+ parser .add_argument ("-f" , "--format" , choices = ["html" , "svg" , "pdf" , "png" ], default = "pdf" , help = "file format of drawing [pdf]" )
56+ parser .add_argument ("-v" , "--view" , type = str , metavar = "app" , const = "auto" , nargs = "?" , help = "open drawing in default viewer, or provide an app name" )
57+ # parser.add_argument("-k", "--kwargs", type=str, metavar="str", nargs="*", help="any supported toytree.draw kwargs as 'key=val'")
6358 parser .add_argument ("-I" , "--internal-labels" , type = str , metavar = "str" , help = "parse internal node feature (e.g., support) [auto]" )
6459 parser .add_argument ("-l" , "--log-level" , type = str , metavar = "level" , default = "INFO" , help = "stderr logging level (DEBUG, [INFO], WARNING, ERROR)" )
6560
66- parser .add_argument ("-ts" , "--tree-style" , type = str , metavar = "str" , help = "base tree style [[None], 'r', 'c', 's', 'o', 'b']" )
67- parser .add_argument ("-N" , "--node-style" , type = str , metavar = "str" , nargs = "+" , help = "node style args" )
68- parser .add_argument ("-E" , "--edge-style" , type = str , metavar = "str" , nargs = "+" , help = "edge style args" )
69- parser .add_argument ("-T" , "--tip-labels-style" , type = str , metavar = "str" , nargs = "+" , help = "tip labels style args" )
70- parser .add_argument ("-ns" , "--node-sizes" , type = int , metavar = "int" , nargs = "+" , default = [6 ], help = "node sizes" )
71- parser .add_argument ("-nc" , "--node-colors" , type = str , metavar = "str" , nargs = "+" , default = ["#262626" ], help = "node colors" )
72- parser .add_argument ("-tl" , "--tip-labels-align" , type = bool , metavar = "bool" , nargs = "+" , help = "align tip labels" )
61+ p = parser .add_argument_group (title = "optional style args" )
62+ p .add_argument ("-wi" , "--width" , type = int , metavar = "int" , help = "width in pixel units" )
63+ p .add_argument ("-he" , "--height" , type = int , metavar = "int" , help = "height n pixel units" )
64+ p .add_argument ("-la" , "--layout" , type = str , metavar = "str" , help = "layout [['r'], 'l', 'u', 'd', 'c', 'c0-180', 'un']" )
65+ p .add_argument ("-ts" , "--tree-style" , type = str , metavar = "str" , help = "base tree style [['n'], 'r', 'c', 's', 'o', 'b']" )
66+ p .add_argument ("-ta" , "--tip-labels-align" , type = bool , metavar = "bool" , nargs = "+" , help = "align tip labels" )
67+ p .add_argument ("-ns" , "--node-sizes" , type = int , metavar = "int" , nargs = "+" , default = [None ], help = "node sizes" )
68+ p .add_argument ("-nc" , "--node-colors" , type = str , metavar = "str" , nargs = "+" , default = [None ], help = "node colors" )
69+ p .add_argument ("-et" , "--edge-type" , type = str , metavar = "str" , choices = ["p" , "c" , "b" ], help = "edge type ([phylogram], cladogram, bezier)" )
70+
71+ p .add_argument ("-N" , "--node-style" , type = str , metavar = "str" , nargs = "+" , help = "node style args" )
72+ p .add_argument ("-E" , "--edge-style" , type = str , metavar = "str" , nargs = "+" , help = "edge style args" )
73+ p .add_argument ("-T" , "--tip-labels-style" , type = str , metavar = "str" , nargs = "+" , help = "tip labels style args" )
74+
7375 # parser.add_argument("-L", "--log-file", type=Path, metavar="path", help="append stderr log to a file")
7476 return parser
7577
@@ -79,6 +81,12 @@ def open_with_default_viewer(path: str) -> bool:
7981 """Try to open a file with the system's default app.
8082 Returns True on (likely) success, False if we had no good option.
8183 """
84+ import os
85+ import platform
86+ import subprocess
87+ import shutil
88+ import webbrowser
89+
8290 path = os .path .abspath (path )
8391 system = platform .system ()
8492
@@ -111,7 +119,7 @@ def open_with_default_viewer(path: str) -> bool:
111119
112120 except Exception :
113121 # You might want to log this if you have logging set up
114- logger . bind ( name = "toytree" ). error ("could not find a default viewer to open drawing file" )
122+ raise OSError ("could not find a default viewer to open drawing file" )
115123 return False
116124
117125
@@ -132,7 +140,7 @@ def run_draw(args):
132140
133141 # ascii tree drawing
134142 if args .ascii :
135- print ( tre .treenode .draw_ascii (), sys . stdout )
143+ tre .treenode .draw_ascii ()
136144 return 0
137145
138146 # create drawing
@@ -142,12 +150,17 @@ def run_draw(args):
142150 # else:
143151 # kwargs = {}
144152 canvas , axes , mark = tre .draw (
153+ height = args .height ,
154+ width = args .width ,
145155 tree_style = args .tree_style ,
156+ layout = args .layout ,
157+ tip_labels_align = args .tip_labels_align ,
158+ node_sizes = args .node_sizes if len (args .node_sizes ) > 1 else args .node_sizes [0 ],
159+ node_colors = args .node_colors if len (args .node_colors ) > 1 else args .node_colors [0 ],
146160 node_style = dict (tuple (i .split ("=" ) for i in args .node_style )) if args .node_style else {},
147161 edge_style = dict (tuple (i .split ("=" ) for i in args .edge_style )) if args .edge_style else {},
148162 tip_labels_style = dict (tuple (i .split ("=" ) for i in args .tip_labels_style )) if args .tip_labels_style else {},
149- node_sizes = args .node_sizes if len (args .node_sizes ) > 1 else args .node_sizes [0 ],
150- # node_colors=args.node_colors if len(args.node_colors) > 1 else args.node_colors[0],
163+ edge_type = args .edge_type ,
151164 # tip_labels_align=args.tip_labels_align,
152165 # **kwargs
153166 )
@@ -161,7 +174,7 @@ def run_draw(args):
161174 prefix = prefix / "toytree"
162175 out = Path (f"{ prefix } " ).with_suffix (suffix )
163176 else :
164- out = tempfile .NamedTemporaryFile (prefix = "toytree" , suffix = suffix , delete = False )
177+ out = tempfile .NamedTemporaryFile (prefix = "toytree- " , suffix = suffix , delete = False )
165178 out = out .name
166179 save (canvas , out )
167180
@@ -182,4 +195,5 @@ def main():
182195 # except ToytreeError as exc:
183196 # logger.bind(name="toytree").error(exc)
184197 except Exception as exc :
185- logger .bind (name = "toytree" ).exception (exc )
198+ raise exc
199+ # logger.bind(name="toytree").exception(exc)
0 commit comments