Package: progrow
progrowprogrowis a Python package for graphing the progress of work across rows.Installationprogrowrequires Python 3.6 or later.pipinstallprogrowRendering a single rowfromprogrowimportRowrow=Row("apple harvest",current=23,maximum=100)print(row.render())apple harvest ████████▉Including fractions, percentages and other stylesAn optionalStylecan be passed intorender():PropertyDescriptionDefaultcolorRender in colourTruename_suffixString to append after each row's name" "show_fractionInclude each row's fractional progress (<current> / <maximum>)Falseshow_percentInclude each row's percentage progressFalsewidthWidth to drawTerminal widthfromprogrowimportRow,Stylerow=Row("apple harvest",current=23,maximum=100)style=Style(name_suffix=" progress: ",show_fraction=True,show_percent=True)print(row.render(style=style))apple harvest progress: ███▌            23 / 100 • 23%Rendering rows from a generatorfromprogrowimportRow,Stylestyle=Style(show_fraction=True,show_percent=True)forharvestinharvest_generator():row=Row(harvest[0],current=harvest[1],maximum=harvest[2])print(row.render(style=style))apple harvest ███                         1 / 9 • 11%
banana harvest ██▍                        9 / 99 • 9%
caramel harvest ███████████████████▉ 100 / 100 • 100%Since the rows are "streaming" in from a generator, the layout cannot be pre-calculated and the columns don't align.To make this output prettier, create aLayoutand guesstimate your columns:PropertyDescriptionleft_fraction_lengthWidth of the "current" part of the fraction. For example,3to accommodate a three-digit value.name_lengthWidth of the name column. For example,10to accommodate a ten-character name.percent_lengthWidth of the percentage column. For example,3to accommodate a two-digit value plus a%character.right_fraction_lengthWidth of the "maximum" part of the fraction. For example,3to accommodate a three-digit value.fromprogrowimportLayout,Row,Stylelayout=Layout(left_fraction_length=3,name_length=16,percent_length=4,right_fraction_length=3,)style=Style(show_fraction=True,show_percent=True)forharvestinharvest_generator():row=Row(harvest[0],current=harvest[1],maximum=harvest[2])print(row.render(layout,style))apple harvest    ██▏                   1 /   9 •  11%
banana harvest   █▊                    9 /  99 •   9%
caramel harvest  ███████████████████ 100 / 100 • 100%Rendering rows from a listWhen all the row data is available before rendering, create aRowsinstance to have the layout calculated automatically.fromprogrowimportRows,Stylerows=Rows()rows.append("apple harvest",current=1,maximum=9)rows.append("banana harvest",current=9,maximum=99)rows.append("caramel harvest",current=100,maximum=100)style=Style(show_fraction=True,show_percent=True)print(rows.render(style))apple harvest   ██▎                    1 /   9 •  11%
banana harvest  █▊                     9 /  99 •   9%
caramel harvest ███████████████████▉ 100 / 100 • 100%Thank you! 🎉My name isCariad, and I'm anindependent freelance DevOps engineer.I'd love to spend more time working on projects like this, but--as a freelancer--my income is sporadic and I need to chase gigs that pay the rent.If this project has value to you, please consider☕️ sponsoringme. Sponsorships grant me time to work onyourwants rather thansomeone else's.Thank you! ❤️