Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 45 additions & 4 deletions streprogen/program.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import time
import typing
import inspect
import csv
from os import path

from jinja2 import Environment, FileSystemLoader
Expand All @@ -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(
Expand Down Expand Up @@ -75,6 +76,7 @@ def __init__(
reps_to_intensity_func: typing.Callable[[int], float] = None,
verbose: bool = False,
):

"""Initialize a new program.


Expand Down Expand Up @@ -398,6 +400,7 @@ def _validate(self):

# Validate the exercises
for exercise in self._yield_exercises():

if isinstance(exercise, StaticExercise):
continue

Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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))

Expand All @@ -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
Expand Down Expand Up @@ -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))

Expand All @@ -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."
Expand All @@ -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):
Expand Down
35 changes: 35 additions & 0 deletions streprogen/templates/program_template.csv
Original file line number Diff line number Diff line change
@@ -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 %}