[Pharo] Personal fitness tracker web app.
Update core domain entities.
Domain modeling is hard.
Changed files
- src/MyFitnessTracker-Core/MFTActivity.class.st
- src/MyFitnessTracker-Core/MFTEquipment.class.st
- src/MyFitnessTracker-Core/MFTExercise.class.st
- src/MyFitnessTracker-Core/MFTMuscle.class.st
- src/MyFitnessTracker-Core/MFTMuscleGroup.class.st
- src/MyFitnessTracker-Core/MFTObject.class.st
- src/MyFitnessTracker-Core/MFTPlan.class.st
- src/MyFitnessTracker-Core/MFTPreExhaustSupersetGroupPrescription.class.st
- src/MyFitnessTracker-Core/MFTPrescription.class.st
- src/MyFitnessTracker-Core/MFTRepScheme.class.st
- src/MyFitnessTracker-Core/MFTRest.class.st
- src/MyFitnessTracker-Core/MFTRestPrescription.class.st
- src/MyFitnessTracker-Core/MFTRoutine.class.st
- src/MyFitnessTracker-Core/MFTSet.class.st
- src/MyFitnessTracker-Core/MFTSetGroup.class.st
- src/MyFitnessTracker-Core/MFTSetGroupPrescription.class.st
- src/MyFitnessTracker-Core/MFTSetLog.class.st
- src/MyFitnessTracker-Core/MFTSetPrescription.class.st
- src/MyFitnessTracker-Core/MFTStraightSetGroupPrescription.class.st
- src/MyFitnessTracker-Core/MFTSupersetGroupPrescription.class.st
- src/MyFitnessTracker-Core/MFTTrainee.class.st
- src/MyFitnessTracker-Core/MFTWeight.class.st
- src/MyFitnessTracker-Core/MFTWorkout.class.st
- src/MyFitnessTracker-Core/MFTWorkoutLog.class.st
- src/MyFitnessTracker-Core/MFTWorkoutPrescription.class.st
src/MyFitnessTracker-Core/MFTActivity.class.st
@@ -1,78 +0,0 @@
1
Removed:
Class {
2
Removed:
#name : 'MFTActivity',
3
Removed:
#superclass : 'MFTObject',
4
Removed:
#instVars : [
5
Removed:
'planned',
6
Removed:
'started',
7
Removed:
'completed'
8
Removed:
],
9
Removed:
#category : 'MyFitnessTracker-Core',
10
Removed:
#package : 'MyFitnessTracker-Core'
11
Removed:
}
12
Removed:
13
Removed:
{ #category : 'accessing' }
14
Removed:
MFTActivity >> completed [
15
Removed:
16
Removed:
^ completed
17
Removed:
]
18
Removed:
19
Removed:
{ #category : 'accessing' }
20
Removed:
MFTActivity >> completed: aDateAndTime [
21
Removed:
22
Removed:
completed := aDateAndTime
23
Removed:
]
24
Removed:
25
Removed:
{ #category : 'initialization' }
26
Removed:
MFTActivity >> initialize [
27
Removed:
28
Removed:
super initialize.
29
Removed:
planned := DateAndTime now
30
Removed:
]
31
Removed:
32
Removed:
{ #category : 'testing' }
33
Removed:
MFTActivity >> isCompleted [
34
Removed:
35
Removed:
^ completed isNotNil
36
Removed:
]
37
Removed:
38
Removed:
{ #category : 'testing' }
39
Removed:
MFTActivity >> isLive [
40
Removed:
41
Removed:
^ self isStarted and: self isCompleted not
42
Removed:
]
43
Removed:
44
Removed:
{ #category : 'testing' }
45
Removed:
MFTActivity >> isPlanned [
46
Removed:
47
Removed:
^ planned isNotNil
48
Removed:
]
49
Removed:
50
Removed:
{ #category : 'testing' }
51
Removed:
MFTActivity >> isStarted [
52
Removed:
53
Removed:
^ started isNotNil
54
Removed:
]
55
Removed:
56
Removed:
{ #category : 'accessing' }
57
Removed:
MFTActivity >> planned [
58
Removed:
59
Removed:
^ planned
60
Removed:
]
61
Removed:
62
Removed:
{ #category : 'accessing' }
63
Removed:
MFTActivity >> planned: aDateAndTime [
64
Removed:
65
Removed:
planned := aDateAndTime
66
Removed:
]
67
Removed:
68
Removed:
{ #category : 'accessing' }
69
Removed:
MFTActivity >> started [
70
Removed:
71
Removed:
^ started
72
Removed:
]
73
Removed:
74
Removed:
{ #category : 'accessing' }
75
Removed:
MFTActivity >> started: aDateAndTime [
76
Removed:
77
Removed:
started := aDateAndTime
78
Removed:
]
src/MyFitnessTracker-Core/MFTEquipment.class.st
@@ -7,8 +7,9 @@
7
7
#instVars : [
8
8
'englishName'
9
9
],
10
Removed:
#category : 'MyFitnessTracker-Core',
11
Removed:
#package : 'MyFitnessTracker-Core'
10
Added:
#category : 'MyFitnessTracker-Core-Base',
11
Added:
#package : 'MyFitnessTracker-Core',
12
Added:
#tag : 'Base'
12
13
}
13
14
14
15
{ #category : 'as yet unclassified' }
src/MyFitnessTracker-Core/MFTExercise.class.st
@@ -13,11 +13,12 @@
13
13
#instVars : [
14
14
'englishName',
15
15
'frenchName',
16
Removed:
'activatedMuscles',
16
Added:
'activatedMuscleGroups',
17
17
'equipment'
18
18
],
19
Removed:
#category : 'MyFitnessTracker-Core',
20
Removed:
#package : 'MyFitnessTracker-Core'
19
Added:
#category : 'MyFitnessTracker-Core-Base',
20
Added:
#package : 'MyFitnessTracker-Core',
21
Added:
#tag : 'Base'
21
22
}
22
23
23
24
{ #category : 'chest' }
@@ -25,8 +26,7 @@
25
26
26
27
^ self newWithEnglishName
27
28
equipment: MFTEquipment barbell;
28
Removed:
activates: MFTMuscle pectoralisMajor percent: 100;
29
Removed:
activates: MFTMuscle pectoralisMinor percent: 80
29
Added:
activates: MFTMuscleGroup chest
30
30
]
31
31
32
32
{ #category : 'benchmarking' }
@@ -40,25 +40,19 @@
40
40
{ #category : 'bicep' }
41
41
MFTExercise class >> bicepCurl [
42
42
43
Removed:
^ self newWithEnglishName
44
Removed:
activates: MFTMuscle bicepsBrachii percent: 100;
45
Removed:
activates: MFTMuscle brachioRadialis percent: 80
43
Added:
^ self newWithEnglishName activates: MFTMuscleGroup arm
46
44
]
47
45
48
46
{ #category : 'benchmarking' }
49
47
MFTExercise class >> cableRow [
50
48
51
Removed:
^ self newWithEnglishName
52
Removed:
activates: MFTMuscle latissimusDorsi percent: 60;
53
Removed:
activates: MFTMuscle deltoidPosterior percent: 70
49
Added:
^ self newWithEnglishName activates: MFTMuscleGroup back
54
50
]
55
51
56
52
{ #category : 'compound' }
57
53
MFTExercise class >> calfRaise [
58
54
59
Removed:
^ self newWithEnglishName
60
Removed:
activatesAll: MFTMuscleGroup calf muscles
61
Removed:
percent: 100
55
Added:
^ self newWithEnglishName activates: MFTMuscleGroup calf
62
56
]
63
57
64
58
{ #category : 'benchmarking' }
@@ -72,15 +66,15 @@
72
66
{ #category : 'compound' }
73
67
MFTExercise class >> deadlift [
74
68
75
Removed:
^ self newWithEnglishName
76
Removed:
activates: MFTMuscle latissimusDorsi
77
Removed:
percent: 80
69
Added:
^ self newWithEnglishName activates: MFTMuscleGroup back
78
70
]
79
71
80
72
{ #category : 'compound' }
81
73
MFTExercise class >> dip [
82
74
83
75
^ self newWithEnglishName
76
Added:
activates: MFTMuscleGroup chest;
77
Added:
activates: MFTMuscleGroup arm
84
78
]
85
79
86
80
{ #category : 'benchmarking' }
@@ -88,14 +82,15 @@
88
82
89
83
^ self newWithEnglishName
90
84
equipment: MFTEquipment dumbbell;
91
Removed:
activates: MFTMuscle pectoralisMajor percent: 100;
92
Removed:
activates: MFTMuscle pectoralisMinor percent: 80
85
Added:
activates: MFTMuscleGroup chest
93
86
]
94
87
95
88
{ #category : 'benchmarking' }
96
89
MFTExercise class >> dumbbellFly [
97
90
98
Removed:
^ self newWithEnglishName equipment: MFTEquipment dumbbell
91
Added:
^ self newWithEnglishName
92
Added:
activates: MFTMuscleGroup chest;
93
Added:
equipment: MFTEquipment dumbbell
99
94
]
100
95
101
96
{ #category : 'benchmarking' }
@@ -107,7 +102,7 @@
107
102
{ #category : 'benchmarking' }
108
103
MFTExercise class >> hammerCurl [
109
104
110
Removed:
^ self newWithEnglishName
105
Added:
^ self newWithEnglishName activates: MFTMuscleGroup arm
111
106
]
112
107
113
108
{ #category : 'benchmarking' }
@@ -119,7 +114,7 @@
119
114
{ #category : 'benchmarking' }
120
115
MFTExercise class >> inclinePress [
121
116
122
Removed:
^ self newWithEnglishName
117
Added:
^ self newWithEnglishName activates: MFTMuscleGroup chest
123
118
]
124
119
125
120
{ #category : 'benchmarking' }
@@ -137,9 +132,7 @@
137
132
{ #category : 'benchmarking' }
138
133
MFTExercise class >> lateralRaise [
139
134
140
Removed:
^ self newWithEnglishName
141
Removed:
activatesAll: MFTMuscleGroup shoulder muscles
142
Removed:
percent: 90
135
Added:
^ self newWithEnglishName activates: MFTMuscleGroup shoulder
143
136
]
144
137
145
138
{ #category : 'benchmarking' }
@@ -174,17 +167,18 @@
174
167
{ #category : 'benchmarking' }
175
168
MFTExercise class >> rearDeltFly [
176
169
177
Removed:
^ self newWithEnglishName equipment: MFTEquipment pecDeck
170
Added:
^ self newWithEnglishName
171
Added:
activates: MFTMuscleGroup shoulder;
172
Added:
equipment: MFTEquipment pecDeck
178
173
]
179
174
180
175
{ #category : 'shoulder' }
181
176
MFTExercise class >> shoulderPressDumbell [
182
177
183
Removed:
^ self register: (self new
184
Removed:
englishName: 'shoulder press (dumbell)';
185
Removed:
activates: MFTMuscle deltoidAnterior percent: 90;
186
Removed:
activates: MFTMuscle deltoidMedial percent: 60;
187
Removed:
equipment: MFTEquipment dumbbell)
178
Added:
^ self new
179
Added:
englishName: 'shoulder press (dumbell)';
180
Added:
activates: MFTMuscleGroup shoulder;
181
Added:
equipment: MFTEquipment dumbbell
188
182
]
189
183
190
184
{ #category : 'traps' }
@@ -198,7 +192,7 @@
198
192
199
193
^ self new
200
194
englishName: 'sit-up';
201
Removed:
activatesAll: MFTMuscleGroup abdominal muscles percent: 100
195
Added:
activates: MFTMuscleGroup abdominal
202
196
]
203
197
204
198
{ #category : 'compound' }
@@ -214,25 +208,18 @@
214
208
]
215
209
216
210
{ #category : 'accessing' }
217
Removed:
MFTExercise >> activatedMuscles [
211
Added:
MFTExercise >> activates: aMFTMuscleGroup [
218
212
219
Removed:
^ activatedMuscles
213
Added:
activatedMuscleGroups at: aMFTMuscleGroup put: 100
220
214
]
221
215
222
216
{ #category : 'accessing' }
223
Removed:
MFTExercise >> activates: aMFTMuscle percent: aPercent [
217
Added:
MFTExercise >> activates: aMFTMuscleGroup percent: aPercent [
224
218
225
Removed:
activatedMuscles at: aMFTMuscle put: aPercent
219
Added:
activatedMuscleGroups at: aMFTMuscleGroup put: aPercent
226
220
]
227
221
228
222
{ #category : 'accessing' }
229
Removed:
MFTExercise >> activatesAll: aMFTMuscleCollection percent: aPercent [
230
Removed:
231
Removed:
aMFTMuscleCollection do: [ :muscle |
232
Removed:
activatedMuscles at: muscle put: aPercent ]
233
Removed:
]
234
Removed:
235
Removed:
{ #category : 'accessing' }
236
223
MFTExercise >> canonicalName [
237
224
238
225
^ englishName
@@ -280,5 +267,15 @@
280
267
super initialize.
281
268
englishName := String new.
282
269
frenchName := String new.
283
Removed:
activatedMuscles := Dictionary new.
270
Added:
activatedMuscleGroups := Dictionary new
271
Added:
]
272
Added:
273
Added:
{ #category : 'accessing' }
274
Added:
MFTExercise >> mainActivatedMuscleGroups [
275
Added:
276
Added:
| values maxValue |
277
Added:
values := activatedMuscleGroups values ifEmpty: [ ^ nil ].
278
Added:
maxValue := values max.
279
Added:
^ activatedMuscleGroups keys select: [ :group |
280
Added:
(activatedMuscleGroups at: group) = maxValue ]
284
281
]
src/MyFitnessTracker-Core/MFTMuscle.class.st
@@ -7,11 +7,12 @@
7
7
#instVars : [
8
8
'latinName',
9
9
'englishName',
10
Removed:
'primaryMuscleGroup',
10
Added:
'muscleGroup',
11
11
'description'
12
12
],
13
Removed:
#category : 'MyFitnessTracker-Core',
14
Removed:
#package : 'MyFitnessTracker-Core'
13
Added:
#category : 'MyFitnessTracker-Core-Anatomy',
14
Added:
#package : 'MyFitnessTracker-Core',
15
Added:
#tag : 'Anatomy'
15
16
}
16
17
17
18
{ #category : 'as yet unclassified' }
@@ -299,7 +300,7 @@
299
300
{ #category : 'accessing' }
300
301
MFTMuscle >> canonicalName [
301
302
302
Removed:
^ englishName
303
Added:
^ latinName
303
304
]
304
305
305
306
{ #category : 'accessing' }
@@ -330,7 +331,6 @@
330
331
MFTMuscle >> initialize [
331
332
332
333
super initialize.
333
Removed:
primaryMuscleGroup := MFTMuscleGroup new.
334
334
latinName := String new.
335
335
englishName := String new.
336
336
description := String new
@@ -356,13 +356,13 @@
356
356
]
357
357
358
358
{ #category : 'accessing' }
359
Removed:
MFTMuscle >> primaryMuscleGroup [
359
Added:
MFTMuscle >> muscleGroup [
360
360
361
Removed:
^ primaryMuscleGroup
361
Added:
^ muscleGroup
362
362
]
363
363
364
364
{ #category : 'accessing' }
365
Removed:
MFTMuscle >> primaryMuscleGroup: aMFTMuscleGroup [
365
Added:
MFTMuscle >> muscleGroup: aMFTMuscleGroup [
366
366
367
Removed:
primaryMuscleGroup := aMFTMuscleGroup
367
Added:
muscleGroup := aMFTMuscleGroup
368
368
]
src/MyFitnessTracker-Core/MFTMuscleGroup.class.st
@@ -9,8 +9,9 @@
9
9
'frenchName',
10
10
'muscles'
11
11
],
12
Removed:
#category : 'MyFitnessTracker-Core',
13
Removed:
#package : 'MyFitnessTracker-Core'
12
Added:
#category : 'MyFitnessTracker-Core-Anatomy',
13
Added:
#package : 'MyFitnessTracker-Core',
14
Added:
#tag : 'Anatomy'
14
15
}
15
16
16
17
{ #category : 'instance creation' }
@@ -29,7 +30,6 @@
29
30
MFTMuscleGroup class >> arm [
30
31
31
32
^ self newWithEnglishName
32
Removed:
latinName: 'brachium';
33
33
muscles: {
34
34
MFTMuscle bicepsBrachii.
35
35
MFTMuscle tricepsBrachii };
@@ -154,6 +154,12 @@
154
154
frenchName := anObject
155
155
]
156
156
157
Added:
{ #category : 'testing' }
158
Added:
MFTMuscleGroup >> includes: aMFTMuscle [
159
Added:
160
Added:
^ muscles includes: aMFTMuscle
161
Added:
]
162
Added:
157
163
{ #category : 'initialization' }
158
164
MFTMuscleGroup >> initialize [
159
165
@@ -170,7 +176,7 @@
170
176
]
171
177
172
178
{ #category : 'accessing' }
173
Removed:
MFTMuscleGroup >> muscles: anObject [
179
Added:
MFTMuscleGroup >> muscles: aMFTMuscleCollection [
174
180
175
Removed:
muscles := anObject
181
Added:
muscles := aMFTMuscleCollection asOrderedCollection
176
182
]
src/MyFitnessTracker-Core/MFTObject.class.st
@@ -7,8 +7,9 @@
7
7
#instVars : [
8
8
'id'
9
9
],
10
Removed:
#category : 'MyFitnessTracker-Core',
11
Removed:
#package : 'MyFitnessTracker-Core'
10
Added:
#category : 'MyFitnessTracker-Core-Base',
11
Added:
#package : 'MyFitnessTracker-Core',
12
Added:
#tag : 'Base'
12
13
}
13
14
14
15
{ #category : 'initialization' }
@@ -24,12 +25,12 @@
24
25
]
25
26
26
27
{ #category : 'accessing' }
27
Removed:
MFTObject >> id: anObject [
28
Added:
MFTObject >> id: anInteger [
28
29
29
Removed:
id := anObject
30
Added:
id := anInteger
30
31
]
31
32
32
Removed:
{ #category : 'initialization' }
33
Added:
{ #category : 'printing' }
33
34
MFTObject >> printOn: aStream [
34
35
35
36
aStream nextPutAll: self canonicalName
src/MyFitnessTracker-Core/MFTPlan.class.st
@@ -0,0 +1,88 @@
1
Added:
"
2
Added:
I represent a training routine for a trainee.
3
Added:
"
4
Added:
Class {
5
Added:
#name : 'MFTPlan',
6
Added:
#superclass : 'MFTObject',
7
Added:
#instVars : [
8
Added:
'trainee',
9
Added:
'routine',
10
Added:
'start'
11
Added:
],
12
Added:
#category : 'MyFitnessTracker-Core-Logging',
13
Added:
#package : 'MyFitnessTracker-Core',
14
Added:
#tag : 'Logging'
15
Added:
}
16
Added:
17
Added:
{ #category : 'instance creation' }
18
Added:
MFTPlan class >> forRoutine: aMFTRoutine [
19
Added:
20
Added:
^ self new
21
Added:
routine: aMFTRoutine;
22
Added:
yourself
23
Added:
]
24
Added:
25
Added:
{ #category : 'instance creation' }
26
Added:
MFTPlan class >> forRoutine: aMFTRoutine start: aDate [
27
Added:
28
Added:
^ self new
29
Added:
routine: aMFTRoutine;
30
Added:
start: aDate;
31
Added:
yourself
32
Added:
]
33
Added:
34
Added:
{ #category : 'accessing' }
35
Added:
MFTPlan >> canonicalName [
36
Added:
37
Added:
^ start
38
Added:
ifNotNil: [ 'plan started ' , start asDate asString ]
39
Added:
ifNil: [ 'plan not started' ]
40
Added:
]
41
Added:
42
Added:
{ #category : 'accessing' }
43
Added:
MFTPlan >> routine [
44
Added:
45
Added:
^ routine
46
Added:
]
47
Added:
48
Added:
{ #category : 'accessing' }
49
Added:
MFTPlan >> routine: aMFTRoutine [
50
Added:
51
Added:
routine := aMFTRoutine
52
Added:
]
53
Added:
54
Added:
{ #category : 'accessing' }
55
Added:
MFTPlan >> start [
56
Added:
57
Added:
^ start
58
Added:
]
59
Added:
60
Added:
{ #category : 'accessing' }
61
Added:
MFTPlan >> start: aDateAndTime [
62
Added:
63
Added:
start := aDateAndTime
64
Added:
]
65
Added:
66
Added:
{ #category : 'accessing' }
67
Added:
MFTPlan >> startNow [
68
Added:
69
Added:
start := DateAndTime now
70
Added:
]
71
Added:
72
Added:
{ #category : 'accessing' }
73
Added:
MFTPlan >> trainee [
74
Added:
75
Added:
^ trainee
76
Added:
]
77
Added:
78
Added:
{ #category : 'accessing' }
79
Added:
MFTPlan >> trainee: aMFTTrainee [
80
Added:
81
Added:
trainee := aMFTTrainee
82
Added:
]
83
Added:
84
Added:
{ #category : 'accessing' }
85
Added:
MFTPlan >> workouts [
86
Added:
87
Added:
^ routine workouts
88
Added:
]
src/MyFitnessTracker-Core/MFTPreExhaustSupersetGroupPrescription.class.st
@@ -0,0 +1,20 @@
1
Added:
Class {
2
Added:
#name : 'MFTPreExhaustSupersetGroupPrescription',
3
Added:
#superclass : 'MFTSetGroupPrescription',
4
Added:
#category : 'MyFitnessTracker-Core-Prescription',
5
Added:
#package : 'MyFitnessTracker-Core',
6
Added:
#tag : 'Prescription'
7
Added:
}
8
Added:
9
Added:
{ #category : 'initialization' }
10
Added:
MFTPreExhaustSupersetGroupPrescription >> canonicalName [
11
Added:
12
Added:
^ 'pre-exhaust superset'
13
Added:
]
14
Added:
15
Added:
{ #category : 'validation' }
16
Added:
MFTPreExhaustSupersetGroupPrescription >> validate [
17
Added:
18
Added:
sets size = 2 ifFalse: [
19
Added:
self error: 'Pre-exhaust superset must have exactly 2 sets.' ]
20
Added:
]
src/MyFitnessTracker-Core/MFTPrescription.class.st
@@ -0,0 +1,21 @@
1
Added:
"
2
Added:
I am the abstract superclass for activities that can be prescribed.
3
Added:
"
4
Added:
Class {
5
Added:
#name : 'MFTPrescription',
6
Added:
#superclass : 'MFTObject',
7
Added:
#category : 'MyFitnessTracker-Core',
8
Added:
#package : 'MyFitnessTracker-Core'
9
Added:
}
10
Added:
11
Added:
{ #category : 'testing' }
12
Added:
MFTPrescription >> isRest [
13
Added:
14
Added:
^ false
15
Added:
]
16
Added:
17
Added:
{ #category : 'testing' }
18
Added:
MFTPrescription >> isWorkout [
19
Added:
20
Added:
^ false
21
Added:
]
src/MyFitnessTracker-Core/MFTRepScheme.class.st
@@ -0,0 +1,67 @@
1
Added:
"
2
Added:
I am a rep range used when prescribing workout sets.
3
Added:
"
4
Added:
Class {
5
Added:
#name : 'MFTRepScheme',
6
Added:
#superclass : 'MFTObject',
7
Added:
#instVars : [
8
Added:
'minReps',
9
Added:
'maxReps'
10
Added:
],
11
Added:
#category : 'MyFitnessTracker-Core-Prescription',
12
Added:
#package : 'MyFitnessTracker-Core',
13
Added:
#tag : 'Prescription'
14
Added:
}
15
Added:
16
Added:
{ #category : 'instance creation' }
17
Added:
MFTRepScheme class >> from: min to: max [
18
Added:
19
Added:
^ self new
20
Added:
minReps: min;
21
Added:
maxReps: max;
22
Added:
yourself
23
Added:
]
24
Added:
25
Added:
{ #category : 'initialization' }
26
Added:
MFTRepScheme >> canonicalName [
27
Added:
28
Added:
^ minReps asString , '–' , maxReps asString
29
Added:
]
30
Added:
31
Added:
{ #category : 'testing' }
32
Added:
MFTRepScheme >> includes: repsAchieved [
33
Added:
34
Added:
^ repsAchieved between: minReps and: maxReps
35
Added:
]
36
Added:
37
Added:
{ #category : 'accessing' }
38
Added:
MFTRepScheme >> maxReps [
39
Added:
40
Added:
^ maxReps
41
Added:
]
42
Added:
43
Added:
{ #category : 'accessing' }
44
Added:
MFTRepScheme >> maxReps: anInteger [
45
Added:
46
Added:
maxReps := anInteger
47
Added:
]
48
Added:
49
Added:
{ #category : 'accessing' }
50
Added:
MFTRepScheme >> minReps [
51
Added:
52
Added:
^ minReps
53
Added:
]
54
Added:
55
Added:
{ #category : 'accessing' }
56
Added:
MFTRepScheme >> minReps: anInteger [
57
Added:
58
Added:
minReps := anInteger
59
Added:
]
60
Added:
61
Added:
{ #category : 'testing' }
62
Added:
MFTRepScheme >> progressionFor: repsAchieved [
63
Added:
64
Added:
repsAchieved > maxReps ifTrue: [ ^ #increaseLoad ].
65
Added:
repsAchieved < minReps ifTrue: [ ^ #decreaseLoad ].
66
Added:
^ #keepLoad
67
Added:
]
src/MyFitnessTracker-Core/MFTRest.class.st
@@ -1,35 +0,0 @@
1
Removed:
Class {
2
Removed:
#name : 'MFTRest',
3
Removed:
#superclass : 'MFTActivity',
4
Removed:
#instVars : [
5
Removed:
'duration'
6
Removed:
],
7
Removed:
#category : 'MyFitnessTracker-Core',
8
Removed:
#package : 'MyFitnessTracker-Core'
9
Removed:
}
10
Removed:
11
Removed:
{ #category : 'accessing' }
12
Removed:
MFTRest class >> duration: aDuration [
13
Removed:
14
Removed:
^ self new
15
Removed:
duration: aDuration;
16
Removed:
yourself
17
Removed:
]
18
Removed:
19
Removed:
{ #category : 'initialization' }
20
Removed:
MFTRest >> canonicalName [
21
Removed:
22
Removed:
^ 'rest ' , duration asHours asString , ' hours'
23
Removed:
]
24
Removed:
25
Removed:
{ #category : 'accessing' }
26
Removed:
MFTRest >> duration [
27
Removed:
28
Removed:
^ duration
29
Removed:
]
30
Removed:
31
Removed:
{ #category : 'accessing' }
32
Removed:
MFTRest >> duration: aDuration [
33
Removed:
34
Removed:
duration := aDuration
35
Removed:
]
src/MyFitnessTracker-Core/MFTRestPrescription.class.st
@@ -0,0 +1,65 @@
1
Added:
"
2
Added:
I represent a period of rest.
3
Added:
"
4
Added:
Class {
5
Added:
#name : 'MFTRestPrescription',
6
Added:
#superclass : 'MFTPrescription',
7
Added:
#instVars : [
8
Added:
'routine',
9
Added:
'duration'
10
Added:
],
11
Added:
#category : 'MyFitnessTracker-Core-Prescription',
12
Added:
#package : 'MyFitnessTracker-Core',
13
Added:
#tag : 'Prescription'
14
Added:
}
15
Added:
16
Added:
{ #category : 'as yet unclassified' }
17
Added:
MFTRestPrescription class >> withDuration: aDuration [
18
Added:
19
Added:
^ self new
20
Added:
duration: aDuration;
21
Added:
yourself
22
Added:
]
23
Added:
24
Added:
{ #category : 'initialization' }
25
Added:
MFTRestPrescription >> canonicalName [
26
Added:
27
Added:
^ 'rest ' , duration asHours asString , ' hours'
28
Added:
]
29
Added:
30
Added:
{ #category : 'accessing' }
31
Added:
MFTRestPrescription >> duration [
32
Added:
33
Added:
^ duration
34
Added:
]
35
Added:
36
Added:
{ #category : 'accessing' }
37
Added:
MFTRestPrescription >> duration: aDuration [
38
Added:
39
Added:
duration := aDuration
40
Added:
]
41
Added:
42
Added:
{ #category : 'as yet unclassified' }
43
Added:
MFTRestPrescription >> initialize [
44
Added:
45
Added:
super initialize.
46
Added:
duration := 1 day
47
Added:
]
48
Added:
49
Added:
{ #category : 'testing' }
50
Added:
MFTRestPrescription >> isRest [
51
Added:
52
Added:
^ true
53
Added:
]
54
Added:
55
Added:
{ #category : 'accessing' }
56
Added:
MFTRestPrescription >> routine [
57
Added:
58
Added:
^ routine
59
Added:
]
60
Added:
61
Added:
{ #category : 'accessing' }
62
Added:
MFTRestPrescription >> routine: aMFTRoutine [
63
Added:
64
Added:
routine := aMFTRoutine
65
Added:
]
src/MyFitnessTracker-Core/MFTRoutine.class.st
@@ -1,177 +1,63 @@
1
1
"
2
Removed:
I represent a cyclical sequence of workouts and recovery periods.
2
Added:
I represent a named cycle of prescribed MFT activities.
3
3
"
4
4
Class {
5
5
#name : 'MFTRoutine',
6
6
#superclass : 'MFTObject',
7
7
#instVars : [
8
Removed:
'trainee',
9
8
'title',
10
Removed:
'cycle',
11
Removed:
'started'
9
Added:
'workouts'
12
10
],
13
Removed:
#category : 'MyFitnessTracker-Core',
14
Removed:
#package : 'MyFitnessTracker-Core'
11
Added:
#category : 'MyFitnessTracker-Core-Prescription',
12
Added:
#package : 'MyFitnessTracker-Core',
13
Added:
#tag : 'Prescription'
15
14
}
16
15
17
Removed:
{ #category : 'heavy duty' }
16
Added:
{ #category : 'instance creation' }
18
17
MFTRoutine class >> heavyDutyOneIdealRoutine [
19
18
20
19
^ self new
21
Removed:
title: 'Heavy Duty I: Ideal Routine';
22
Removed:
addWorkout: MFTWorkout heavyDutyOneDay1;
23
Removed:
addRest: (MFTRest duration: 4 days);
24
Removed:
addWorkout: MFTWorkout heavyDutyOneDay2;
25
Removed:
addRest: (MFTRest duration: 4 days);
26
Removed:
addWorkout: MFTWorkout heavyDutyOneDay3;
27
Removed:
addRest: (MFTRest duration: 4 days);
20
Added:
title: 'Heavy Duty I — Ideal Routine';
21
Added:
workouts: {
22
Added:
MFTWorkoutPrescription heavyDutyOneDay1.
23
Added:
MFTWorkoutPrescription heavyDutyOneDay2.
24
Added:
MFTWorkoutPrescription heavyDutyOneDay3 };
28
25
yourself
29
26
]
30
27
31
Removed:
{ #category : 'placeholder' }
32
Removed:
MFTRoutine class >> placeholder [
33
Removed:
34
Removed:
^ self new
35
Removed:
addWorkouts: {
36
Removed:
MFTWorkout placeholderForYesterday.
37
Removed:
MFTWorkout placeholderForToday.
38
Removed:
MFTWorkout placeholderForTomorrow };
39
Removed:
yourself
40
Removed:
]
41
Removed:
42
28
{ #category : 'as yet unclassified' }
43
Removed:
MFTRoutine >> activityOnDate: aDate [
44
Removed:
45
Removed:
| daysElapsed cycleDuration |
46
Removed:
started ifNil: [ ^ nil ].
47
Removed:
48
Removed:
daysElapsed := (aDate - started) asDays asInteger.
49
Removed:
cycleDuration := self cycleDuration asDays asInteger.
50
Removed:
^ cycle at: daysElapsed % cycleDuration
51
Removed:
]
52
Removed:
53
Removed:
{ #category : 'as yet unclassified' }
54
Removed:
MFTRoutine >> activityToday [
55
Removed:
56
Removed:
^ self activityOnDate: Date today
57
Removed:
]
58
Removed:
59
Removed:
{ #category : 'adding' }
60
Removed:
MFTRoutine >> addRest: aMFTRest [
61
Removed:
62
Removed:
cycle addLast: aMFTRest
63
Removed:
]
64
Removed:
65
Removed:
{ #category : 'as yet unclassified' }
66
Removed:
MFTRoutine >> addWorkout: aMFTWorkout [
67
Removed:
68
Removed:
cycle addLast: aMFTWorkout
69
Removed:
]
70
Removed:
71
Removed:
{ #category : 'adding' }
72
Removed:
MFTRoutine >> addWorkouts: aMFTWorkoutCollection [
73
Removed:
74
Removed:
cycle addAll: aMFTWorkoutCollection.
75
Removed:
aMFTWorkoutCollection do: [ :workout | workout routine: self ]
76
Removed:
]
77
Removed:
78
Removed:
{ #category : 'initialization' }
79
29
MFTRoutine >> canonicalName [
80
30
81
31
^ title
82
32
]
83
33
84
Removed:
{ #category : 'as yet unclassified' }
85
Removed:
MFTRoutine >> completedWorkouts [
86
Removed:
87
Removed:
^ self workouts select: #isCompleted
88
Removed:
]
89
Removed:
90
Removed:
{ #category : 'accessing' }
91
Removed:
MFTRoutine >> cycle [
92
Removed:
93
Removed:
^ cycle
94
Removed:
]
95
Removed:
96
Removed:
{ #category : 'accessing' }
97
Removed:
MFTRoutine >> cycleDuration [
98
Removed:
"I add workout days and rest days."
99
Removed:
100
Removed:
^ self workouts size days + self totalRestDuration
101
Removed:
]
102
Removed:
103
Removed:
{ #category : 'accessing' }
34
Added:
{ #category : 'initialization' }
104
35
MFTRoutine >> initialize [
105
36
106
37
super initialize.
107
Removed:
cycle := OrderedCollection new
38
Added:
workouts := OrderedCollection new
108
39
]
109
40
110
41
{ #category : 'as yet unclassified' }
111
Removed:
MFTRoutine >> nextPlannedWorkout [
112
Removed:
113
Removed:
^ (self plannedWorkouts sort: [:a :b | a planned > b planned]) first
114
Removed:
]
115
Removed:
116
Removed:
{ #category : 'as yet unclassified' }
117
Removed:
MFTRoutine >> plannedWorkouts [
118
Removed:
119
Removed:
^ self workouts select: #isPlanned
120
Removed:
]
121
Removed:
122
Removed:
{ #category : 'as yet unclassified' }
123
Removed:
MFTRoutine >> startToday [
124
Removed:
125
Removed:
started := Date today.
126
Removed:
cycle first started: Date today
127
Removed:
]
128
Removed:
129
Removed:
{ #category : 'accessing' }
130
Removed:
MFTRoutine >> started [
131
Removed:
132
Removed:
^ started
133
Removed:
]
134
Removed:
135
Removed:
{ #category : 'accessing' }
136
Removed:
MFTRoutine >> started: aDate [
137
Removed:
138
Removed:
started := aDate
139
Removed:
]
140
Removed:
141
Removed:
{ #category : 'accessing' }
142
42
MFTRoutine >> title [
143
43
144
44
^ title
145
45
]
146
46
147
Removed:
{ #category : 'accessing' }
47
Added:
{ #category : 'as yet unclassified' }
148
48
MFTRoutine >> title: aString [
149
49
150
50
title := aString
151
51
]
152
52
153
53
{ #category : 'accessing' }
154
Removed:
MFTRoutine >> totalRestDuration [
54
Added:
MFTRoutine >> workouts [
155
55
156
Removed:
^ (cycle
157
Removed:
select: [ :each | each class = MFTRest ]
158
Removed:
thenCollect: #duration) sum
56
Added:
^ workouts
159
57
]
160
58
161
59
{ #category : 'accessing' }
162
Removed:
MFTRoutine >> trainee [
60
Added:
MFTRoutine >> workouts: aMFTWorkoutPrescriptionCollection [
163
61
164
Removed:
^ trainee
165
Removed:
]
166
Removed:
167
Removed:
{ #category : 'accessing' }
168
Removed:
MFTRoutine >> trainee: aMFTTrainee [
169
Removed:
170
Removed:
trainee := aMFTTrainee
171
Removed:
]
172
Removed:
173
Removed:
{ #category : 'as yet unclassified' }
174
Removed:
MFTRoutine >> workouts [
175
Removed:
176
Removed:
^ self cycle select: [ :each | each class = MFTWorkout ]
62
Added:
workouts := aMFTWorkoutPrescriptionCollection
177
63
]
src/MyFitnessTracker-Core/MFTSet.class.st
@@ -1,121 +0,0 @@
1
Removed:
"
2
Removed:
I represent an exercise set performed during a workout.
3
Removed:
"
4
Removed:
Class {
5
Removed:
#name : 'MFTSet',
6
Removed:
#superclass : 'MFTObject',
7
Removed:
#instVars : [
8
Removed:
'exercise',
9
Removed:
'reps',
10
Removed:
'load',
11
Removed:
'setGroup'
12
Removed:
],
13
Removed:
#category : 'MyFitnessTracker-Core',
14
Removed:
#package : 'MyFitnessTracker-Core'
15
Removed:
}
16
Removed:
17
Removed:
{ #category : 'accessing' }
18
Removed:
MFTSet class >> exercise: aMFTExercise [
19
Removed:
20
Removed:
^ self new
21
Removed:
exercise: aMFTExercise;
22
Removed:
yourself
23
Removed:
]
24
Removed:
25
Removed:
{ #category : 'as yet unclassified' }
26
Removed:
MFTSet class >> exercise: aMFTExercise reps: anInteger load: aNumber [
27
Removed:
28
Removed:
^ self new
29
Removed:
exercise: aMFTExercise;
30
Removed:
reps: anInteger;
31
Removed:
load: aNumber;
32
Removed:
yourself
33
Removed:
]
34
Removed:
35
Removed:
{ #category : 'as yet unclassified' }
36
Removed:
MFTSet class >> reps: anInteger load: aNumber [
37
Removed:
38
Removed:
^ self new
39
Removed:
reps: anInteger;
40
Removed:
load: aNumber;
41
Removed:
yourself
42
Removed:
]
43
Removed:
44
Removed:
{ #category : 'initialization' }
45
Removed:
MFTSet >> canonicalName [
46
Removed:
47
Removed:
^ reps asString , '×' , load asString , ' ' , exercise canonicalName
48
Removed:
]
49
Removed:
50
Removed:
{ #category : 'accessing' }
51
Removed:
MFTSet >> exercise [
52
Removed:
53
Removed:
^ exercise
54
Removed:
]
55
Removed:
56
Removed:
{ #category : 'accessing' }
57
Removed:
MFTSet >> exercise: aMFTExercise [
58
Removed:
59
Removed:
exercise := aMFTExercise
60
Removed:
]
61
Removed:
62
Removed:
{ #category : 'testing' }
63
Removed:
MFTSet >> hasLoad [
64
Removed:
65
Removed:
^ load isNotNil and: [ load asString isNotEmpty ]
66
Removed:
]
67
Removed:
68
Removed:
{ #category : 'as yet unclassified' }
69
Removed:
MFTSet >> hasVolume [
70
Removed:
71
Removed:
^ self volume ~~ 0
72
Removed:
]
73
Removed:
74
Removed:
{ #category : 'accessing' }
75
Removed:
MFTSet >> load [
76
Removed:
77
Removed:
^ load
78
Removed:
]
79
Removed:
80
Removed:
{ #category : 'accessing' }
81
Removed:
MFTSet >> load: aNumber [
82
Removed:
83
Removed:
load := aNumber
84
Removed:
]
85
Removed:
86
Removed:
{ #category : 'accessing' }
87
Removed:
MFTSet >> reps [
88
Removed:
89
Removed:
^ reps
90
Removed:
]
91
Removed:
92
Removed:
{ #category : 'accessing' }
93
Removed:
MFTSet >> reps: anInteger [
94
Removed:
95
Removed:
reps := anInteger
96
Removed:
]
97
Removed:
98
Removed:
{ #category : 'accessing' }
99
Removed:
MFTSet >> setGroup [
100
Removed:
101
Removed:
^ setGroup
102
Removed:
]
103
Removed:
104
Removed:
{ #category : 'accessing' }
105
Removed:
MFTSet >> setGroup: aMFTSetGroup [
106
Removed:
107
Removed:
setGroup := aMFTSetGroup
108
Removed:
]
109
Removed:
110
Removed:
{ #category : 'as yet unclassified' }
111
Removed:
MFTSet >> volume [
112
Removed:
"reps is never nil, as enforced by the database schema."
113
Removed:
114
Removed:
^ load ifNotNil: [ reps * load ] ifNil: [ 0 ]
115
Removed:
]
116
Removed:
117
Removed:
{ #category : 'accessing' }
118
Removed:
MFTSet >> workout [
119
Removed:
120
Removed:
^ self setGroup workout
121
Removed:
]
src/MyFitnessTracker-Core/MFTSetGroup.class.st
@@ -1,113 +0,0 @@
1
Removed:
"
2
Removed:
I represent a group of sets performed during a workout.
3
Removed:
"
4
Removed:
Class {
5
Removed:
#name : 'MFTSetGroup',
6
Removed:
#superclass : 'MFTObject',
7
Removed:
#instVars : [
8
Removed:
'sets'
9
Removed:
],
10
Removed:
#category : 'MyFitnessTracker-Core',
11
Removed:
#package : 'MyFitnessTracker-Core'
12
Removed:
}
13
Removed:
14
Removed:
{ #category : 'as yet unclassified' }
15
Removed:
MFTSetGroup class >> exercise: aMFTExercise sets: aMFTSetCollection [
16
Removed:
17
Removed:
^ self withSets:
18
Removed:
(aMFTSetCollection collect: [ :set | set exercise: aMFTExercise ])
19
Removed:
]
20
Removed:
21
Removed:
{ #category : 'as yet unclassified' }
22
Removed:
MFTSetGroup class >> withSet: aMFTWorkoutSet [
23
Removed:
24
Removed:
^ self new
25
Removed:
sets: { aMFTWorkoutSet };
26
Removed:
yourself
27
Removed:
]
28
Removed:
29
Removed:
{ #category : 'as yet unclassified' }
30
Removed:
MFTSetGroup class >> withSets: aMFTWorkoutSetCollection [
31
Removed:
32
Removed:
^ self new
33
Removed:
sets: aMFTWorkoutSetCollection;
34
Removed:
yourself
35
Removed:
]
36
Removed:
37
Removed:
{ #category : 'adding' }
38
Removed:
MFTSetGroup >> addSet: aMFTSet [
39
Removed:
40
Removed:
sets add: aMFTSet
41
Removed:
]
42
Removed:
43
Removed:
{ #category : 'adding' }
44
Removed:
MFTSetGroup >> addSets: aMFTSetCollection [
45
Removed:
46
Removed:
sets addAll: aMFTSetCollection
47
Removed:
]
48
Removed:
49
Removed:
{ #category : 'initialization' }
50
Removed:
MFTSetGroup >> canonicalName [
51
Removed:
52
Removed:
^ self type
53
Removed:
]
54
Removed:
55
Removed:
{ #category : 'testing' }
56
Removed:
MFTSetGroup >> hasLoad [
57
Removed:
58
Removed:
^ sets anySatisfy: #hasLoad
59
Removed:
]
60
Removed:
61
Removed:
{ #category : 'testing' }
62
Removed:
MFTSetGroup >> hasRestAfter [
63
Removed:
64
Removed:
^ sets anySatisfy: #hasRestAfter
65
Removed:
]
66
Removed:
67
Removed:
{ #category : 'testing' }
68
Removed:
MFTSetGroup >> hasVolume [
69
Removed:
70
Removed:
^ sets anySatisfy: #hasVolume
71
Removed:
]
72
Removed:
73
Removed:
{ #category : 'initialization' }
74
Removed:
MFTSetGroup >> initialize [
75
Removed:
76
Removed:
super initialize.
77
Removed:
sets := OrderedCollection new
78
Removed:
]
79
Removed:
80
Removed:
{ #category : 'accessing' }
81
Removed:
MFTSetGroup >> sets [
82
Removed:
83
Removed:
^ sets
84
Removed:
]
85
Removed:
86
Removed:
{ #category : 'accessing' }
87
Removed:
MFTSetGroup >> sets: aMFTSetCollection [
88
Removed:
89
Removed:
sets := aMFTSetCollection
90
Removed:
]
91
Removed:
92
Removed:
{ #category : 'initialization' }
93
Removed:
MFTSetGroup >> type [
94
Removed:
95
Removed:
| size |
96
Removed:
size := self uniqueExercisesInSets size.
97
Removed:
size = 0 ifTrue: [ ^ 'empty set group' ].
98
Removed:
size = 1 ifTrue: [ ^ 'regular set' ].
99
Removed:
size > 1 ifTrue: [ ^ 'superset' ]
100
Removed:
]
101
Removed:
102
Removed:
{ #category : 'testing' }
103
Removed:
MFTSetGroup >> uniqueExercisesInSets [
104
Removed:
"I answer unique exercises across all sets."
105
Removed:
106
Removed:
^ (sets collect: #exercise) asSet
107
Removed:
]
108
Removed:
109
Removed:
{ #category : 'accessing' }
110
Removed:
MFTSetGroup >> volume [
111
Removed:
112
Removed:
^ (sets collect: #volume) sum
113
Removed:
]
src/MyFitnessTracker-Core/MFTSetGroupPrescription.class.st
@@ -0,0 +1,54 @@
1
Added:
"
2
Added:
I represent a group of sets prescribed for a workout.
3
Added:
"
4
Added:
Class {
5
Added:
#name : 'MFTSetGroupPrescription',
6
Added:
#superclass : 'MFTObject',
7
Added:
#instVars : [
8
Added:
'sets'
9
Added:
],
10
Added:
#category : 'MyFitnessTracker-Core-Prescription',
11
Added:
#package : 'MyFitnessTracker-Core',
12
Added:
#tag : 'Prescription'
13
Added:
}
14
Added:
15
Added:
{ #category : 'as yet unclassified' }
16
Added:
MFTSetGroupPrescription class >> withSets: aMFTSetPrescriptionCollection [
17
Added:
18
Added:
^ self new
19
Added:
sets: aMFTSetPrescriptionCollection asOrderedCollection;
20
Added:
validate;
21
Added:
yourself
22
Added:
]
23
Added:
24
Added:
{ #category : 'initialization' }
25
Added:
MFTSetGroupPrescription >> initialize [
26
Added:
27
Added:
super initialize.
28
Added:
sets := OrderedCollection new
29
Added:
]
30
Added:
31
Added:
{ #category : 'accessing' }
32
Added:
MFTSetGroupPrescription >> sets [
33
Added:
34
Added:
^ sets
35
Added:
]
36
Added:
37
Added:
{ #category : 'accessing' }
38
Added:
MFTSetGroupPrescription >> sets: aMFTSetPrescriptionCollection [
39
Added:
40
Added:
sets := aMFTSetPrescriptionCollection
41
Added:
]
42
Added:
43
Added:
{ #category : 'testing' }
44
Added:
MFTSetGroupPrescription >> uniqueExercisesInSets [
45
Added:
"I answer unique exercises across all sets."
46
Added:
47
Added:
^ (sets collect: #exercise) asSet
48
Added:
]
49
Added:
50
Added:
{ #category : 'validation' }
51
Added:
MFTSetGroupPrescription >> validate [
52
Added:
53
Added:
self subclassResponsibility
54
Added:
]
src/MyFitnessTracker-Core/MFTSetLog.class.st
@@ -0,0 +1,93 @@
1
Added:
"
2
Added:
I represent a set logged against a prescription.
3
Added:
"
4
Added:
Class {
5
Added:
#name : 'MFTSetLog',
6
Added:
#superclass : 'MFTObject',
7
Added:
#instVars : [
8
Added:
'prescription',
9
Added:
'reps',
10
Added:
'load'
11
Added:
],
12
Added:
#category : 'MyFitnessTracker-Core-Logging',
13
Added:
#package : 'MyFitnessTracker-Core',
14
Added:
#tag : 'Logging'
15
Added:
}
16
Added:
17
Added:
{ #category : 'accessing' }
18
Added:
MFTSetLog class >> forPrescription: aMFTSetPrescription [
19
Added:
20
Added:
^ self new
21
Added:
prescription: aMFTSetPrescription;
22
Added:
yourself
23
Added:
]
24
Added:
25
Added:
{ #category : 'as yet unclassified' }
26
Added:
MFTSetLog class >> reps: anInteger load: aNumber [
27
Added:
28
Added:
^ self new
29
Added:
reps: anInteger;
30
Added:
load: aNumber;
31
Added:
yourself
32
Added:
]
33
Added:
34
Added:
{ #category : 'initialization' }
35
Added:
MFTSetLog >> canonicalName [
36
Added:
37
Added:
^ reps asString , '×' , load asString , ' '
38
Added:
, prescription exercise canonicalName
39
Added:
]
40
Added:
41
Added:
{ #category : 'accessing' }
42
Added:
MFTSetLog >> exercise [
43
Added:
44
Added:
^ prescription exercise
45
Added:
]
46
Added:
47
Added:
{ #category : 'as yet unclassified' }
48
Added:
MFTSetLog >> load [
49
Added:
50
Added:
^ load
51
Added:
]
52
Added:
53
Added:
{ #category : 'as yet unclassified' }
54
Added:
MFTSetLog >> load: aNumber [
55
Added:
56
Added:
load := aNumber
57
Added:
]
58
Added:
59
Added:
{ #category : 'as yet unclassified' }
60
Added:
MFTSetLog >> prescription [
61
Added:
62
Added:
^ prescription
63
Added:
]
64
Added:
65
Added:
{ #category : 'as yet unclassified' }
66
Added:
MFTSetLog >> prescription: aMFTSetPrescription [
67
Added:
68
Added:
prescription := aMFTSetPrescription
69
Added:
]
70
Added:
71
Added:
{ #category : 'as yet unclassified' }
72
Added:
MFTSetLog >> progressionDecision [
73
Added:
74
Added:
^ prescription repScheme progressionFor: reps
75
Added:
]
76
Added:
77
Added:
{ #category : 'as yet unclassified' }
78
Added:
MFTSetLog >> reps [
79
Added:
80
Added:
^ reps
81
Added:
]
82
Added:
83
Added:
{ #category : 'as yet unclassified' }
84
Added:
MFTSetLog >> reps: anInteger [
85
Added:
86
Added:
reps := anInteger
87
Added:
]
88
Added:
89
Added:
{ #category : 'as yet unclassified' }
90
Added:
MFTSetLog >> volume [
91
Added:
92
Added:
^ reps * load
93
Added:
]
src/MyFitnessTracker-Core/MFTSetPrescription.class.st
@@ -0,0 +1,68 @@
1
Added:
"
2
Added:
I represent an exercise set prescribed for a workout.
3
Added:
"
4
Added:
Class {
5
Added:
#name : 'MFTSetPrescription',
6
Added:
#superclass : 'MFTObject',
7
Added:
#instVars : [
8
Added:
'exercise',
9
Added:
'repScheme'
10
Added:
],
11
Added:
#category : 'MyFitnessTracker-Core-Prescription',
12
Added:
#package : 'MyFitnessTracker-Core',
13
Added:
#tag : 'Prescription'
14
Added:
}
15
Added:
16
Added:
{ #category : 'as yet unclassified' }
17
Added:
MFTSetPrescription class >> exercise: aMFTExercise [
18
Added:
19
Added:
^ self new
20
Added:
exercise: aMFTExercise;
21
Added:
yourself
22
Added:
]
23
Added:
24
Added:
{ #category : 'as yet unclassified' }
25
Added:
MFTSetPrescription class >> exercise: aMFTExercise repScheme: aMFTRepScheme [
26
Added:
27
Added:
^ self new
28
Added:
exercise: aMFTExercise;
29
Added:
repScheme: aMFTRepScheme;
30
Added:
yourself
31
Added:
]
32
Added:
33
Added:
{ #category : 'initialization' }
34
Added:
MFTSetPrescription >> canonicalName [
35
Added:
36
Added:
^ repScheme canonicalName , ' reps ' , exercise canonicalName
37
Added:
]
38
Added:
39
Added:
{ #category : 'accessing' }
40
Added:
MFTSetPrescription >> exercise [
41
Added:
42
Added:
^ exercise
43
Added:
]
44
Added:
45
Added:
{ #category : 'as yet unclassified' }
46
Added:
MFTSetPrescription >> exercise: aMFTExercise [
47
Added:
48
Added:
exercise := aMFTExercise
49
Added:
]
50
Added:
51
Added:
{ #category : 'as yet unclassified' }
52
Added:
MFTSetPrescription >> initialize [
53
Added:
54
Added:
super initialize.
55
Added:
repScheme := MFTRepScheme from: 6 to: 10
56
Added:
]
57
Added:
58
Added:
{ #category : 'as yet unclassified' }
59
Added:
MFTSetPrescription >> repScheme [
60
Added:
61
Added:
^ repScheme
62
Added:
]
63
Added:
64
Added:
{ #category : 'as yet unclassified' }
65
Added:
MFTSetPrescription >> repScheme: aMFTRepScheme [
66
Added:
67
Added:
repScheme := aMFTRepScheme
68
Added:
]
src/MyFitnessTracker-Core/MFTStraightSetGroupPrescription.class.st
@@ -0,0 +1,35 @@
1
Added:
"
2
Added:
I represent a single working set.
3
Added:
"
4
Added:
Class {
5
Added:
#name : 'MFTStraightSetGroupPrescription',
6
Added:
#superclass : 'MFTSetGroupPrescription',
7
Added:
#category : 'MyFitnessTracker-Core-Prescription',
8
Added:
#package : 'MyFitnessTracker-Core',
9
Added:
#tag : 'Prescription'
10
Added:
}
11
Added:
12
Added:
{ #category : 'as yet unclassified' }
13
Added:
MFTStraightSetGroupPrescription class >> withSet: aMFTSetPrescription [
14
Added:
15
Added:
^ self new
16
Added:
sets: (OrderedCollection with: aMFTSetPrescription);
17
Added:
validate;
18
Added:
yourself
19
Added:
]
20
Added:
21
Added:
{ #category : 'initialization' }
22
Added:
MFTStraightSetGroupPrescription >> canonicalName [
23
Added:
24
Added:
^ 'straight set'
25
Added:
]
26
Added:
27
Added:
{ #category : 'validation' }
28
Added:
MFTStraightSetGroupPrescription >> validate [
29
Added:
30
Added:
sets size = 1 ifFalse: [
31
Added:
self error: 'Straight group must have exactly 1 set.' ].
32
Added:
(sets allSatisfy: [ :each | each isKindOf: MFTSetPrescription ])
33
Added:
ifFalse: [
34
Added:
self error: 'All sets are not MFTSetPrescription subclasses.' ]
35
Added:
]
src/MyFitnessTracker-Core/MFTSupersetGroupPrescription.class.st
@@ -0,0 +1,23 @@
1
Added:
"
2
Added:
I represent many working sets to be performed with as little rest as possible between them.
3
Added:
"
4
Added:
Class {
5
Added:
#name : 'MFTSupersetGroupPrescription',
6
Added:
#superclass : 'MFTSetGroupPrescription',
7
Added:
#category : 'MyFitnessTracker-Core-Prescription',
8
Added:
#package : 'MyFitnessTracker-Core',
9
Added:
#tag : 'Prescription'
10
Added:
}
11
Added:
12
Added:
{ #category : 'initialization' }
13
Added:
MFTSupersetGroupPrescription >> canonicalName [
14
Added:
15
Added:
^ 'superset'
16
Added:
]
17
Added:
18
Added:
{ #category : 'validation' }
19
Added:
MFTSupersetGroupPrescription >> validate [
20
Added:
21
Added:
sets size >= 2 ifFalse: [
22
Added:
self error: 'Superset must have at least 2 sets.' ]
23
Added:
]
src/MyFitnessTracker-Core/MFTTrainee.class.st
@@ -7,8 +7,9 @@
7
7
#instVars : [
8
8
'routine'
9
9
],
10
Removed:
#category : 'MyFitnessTracker-Core',
11
Removed:
#package : 'MyFitnessTracker-Core'
10
Added:
#category : 'MyFitnessTracker-Core-Base',
11
Added:
#package : 'MyFitnessTracker-Core',
12
Added:
#tag : 'Base'
12
13
}
13
14
14
15
{ #category : 'as yet unclassified' }
src/MyFitnessTracker-Core/MFTWeight.class.st
@@ -1,83 +0,0 @@
1
Removed:
"
2
Removed:
I represent the weight of a user measured at a given date.
3
Removed:
"
4
Removed:
Class {
5
Removed:
#name : 'MFTWeight',
6
Removed:
#superclass : 'MFTObject',
7
Removed:
#instVars : [
8
Removed:
'date',
9
Removed:
'kilograms',
10
Removed:
'user'
11
Removed:
],
12
Removed:
#category : 'MyFitnessTracker-Core',
13
Removed:
#package : 'MyFitnessTracker-Core'
14
Removed:
}
15
Removed:
16
Removed:
{ #category : 'accessing' }
17
Removed:
MFTWeight class >> kilograms: aWeight date: aDate [
18
Removed:
19
Removed:
^ self new
20
Removed:
kilograms: aWeight;
21
Removed:
date: aDate;
22
Removed:
yourself
23
Removed:
]
24
Removed:
25
Removed:
{ #category : 'as yet unclassified' }
26
Removed:
MFTWeight class >> placeholderCollection [
27
Removed:
28
Removed:
^ OrderedCollection withAll: {
29
Removed:
(self kilograms: 90 date: (Date year: 2024 month: 1 day: 1)).
30
Removed:
(self kilograms: 91 date: (Date year: 2024 month: 1 day: 2)).
31
Removed:
(self kilograms: 92 date: (Date year: 2024 month: 1 day: 3)).
32
Removed:
(self kilograms: 93 date: (Date year: 2024 month: 1 day: 4)) }
33
Removed:
]
34
Removed:
35
Removed:
{ #category : 'initialization' }
36
Removed:
MFTWeight >> canonicalName [
37
Removed:
38
Removed:
^ kilograms, ' kilograms'
39
Removed:
]
40
Removed:
41
Removed:
{ #category : 'accessing' }
42
Removed:
MFTWeight >> date [
43
Removed:
44
Removed:
^ date
45
Removed:
]
46
Removed:
47
Removed:
{ #category : 'accessing' }
48
Removed:
MFTWeight >> date: anObject [
49
Removed:
50
Removed:
date := anObject
51
Removed:
]
52
Removed:
53
Removed:
{ #category : 'initialization' }
54
Removed:
MFTWeight >> initialize [
55
Removed:
56
Removed:
super initialize.
57
Removed:
kilograms := 0.
58
Removed:
date := Date new
59
Removed:
]
60
Removed:
61
Removed:
{ #category : 'accessing' }
62
Removed:
MFTWeight >> kilograms [
63
Removed:
64
Removed:
^ kilograms
65
Removed:
]
66
Removed:
67
Removed:
{ #category : 'accessing' }
68
Removed:
MFTWeight >> kilograms: anObject [
69
Removed:
70
Removed:
kilograms := anObject
71
Removed:
]
72
Removed:
73
Removed:
{ #category : 'accessing' }
74
Removed:
MFTWeight >> user [
75
Removed:
76
Removed:
^ user
77
Removed:
]
78
Removed:
79
Removed:
{ #category : 'accessing' }
80
Removed:
MFTWeight >> user: anObject [
81
Removed:
82
Removed:
user := anObject
83
Removed:
]
src/MyFitnessTracker-Core/MFTWorkout.class.st
@@ -1,247 +0,0 @@
1
Removed:
"
2
Removed:
I represent a user's workout.
3
Removed:
"
4
Removed:
Class {
5
Removed:
#name : 'MFTWorkout',
6
Removed:
#superclass : 'MFTActivity',
7
Removed:
#instVars : [
8
Removed:
'trainee',
9
Removed:
'setGroups',
10
Removed:
'routine'
11
Removed:
],
12
Removed:
#category : 'MyFitnessTracker-Core',
13
Removed:
#package : 'MyFitnessTracker-Core'
14
Removed:
}
15
Removed:
16
Removed:
{ #category : 'heavyDutyOne' }
17
Removed:
MFTWorkout class >> heavyDutyOneDay1 [
18
Removed:
19
Removed:
^ self new
20
Removed:
addSetGroup: (MFTSetGroup withSets: {
21
Removed:
(MFTSet exercise: MFTExercise dumbbellFly reps: 8 load: 80).
22
Removed:
(MFTSet exercise: MFTExercise inclinePress reps: 8 load: 80) });
23
Removed:
addSets: {
24
Removed:
(MFTSet exercise: MFTExercise lateralRaise reps: 12 load: 60).
25
Removed:
(MFTSet exercise: MFTExercise rearDeltFly reps: 12 load: 60) };
26
Removed:
addSetGroup: (MFTSetGroup withSets: {
27
Removed:
(MFTSet exercise: MFTExercise lyingFrenchPress reps: 8 load: 80).
28
Removed:
(MFTSet exercise: MFTExercise dip reps: 8 load: 0) })
29
Removed:
]
30
Removed:
31
Removed:
{ #category : 'heavyDutyOne' }
32
Removed:
MFTWorkout class >> heavyDutyOneDay2 [
33
Removed:
34
Removed:
^ self new
35
Removed:
addSetGroup: (MFTSetGroup withSets: {
36
Removed:
(MFTSet exercise: MFTExercise latPullover).
37
Removed:
(MFTSet exercise: MFTExercise closeGripPalmsUpPulldown) });
38
Removed:
addSet: (MFTSet exercise: MFTExercise bentOverBarbellRows);
39
Removed:
addSet: (MFTSet exercise: MFTExercise shrug);
40
Removed:
addSet: (MFTSet exercise: MFTExercise hyperextension);
41
Removed:
addSet: (MFTSet exercise: MFTExercise bicepCurl)
42
Removed:
]
43
Removed:
44
Removed:
{ #category : 'heavyDutyOne' }
45
Removed:
MFTWorkout class >> heavyDutyOneDay3 [
46
Removed:
47
Removed:
^ self new
48
Removed:
addSetGroup: (MFTSetGroup withSets: {
49
Removed:
(MFTSet exercise: MFTExercise legExtension).
50
Removed:
(MFTSet exercise: MFTExercise squat) });
51
Removed:
addSet: (MFTSet exercise: MFTExercise legCurl);
52
Removed:
addSet: (MFTSet exercise: MFTExercise calfRaise);
53
Removed:
addSet: (MFTSet exercise: MFTExercise sitUp)
54
Removed:
]
55
Removed:
56
Removed:
{ #category : 'placeholders' }
57
Removed:
MFTWorkout class >> placeholderForToday [
58
Removed:
59
Removed:
^ self new
60
Removed:
planned: Date today;
61
Removed:
setGroups: {
62
Removed:
(MFTSetGroup withSets: {
63
Removed:
(MFTSet new
64
Removed:
reps: 12;
65
Removed:
load: 140;
66
Removed:
exercise: MFTExercise legExtension).
67
Removed:
(MFTSet new
68
Removed:
reps: 8;
69
Removed:
load: 120;
70
Removed:
exercise: MFTExercise squat) }).
71
Removed:
(MFTSetGroup withSet: (MFTSet new
72
Removed:
reps: 10;
73
Removed:
load: 80;
74
Removed:
exercise: MFTExercise legCurl)) };
75
Removed:
yourself
76
Removed:
]
77
Removed:
78
Removed:
{ #category : 'placeholders' }
79
Removed:
MFTWorkout class >> placeholderForTomorrow [
80
Removed:
81
Removed:
^ self new
82
Removed:
planned: Date tomorrow;
83
Removed:
addSets: {
84
Removed:
(MFTSet new
85
Removed:
reps: 8;
86
Removed:
load: 120;
87
Removed:
exercise: MFTExercise barbellBenchPress).
88
Removed:
(MFTSet new
89
Removed:
reps: 8;
90
Removed:
load: 120;
91
Removed:
exercise: MFTExercise squat).
92
Removed:
(MFTSet new
93
Removed:
reps: 8;
94
Removed:
load: 110;
95
Removed:
exercise: MFTExercise latPulldown) };
96
Removed:
yourself
97
Removed:
]
98
Removed:
99
Removed:
{ #category : 'placeholders' }
100
Removed:
MFTWorkout class >> placeholderForYesterday [
101
Removed:
102
Removed:
^ self new
103
Removed:
planned: Date yesterday;
104
Removed:
completed: Date yesterday;
105
Removed:
setGroups: {
106
Removed:
(MFTSetGroup exercise: MFTExercise latPulldown sets: {
107
Removed:
(MFTSet reps: 6 load: 100).
108
Removed:
(MFTSet reps: 8 load: 120) }).
109
Removed:
(MFTSetGroup
110
Removed:
exercise: MFTExercise deadlift
111
Removed:
sets: { (MFTSet reps: 8 load: 120) }).
112
Removed:
(MFTSetGroup
113
Removed:
exercise: MFTExercise latPulldown
114
Removed:
sets: { (MFTSet reps: 8 load: 120) }) };
115
Removed:
yourself
116
Removed:
]
117
Removed:
118
Removed:
{ #category : 'adding' }
119
Removed:
MFTWorkout >> addSet: aMFTSet [
120
Removed:
"Automatically wrap MFTSet in a MFTSetGroup."
121
Removed:
122
Removed:
setGroups addLast: (MFTSetGroup withSet: aMFTSet)
123
Removed:
]
124
Removed:
125
Removed:
{ #category : 'adding' }
126
Removed:
MFTWorkout >> addSetGroup: aMFTSetGroup [
127
Removed:
128
Removed:
setGroups addLast: aMFTSetGroup
129
Removed:
]
130
Removed:
131
Removed:
{ #category : 'adding' }
132
Removed:
MFTWorkout >> addSetGroups: aMFTSetGroupCollection [
133
Removed:
134
Removed:
setGroups addAll: aMFTSetGroupCollection
135
Removed:
]
136
Removed:
137
Removed:
{ #category : 'adding' }
138
Removed:
MFTWorkout >> addSets: aMFTSetCollection [
139
Removed:
140
Removed:
aMFTSetCollection do: [ :set | self addSet: set ]
141
Removed:
]
142
Removed:
143
Removed:
{ #category : 'testing' }
144
Removed:
MFTWorkout >> allSetGroupsAreRegular [
145
Removed:
146
Removed:
^ self anySetGroupIsIrregular not
147
Removed:
]
148
Removed:
149
Removed:
{ #category : 'testing' }
150
Removed:
MFTWorkout >> anySetGroupIsIrregular [
151
Removed:
152
Removed:
^ setGroups anySatisfy: [ :setGroup | setGroup isRegularSetGroup not ]
153
Removed:
]
154
Removed:
155
Removed:
{ #category : 'testing' }
156
Removed:
MFTWorkout >> anySetHasLoad [
157
Removed:
158
Removed:
^ self sets anySatisfy: #hasLoad
159
Removed:
]
160
Removed:
161
Removed:
{ #category : 'testing' }
162
Removed:
MFTWorkout >> anySetHasVolume [
163
Removed:
164
Removed:
^ self sets anySatisfy: #hasVolume
165
Removed:
]
166
Removed:
167
Removed:
{ #category : 'initialization' }
168
Removed:
MFTWorkout >> canonicalName [
169
Removed:
170
Removed:
^ self status
171
Removed:
]
172
Removed:
173
Removed:
{ #category : 'initialization' }
174
Removed:
MFTWorkout >> initialize [
175
Removed:
176
Removed:
super initialize.
177
Removed:
setGroups := OrderedCollection new
178
Removed:
]
179
Removed:
180
Removed:
{ #category : 'accessing' }
181
Removed:
MFTWorkout >> routine [
182
Removed:
183
Removed:
^ routine
184
Removed:
]
185
Removed:
186
Removed:
{ #category : 'accessing' }
187
Removed:
MFTWorkout >> routine: aMFTWorkoutPlan [
188
Removed:
189
Removed:
routine := aMFTWorkoutPlan
190
Removed:
]
191
Removed:
192
Removed:
{ #category : 'accessing' }
193
Removed:
MFTWorkout >> setGroups [
194
Removed:
195
Removed:
^ setGroups
196
Removed:
]
197
Removed:
198
Removed:
{ #category : 'accessing' }
199
Removed:
MFTWorkout >> setGroups: aMFTSetGroupCollection [
200
Removed:
201
Removed:
setGroups := aMFTSetGroupCollection
202
Removed:
]
203
Removed:
204
Removed:
{ #category : 'accessing' }
205
Removed:
MFTWorkout >> sets [
206
Removed:
207
Removed:
^ setGroups flatCollect: #sets
208
Removed:
]
209
Removed:
210
Removed:
{ #category : 'accessing' }
211
Removed:
MFTWorkout >> sets: aMFTSetCollection [
212
Removed:
213
Removed:
| groups |
214
Removed:
groups := OrderedCollection new.
215
Removed:
(aMFTSetCollection groupedBy: #groupId) keysAndValuesDo: [
216
Removed:
:groupId
217
Removed:
:sets | groups add: (MFTSetGroup new sets: sets) ].
218
Removed:
self setGroups: groups
219
Removed:
]
220
Removed:
221
Removed:
{ #category : 'accessing' }
222
Removed:
MFTWorkout >> status [
223
Removed:
224
Removed:
self isCompleted ifTrue: [
225
Removed:
^ 'completed ' , self completed asDate asString ].
226
Removed:
self isLive ifTrue: [ ^ 'started ' , self started asDate asString ].
227
Removed:
self isPlanned ifTrue: [ ^ 'planned ' , self planned asDate asString ].
228
Removed:
^ 'no status'
229
Removed:
]
230
Removed:
231
Removed:
{ #category : 'accessing' }
232
Removed:
MFTWorkout >> trainee [
233
Removed:
234
Removed:
^ trainee
235
Removed:
]
236
Removed:
237
Removed:
{ #category : 'accessing' }
238
Removed:
MFTWorkout >> trainee: aMFTTrainee [
239
Removed:
240
Removed:
trainee := aMFTTrainee
241
Removed:
]
242
Removed:
243
Removed:
{ #category : 'accessing' }
244
Removed:
MFTWorkout >> volume [
245
Removed:
246
Removed:
^ (setGroups collect: #volume) sum
247
Removed:
]
src/MyFitnessTracker-Core/MFTWorkoutLog.class.st
@@ -0,0 +1,106 @@
1
Added:
"
2
Added:
I represent a workout logged against a prescription.
3
Added:
"
4
Added:
Class {
5
Added:
#name : 'MFTWorkoutLog',
6
Added:
#superclass : 'MFTObject',
7
Added:
#instVars : [
8
Added:
'prescription',
9
Added:
'start',
10
Added:
'finish',
11
Added:
'sets',
12
Added:
'trainee'
13
Added:
],
14
Added:
#category : 'MyFitnessTracker-Core-Logging',
15
Added:
#package : 'MyFitnessTracker-Core',
16
Added:
#tag : 'Logging'
17
Added:
}
18
Added:
19
Added:
{ #category : 'accessing' }
20
Added:
MFTWorkoutLog class >> forPrescription: aMFTWorkoutPrescription [
21
Added:
22
Added:
^ self new
23
Added:
prescription: aMFTWorkoutPrescription;
24
Added:
yourself
25
Added:
]
26
Added:
27
Added:
{ #category : 'initialization' }
28
Added:
MFTWorkoutLog >> canonicalName [
29
Added:
30
Added:
^ 'log for ' , prescription
31
Added:
]
32
Added:
33
Added:
{ #category : 'accessing' }
34
Added:
MFTWorkoutLog >> finish [
35
Added:
36
Added:
^ finish
37
Added:
]
38
Added:
39
Added:
{ #category : 'accessing' }
40
Added:
MFTWorkoutLog >> finish: aDateAndTime [
41
Added:
42
Added:
finish := aDateAndTime
43
Added:
]
44
Added:
45
Added:
{ #category : 'accessing' }
46
Added:
MFTWorkoutLog >> initialize [
47
Added:
48
Added:
super initialize.
49
Added:
sets := OrderedCollection new
50
Added:
]
51
Added:
52
Added:
{ #category : 'accessing' }
53
Added:
MFTWorkoutLog >> prescription [
54
Added:
55
Added:
^ prescription
56
Added:
]
57
Added:
58
Added:
{ #category : 'accessing' }
59
Added:
MFTWorkoutLog >> prescription: aMFTWorkoutPrescription [
60
Added:
61
Added:
prescription := aMFTWorkoutPrescription
62
Added:
]
63
Added:
64
Added:
{ #category : 'accessing' }
65
Added:
MFTWorkoutLog >> setForPrescription: aMFTSetPrescription [
66
Added:
67
Added:
^ sets
68
Added:
detect: [ :set | set prescription = aMFTSetPrescription ]
69
Added:
ifNone: [ MFTSetLog forPrescription: aMFTSetPrescription ]
70
Added:
]
71
Added:
72
Added:
{ #category : 'accessing' }
73
Added:
MFTWorkoutLog >> sets [
74
Added:
75
Added:
^ sets
76
Added:
]
77
Added:
78
Added:
{ #category : 'accessing' }
79
Added:
MFTWorkoutLog >> sets: aMFTSetLogCollection [
80
Added:
81
Added:
sets := aMFTSetLogCollection
82
Added:
]
83
Added:
84
Added:
{ #category : 'accessing' }
85
Added:
MFTWorkoutLog >> start [
86
Added:
87
Added:
^ start
88
Added:
]
89
Added:
90
Added:
{ #category : 'accessing' }
91
Added:
MFTWorkoutLog >> start: aDateAndTime [
92
Added:
93
Added:
start := aDateAndTime
94
Added:
]
95
Added:
96
Added:
{ #category : 'accessing' }
97
Added:
MFTWorkoutLog >> trainee [
98
Added:
99
Added:
^ trainee
100
Added:
]
101
Added:
102
Added:
{ #category : 'accessing' }
103
Added:
MFTWorkoutLog >> trainee: aMFTTrainee [
104
Added:
105
Added:
trainee := aMFTTrainee
106
Added:
]
src/MyFitnessTracker-Core/MFTWorkoutPrescription.class.st
@@ -0,0 +1,143 @@
1
Added:
"
2
Added:
I represent a prescribed workout.
3
Added:
"
4
Added:
Class {
5
Added:
#name : 'MFTWorkoutPrescription',
6
Added:
#superclass : 'MFTPrescription',
7
Added:
#instVars : [
8
Added:
'title',
9
Added:
'setGroups'
10
Added:
],
11
Added:
#category : 'MyFitnessTracker-Core-Prescription',
12
Added:
#package : 'MyFitnessTracker-Core',
13
Added:
#tag : 'Prescription'
14
Added:
}
15
Added:
16
Added:
{ #category : 'heavyDutyOne' }
17
Added:
MFTWorkoutPrescription class >> heavyDutyOneDay1 [
18
Added:
19
Added:
^ self new
20
Added:
title: 'Day 1';
21
Added:
prescribePreExhaustSuperset: {
22
Added:
(MFTSetPrescription exercise: MFTExercise dumbbellFly).
23
Added:
(MFTSetPrescription exercise: MFTExercise inclinePress) };
24
Added:
prescribeStraightSet:
25
Added:
(MFTSetPrescription exercise: MFTExercise lateralRaise);
26
Added:
prescribeStraightSet:
27
Added:
(MFTSetPrescription exercise: MFTExercise rearDeltFly);
28
Added:
prescribeSuperset: {
29
Added:
(MFTSetPrescription exercise: MFTExercise lyingFrenchPress).
30
Added:
(MFTSetPrescription exercise: MFTExercise dip) }
31
Added:
]
32
Added:
33
Added:
{ #category : 'as yet unclassified' }
34
Added:
MFTWorkoutPrescription class >> heavyDutyOneDay2 [
35
Added:
36
Added:
^ self new
37
Added:
title: 'Day 2';
38
Added:
prescribeSuperset: {
39
Added:
(MFTSetPrescription exercise: MFTExercise latPullover).
40
Added:
(MFTSetPrescription exercise:
41
Added:
MFTExercise closeGripPalmsUpPulldown) };
42
Added:
prescribeStraightSet:
43
Added:
(MFTSetPrescription exercise: MFTExercise bentOverBarbellRows);
44
Added:
prescribeStraightSet:
45
Added:
(MFTSetPrescription exercise: MFTExercise shrug);
46
Added:
prescribeStraightSet:
47
Added:
(MFTSetPrescription exercise: MFTExercise hyperextension);
48
Added:
prescribeStraightSet:
49
Added:
(MFTSetPrescription exercise: MFTExercise bicepCurl)
50
Added:
]
51
Added:
52
Added:
{ #category : 'as yet unclassified' }
53
Added:
MFTWorkoutPrescription class >> heavyDutyOneDay3 [
54
Added:
55
Added:
^ self new
56
Added:
title: 'Day 3';
57
Added:
prescribeSuperset: {
58
Added:
(MFTSetPrescription exercise: MFTExercise legExtension).
59
Added:
(MFTSetPrescription exercise: MFTExercise squat) };
60
Added:
prescribeStraightSet:
61
Added:
(MFTSetPrescription exercise: MFTExercise legCurl);
62
Added:
prescribeStraightSet:
63
Added:
(MFTSetPrescription exercise: MFTExercise calfRaise);
64
Added:
prescribeStraightSet:
65
Added:
(MFTSetPrescription exercise: MFTExercise sitUp)
66
Added:
]
67
Added:
68
Added:
{ #category : 'initialization' }
69
Added:
MFTWorkoutPrescription >> canonicalName [
70
Added:
71
Added:
^ title
72
Added:
]
73
Added:
74
Added:
{ #category : 'accessing' }
75
Added:
MFTWorkoutPrescription >> duration [
76
Added:
77
Added:
^ Duration zero
78
Added:
]
79
Added:
80
Added:
{ #category : 'as yet unclassified' }
81
Added:
MFTWorkoutPrescription >> initialize [
82
Added:
83
Added:
super initialize.
84
Added:
setGroups := OrderedCollection new
85
Added:
]
86
Added:
87
Added:
{ #category : 'testing' }
88
Added:
MFTWorkoutPrescription >> isWorkout [
89
Added:
90
Added:
^ true
91
Added:
]
92
Added:
93
Added:
{ #category : 'as yet unclassified' }
94
Added:
MFTWorkoutPrescription >> prescribePreExhaustSuperset: aMFTSetPrescriptionCollection [
95
Added:
96
Added:
setGroups addLast: (MFTPreExhaustSupersetGroupPrescription withSets:
97
Added:
aMFTSetPrescriptionCollection)
98
Added:
]
99
Added:
100
Added:
{ #category : 'as yet unclassified' }
101
Added:
MFTWorkoutPrescription >> prescribeStraightSet: aMFTSetPrescription [
102
Added:
103
Added:
setGroups addLast:
104
Added:
(MFTStraightSetGroupPrescription withSet: aMFTSetPrescription)
105
Added:
]
106
Added:
107
Added:
{ #category : 'as yet unclassified' }
108
Added:
MFTWorkoutPrescription >> prescribeSuperset: aMFTSetPrescriptionCollection [
109
Added:
110
Added:
setGroups addLast:
111
Added:
(MFTSupersetGroupPrescription withSets:
112
Added:
aMFTSetPrescriptionCollection)
113
Added:
]
114
Added:
115
Added:
{ #category : 'as yet unclassified' }
116
Added:
MFTWorkoutPrescription >> setGroups [
117
Added:
118
Added:
^ setGroups
119
Added:
]
120
Added:
121
Added:
{ #category : 'as yet unclassified' }
122
Added:
MFTWorkoutPrescription >> setGroups: aMFTSetGroupCollection [
123
Added:
124
Added:
setGroups := aMFTSetGroupCollection
125
Added:
]
126
Added:
127
Added:
{ #category : 'as yet unclassified' }
128
Added:
MFTWorkoutPrescription >> sets [
129
Added:
130
Added:
^ setGroups flatCollect: #sets
131
Added:
]
132
Added:
133
Added:
{ #category : 'as yet unclassified' }
134
Added:
MFTWorkoutPrescription >> title [
135
Added:
136
Added:
^ title
137
Added:
]
138
Added:
139
Added:
{ #category : 'as yet unclassified' }
140
Added:
MFTWorkoutPrescription >> title: aString [
141
Added:
142
Added:
title := aString
143
Added:
]