diff --git a/streprogen/program.py b/streprogen/program.py index 6c753e4..2fd7589 100644 --- a/streprogen/program.py +++ b/streprogen/program.py @@ -8,6 +8,7 @@ import time import typing import inspect +import csv from os import path from jinja2 import Environment, FileSystemLoader @@ -33,7 +34,7 @@ class Program(object): REP_SET_SEP = " x " TEMPLATE_DIR = path.join(path.dirname(__file__), "templates") - TEMPLATE_NAMES = {extension: "program_template." + extension for extension in ["html", "txt", "tex"]} + TEMPLATE_NAMES = {extension: "program_template." + extension for extension in ["html", "txt", "tex","csv"]} # Default functions _default_rep_scaler_func = staticmethod( @@ -75,6 +76,7 @@ def __init__( reps_to_intensity_func: typing.Callable[[int], float] = None, verbose: bool = False, ): + """Initialize a new program. @@ -398,6 +400,7 @@ def _validate(self): # Validate the exercises for exercise in self._yield_exercises(): + if isinstance(exercise, StaticExercise): continue @@ -569,7 +572,8 @@ def render(self, validate=True): # Render the dynamic exercises # -------------------------------- - for week, day, dyn_ex in self._yield_week_day_dynamic(): + for (week, day, dyn_ex) in self._yield_week_day_dynamic(): + # Set min and max reps from program, if not set on exercise min_reps = dyn_ex.min_reps max_reps = dyn_ex.max_reps @@ -757,7 +761,7 @@ def to_txt(self, verbose=False): # If rendered, find the length of the longest '6 x 75kg'-type string max_ex_scheme = 0 if self._rendered: - for week, day, dynamic_ex in self._yield_week_day_dynamic(): + for (week, day, dynamic_ex) in self._yield_week_day_dynamic(): lengths = [len(s) for s in self._rendered[week][day][dynamic_ex]["strings"]] max_ex_scheme = max(max_ex_scheme, max(lengths)) @@ -770,6 +774,7 @@ def to_txt(self, verbose=False): verbose=verbose, ) + def to_tex(self, text_size="large", table_width=5, clear_pages=False): r""" Write the program information to a .tex file, which can be @@ -797,7 +802,7 @@ def to_tex(self, text_size="large", table_width=5, clear_pages=False): # If rendered, find the length of the longest '6 x 75kg'-type string max_ex_scheme = 0 if self._rendered: - for week, day, dynamic_ex in self._yield_week_day_dynamic(): + for (week, day, dynamic_ex) in self._yield_week_day_dynamic(): lengths = [len(s) for s in self._rendered[week][day][dynamic_ex]["strings"]] max_ex_scheme = max(max_ex_scheme, max(lengths)) @@ -817,6 +822,41 @@ def __str__(self): """ return self.to_txt() + def to_csv(self, verbose=False): + """Write the program information to text, + which can be printed in a terminal. + + Parameters + ---------- + verbose + If True, more information is shown. + + Returns + ------- + string + Program as text. + """ + # Get information related to formatting + exercises = list(self._yield_exercises()) + max_ex_name = 0 + if exercises: + max_ex_name = max(len(ex.name) for ex in exercises) + + # If rendered, find the length of the longest '6 x 75kg'-type string + max_ex_scheme = 0 + if self._rendered: + for (week, day, dynamic_ex) in self._yield_week_day_dynamic(): + lengths = [len(s) for s in self._rendered[week][day][dynamic_ex]["strings"]] + max_ex_scheme = max(max_ex_scheme, max(lengths)) + + env = self.jinja2_environment + template = env.get_template(self.TEMPLATE_NAMES["csv"]) + return template.render( + program=self, + max_ex_name=max_ex_name, + max_ex_scheme=max_ex_scheme, + verbose=verbose, + ) # Patch up the docs Program.Day.__doc__ = Day.__doc__ + "\nSee streprogen.Day for accurate signature." @@ -829,6 +869,7 @@ def __str__(self): pytest.main(args=[".", "--doctest-modules", "-v", "--capture=sys"]) if __name__ == "__main__": + from streprogen import Program def rep_scaler_func(week, *args): diff --git a/streprogen/templates/program_template.csv b/streprogen/templates/program_template.csv new file mode 100644 index 0000000..0af06c6 --- /dev/null +++ b/streprogen/templates/program_template.csv @@ -0,0 +1,35 @@ +Program Name,Duration,Reps per Exercise,Intensity,Units +{{ program.name }},{{program.duration}},{{program.reps_per_exercise}},{{program.intensity}},{{program.units}} + + +Day,Exercise Name,Min Reps, Max Reps,Progress Information +{% for day in program.days %} + {% for exercise in day.exercises %} + {% if exercise | is_dynamic_exercise %} + {{ day.name }},{{ exercise.name }},{{ exercise.min_reps }},{{ exercise.max_reps }},{{ '{}{} -> {}{}'.format(str((exercise._progress_information()[0]|round2digits)).rjust(3), program.units, str((exercise._progress_information()[1])|round2digits).rjust(3), program.units).ljust(12 + 2*program.units|length) }} Weekly Inc.: {{ exercise._progress_information()[2] }}% + {% endif %} + {% if exercise | is_static_exercise %} + {{ day.name }},{{ exercise.name }},{{ exercise.sets_reps_func(1) }},Static Exercise + {% endif %} + {% endfor %} +{% endfor %} + + + +{% if program._rendered == False %} +Not rendered. Call Program.render() to render it. +{% else %} +Week, Day, Exercise Name +{% for week in range(1, program.duration + 1) %} +{% for day in program.days %} +{% for exercise in day.exercises %} +{% if exercise | is_dynamic_exercise %} +{{ week }}, {{ day.name }}, {{ exercise.name }}, {% for scheme in program._rendered[week][day][exercise]['strings'] %}{{ scheme }},, {% endfor %}, +{% endif %} +{% if exercise | is_static_exercise %} +{{ week }}, {{ day.name }}, {{ exercise.name }}, {{ exercise.sets_reps_func(week) }}, +{% endif %} +{% endfor %} +{% endfor %} +{% endfor %} +{% endif %}