tommyod / streprogen

The Python strength program generator.
https://github.com/tommyod/streprogen/
GNU General Public License v3.0
38 stars 9 forks source link

Serialization and JSON representation #26

Closed tommyod closed 3 years ago

tommyod commented 3 years ago

@glemvik

from streprogen import Program

# Create an 8-week program, rounding every exercise to nearest unit og 5kg
program = Program("My first program!", duration=2, units="kg", round_to=5)

with program.Day("Day A"):
    program.DynamicExercise("Bench press", start_weight=80, min_reps=3, max_reps=8)
    program.DynamicExercise("Squats", start_weight=100, min_reps=3, max_reps=8)

with program.Day("Day B"):
    program.DynamicExercise("Deadlifts", start_weight=100, min_reps=2, max_reps=7)
    program.StaticExercise("Curls", "3 x 10 @ 18kg")

# Render the program, then print it
program.render()

import json
print(json.dumps(program.to_dict(), indent=2, sort_keys=True))

JSON output

{
  "program": {
    "days": [
      {
        "dynamic_exercises": [
          {
            "final_weight": 82.4,
            "max_reps": 8,
            "min_reps": 3,
            "name": "Bench press",
            "start_weight": 80
          },
          {
            "final_weight": 103.0,
            "max_reps": 8,
            "min_reps": 3,
            "name": "Squats",
            "start_weight": 100
          }
        ],
        "name": "Day A",
        "static_exercises": []
      },
      {
        "dynamic_exercises": [
          {
            "final_weight": 103.0,
            "max_reps": 7,
            "min_reps": 2,
            "name": "Deadlifts",
            "start_weight": 100
          }
        ],
        "name": "Day B",
        "static_exercises": [
          {
            "name": "Curls",
            "sets_reps": "3 x 10 @ 18kg"
          }
        ]
      }
    ],
    "duration": 2,
    "intensity": 83,
    "intensity_scaler_func": [
      0.95,
      1.05
    ],
    "max_reps": 8,
    "min_reps": 3,
    "name": "My first program!",
    "percent_inc_per_week": 1.5,
    "rep_scaler_func": [
      1.2,
      0.8
    ],
    "reps_per_exercise": 25,
    "round_to": 5,
    "units": "kg",
    "verbose": false
  },
  "rendered": [
    [
      {
        "dynamic_exercises": [
          {
            "1RM_this_week": 80.0,
            "desired_intensity": 78.85,
            "desired_reps": 30,
            "final_weight": 82.4,
            "intensities": [
              75.45,
              78.3,
              78.3,
              78.3
            ],
            "max_reps": 8,
            "min_reps": 3,
            "name": "Bench press",
            "reps": [
              8,
              7,
              7,
              7
            ],
            "start_weight": 80,
            "strings": [
              "8 x 60kg",
              "7 x 65kg",
              "7 x 65kg",
              "7 x 65kg"
            ],
            "weights": [
              60,
              65,
              65,
              65
            ]
          },
          {
            "1RM_this_week": 100.0,
            "desired_intensity": 78.85,
            "desired_reps": 30,
            "final_weight": 103.0,
            "intensities": [
              75.45,
              78.3,
              78.3,
              78.3
            ],
            "max_reps": 8,
            "min_reps": 3,
            "name": "Squats",
            "reps": [
              8,
              7,
              7,
              7
            ],
            "start_weight": 100,
            "strings": [
              "8 x 75kg",
              "7 x 80kg",
              "7 x 80kg",
              "7 x 80kg"
            ],
            "weights": [
              75,
              80,
              80,
              80
            ]
          }
        ],
        "name": "Day A",
        "static_exercises": []
      },
      {
        "dynamic_exercises": [
          {
            "1RM_this_week": 100.0,
            "desired_intensity": 78.85,
            "desired_reps": 30,
            "final_weight": 103.0,
            "intensities": [
              78.3,
              78.3,
              81.25,
              81.25,
              84.3
            ],
            "max_reps": 7,
            "min_reps": 2,
            "name": "Deadlifts",
            "reps": [
              7,
              7,
              6,
              6,
              5
            ],
            "start_weight": 100,
            "strings": [
              "7 x 80kg",
              "7 x 80kg",
              "6 x 80kg",
              "6 x 80kg",
              "5 x 85kg"
            ],
            "weights": [
              80,
              80,
              80,
              80,
              85
            ]
          }
        ],
        "name": "Day B",
        "static_exercises": [
          {
            "name": "Curls",
            "sets_reps": "3 x 10 @ 18kg"
          }
        ]
      }
    ],
    [
      {
        "dynamic_exercises": [
          {
            "1RM_this_week": 82.4,
            "desired_intensity": 87.15,
            "desired_reps": 20,
            "final_weight": 82.4,
            "intensities": [
              84.3,
              87.45,
              87.45,
              87.45,
              90.7
            ],
            "max_reps": 8,
            "min_reps": 3,
            "name": "Bench press",
            "reps": [
              5,
              4,
              4,
              4,
              3
            ],
            "start_weight": 80,
            "strings": [
              "5 x 70kg",
              "4 x 70kg",
              "4 x 70kg",
              "4 x 70kg",
              "3 x 75kg"
            ],
            "weights": [
              70,
              70,
              70,
              70,
              75
            ]
          },
          {
            "1RM_this_week": 103.0,
            "desired_intensity": 87.15,
            "desired_reps": 20,
            "final_weight": 103.0,
            "intensities": [
              84.3,
              87.45,
              87.45,
              87.45,
              90.7
            ],
            "max_reps": 8,
            "min_reps": 3,
            "name": "Squats",
            "reps": [
              5,
              4,
              4,
              4,
              3
            ],
            "start_weight": 100,
            "strings": [
              "5 x 85kg",
              "4 x 90kg",
              "4 x 90kg",
              "4 x 90kg",
              "3 x 95kg"
            ],
            "weights": [
              85,
              90,
              90,
              90,
              95
            ]
          }
        ],
        "name": "Day A",
        "static_exercises": []
      },
      {
        "dynamic_exercises": [
          {
            "1RM_this_week": 103.0,
            "desired_intensity": 87.15,
            "desired_reps": 20,
            "final_weight": 103.0,
            "intensities": [
              84.3,
              87.45,
              87.45,
              87.45,
              90.7
            ],
            "max_reps": 7,
            "min_reps": 2,
            "name": "Deadlifts",
            "reps": [
              5,
              4,
              4,
              4,
              3
            ],
            "start_weight": 100,
            "strings": [
              "5 x 85kg",
              "4 x 90kg",
              "4 x 90kg",
              "4 x 90kg",
              "3 x 95kg"
            ],
            "weights": [
              85,
              90,
              90,
              90,
              95
            ]
          }
        ],
        "name": "Day B",
        "static_exercises": [
          {
            "name": "Curls",
            "sets_reps": "3 x 10 @ 18kg"
          }
        ]
      }
    ]
  ]
}

Create program from JSON

{'name': 'My first program!',
 'duration': 2,
 'min_reps': 3,
 'max_reps': 8,
 'reps_per_exercise': 25,
 'rep_scaler_func': [1.2, 0.8],
 'intensity': 83,
 'intensity_scaler_func': [0.95, 1.05],
 'units': 'kg',
 'round_to': 5,
 'percent_inc_per_week': 1.5,
 'verbose': False,
 'days': [{'name': 'Day A',
   'dynamic_exercises': [{'name': 'Bench press',
     'max_reps': 8,
     'final_weight': 82.4,
     'start_weight': 80,
     'min_reps': 3},
    {'name': 'Squats',
     'max_reps': 8,
     'final_weight': 103.0,
     'start_weight': 100,
     'min_reps': 3}],
   'static_exercises': []},
  {'name': 'Day B',
   'dynamic_exercises': [{'name': 'Deadlifts',
     'max_reps': 7,
     'final_weight': 103.0,
     'start_weight': 100,
     'min_reps': 2}],
   'static_exercises': [{'name': 'Curls', 'sets_reps': '3 x 10 @ 18kg'}]}]}

Creating a program (how an API endpoint might look)

program_data = """{
 "name": "My first program!",
 "duration": 2,
 "min_reps": 3,
 "max_reps": 8,
 "reps_per_exercise": 25,
 "rep_scaler_func": [
  1.2,
  0.8
 ],
 "intensity": 83,
 "intensity_scaler_func": [
  0.95,
  1.05
 ],
 "units": "kg",
 "round_to": 5,
 "percent_inc_per_week": 1.5,
 "verbose": false,
 "days": [
  {
   "name": "Day A",
   "dynamic_exercises": [
    {
     "name": "Bench press",
     "max_reps": 8,
     "final_weight": 82.4,
     "start_weight": 80,
     "min_reps": 3
    },
    {
     "name": "Squats",
     "max_reps": 8,
     "final_weight": 103.0,
     "start_weight": 100,
     "min_reps": 3
    }
   ],
   "static_exercises": []
  },
  {
   "name": "Day B",
   "dynamic_exercises": [
    {
     "name": "Deadlifts",
     "max_reps": 7,
     "final_weight": 103.0,
     "start_weight": 100,
     "min_reps": 2
    }
   ],
   "static_exercises": [
    {
     "name": "Curls",
     "sets_reps": "3 x 10 @ 18kg"
    }
   ]
  }
 ]
}"""

import json
from streprogen import Program
program = Program.deserialize(json.loads(program_data))
program.render()

output = json.dumps(program.to_dict())