[Pharo] Personal fitness tracker web app.
Update core.
Changed files
- src/MyFitnessTracker-Core/MFTEquipment.class.st
- src/MyFitnessTracker-Core/MFTExercise.class.st
- src/MyFitnessTracker-Core/MFTMuscleGroup.class.st
- src/MyFitnessTracker-Core/MFTObject.class.st
- src/MyFitnessTracker-Core/MFTSet.class.st
- src/MyFitnessTracker-Core/MFTSetGroup.class.st
- src/MyFitnessTracker-Core/MFTTrainee.class.st
- src/MyFitnessTracker-Core/MFTUser.class.st
- src/MyFitnessTracker-Core/MFTWeight.class.st
- src/MyFitnessTracker-Core/MFTWorkout.class.st
- src/MyFitnessTracker-Core/MFTWorkoutPlan.class.st
src/MyFitnessTracker-Core/MFTEquipment.class.st
@@ -12,10 +12,22 @@
12
12
}
13
13
14
14
{ #category : 'as yet unclassified' }
15
Added:
MFTEquipment class >> barbell [
16
Added:
17
Added:
^ self newWithEnglishName
18
Added:
]
19
Added:
20
Added:
{ #category : 'as yet unclassified' }
15
21
MFTEquipment class >> dumbell [
16
22
17
Removed:
^ self
18
Removed:
newWithEnglishName;
23
Added:
^ self newWithEnglishName
24
Added:
]
25
Added:
26
Added:
{ #category : 'as yet unclassified' }
27
Added:
MFTEquipment class >> ezBar [
28
Added:
29
Added:
^ self new
30
Added:
englishName: 'EZ bar';
19
31
yourself
20
32
]
21
33
@@ -27,11 +39,21 @@
27
39
equipmentNameFromSender := (thisContext sender selector
28
40
splitCamelCase collect: #asLowercase)
29
41
joinUsing: Character space.
30
Removed:
^ self new
31
Removed:
englishName: equipmentNameFromSender;
32
Removed:
yourself
42
Added:
^ self new englishName: equipmentNameFromSender
33
43
]
34
44
45
Added:
{ #category : 'as yet unclassified' }
46
Added:
MFTEquipment class >> pecDeck [
47
Added:
48
Added:
^ self newWithEnglishName
49
Added:
]
50
Added:
51
Added:
{ #category : 'initialization' }
52
Added:
MFTEquipment >> canonicalName [
53
Added:
54
Added:
^ englishName
55
Added:
]
56
Added:
35
57
{ #category : 'accessing' }
36
58
MFTEquipment >> englishName [
37
59
@@ -39,7 +61,7 @@
39
61
]
40
62
41
63
{ #category : 'accessing' }
42
Removed:
MFTEquipment >> englishName: anObject [
64
Added:
MFTEquipment >> englishName: aString [
43
65
44
Removed:
englishName := anObject
66
Added:
englishName := aString
45
67
]
src/MyFitnessTracker-Core/MFTExercise.class.st
@@ -21,12 +21,12 @@
21
21
}
22
22
23
23
{ #category : 'benchmarking' }
24
Removed:
MFTExercise class >> benchPress [
24
Added:
MFTExercise class >> barbellBenchPress [
25
25
26
26
^ self newWithEnglishName
27
Added:
equipment: MFTEquipment barbell;
27
28
activates: MFTMuscle pectoralisMajor percent: 100;
28
Removed:
activates: MFTMuscle pectoralisMinor percent: 80;
29
Removed:
yourself
29
Added:
activates: MFTMuscle pectoralisMinor percent: 80
30
30
]
31
31
32
32
{ #category : 'benchmarking' }
@@ -34,8 +34,7 @@
34
34
35
35
^ self newWithEnglishName
36
36
activates: MFTMuscle bicepsBrachii percent: 100;
37
Removed:
activates: MFTMuscle brachioRadialis percent: 80;
38
Removed:
yourself
37
Added:
activates: MFTMuscle brachioRadialis percent: 80
39
38
]
40
39
41
40
{ #category : 'benchmarking' }
@@ -43,54 +42,88 @@
43
42
44
43
^ self newWithEnglishName
45
44
activates: MFTMuscle latissimusDorsi percent: 60;
46
Removed:
activates: MFTMuscle deltoidPosterior percent: 70;
47
Removed:
yourself
45
Added:
activates: MFTMuscle deltoidPosterior percent: 70
48
46
]
49
47
50
Removed:
{ #category : 'benchmarking' }
51
Removed:
MFTExercise class >> cleanAndJerk [
48
Added:
{ #category : 'compound' }
49
Added:
MFTExercise class >> deadlift [
52
50
53
Removed:
^ self newWithEnglishName yourself
51
Added:
^ self newWithEnglishName
52
Added:
activates: MFTMuscle latissimusDorsi
53
Added:
percent: 80
54
54
]
55
55
56
Added:
{ #category : 'as yet unclassified' }
57
Added:
MFTExercise class >> dip [
58
Added:
59
Added:
^ self newWithEnglishName
60
Added:
]
61
Added:
56
62
{ #category : 'benchmarking' }
57
Removed:
MFTExercise class >> deadlift [
63
Added:
MFTExercise class >> dumbbellBenchPress [
58
64
59
65
^ self newWithEnglishName
60
Removed:
activates: MFTMuscle latissimusDorsi percent: 80;
61
Removed:
yourself
66
Added:
equipment: MFTEquipment dumbell;
67
Added:
activates: MFTMuscle pectoralisMajor percent: 100;
68
Added:
activates: MFTMuscle pectoralisMinor percent: 80
62
69
]
63
70
64
71
{ #category : 'benchmarking' }
72
Added:
MFTExercise class >> dumbbellFly [
73
Added:
74
Added:
^ self newWithEnglishName equipment: MFTEquipment dumbell
75
Added:
]
76
Added:
77
Added:
{ #category : 'benchmarking' }
65
78
MFTExercise class >> gobletSquat [
66
79
67
Removed:
^ self newWithEnglishName yourself
80
Added:
^ self newWithEnglishName equipment: MFTEquipment dumbell
68
81
]
69
82
70
83
{ #category : 'benchmarking' }
71
84
MFTExercise class >> hammerCurl [
72
85
73
Removed:
^ self newWithEnglishName yourself
86
Added:
^ self newWithEnglishName
74
87
]
75
88
76
89
{ #category : 'benchmarking' }
90
Added:
MFTExercise class >> inclinePress [
91
Added:
92
Added:
^ self newWithEnglishName
93
Added:
]
94
Added:
95
Added:
{ #category : 'benchmarking' }
77
96
MFTExercise class >> latPulldown [
78
97
79
Removed:
^ self newWithEnglishName yourself
98
Added:
^ self newWithEnglishName
80
99
]
81
100
82
101
{ #category : 'benchmarking' }
102
Added:
MFTExercise class >> lateralRaise [
103
Added:
104
Added:
^ self newWithEnglishName
105
Added:
activatesAll: MFTMuscleGroup shoulder muscles
106
Added:
percent: 90
107
Added:
]
108
Added:
109
Added:
{ #category : 'benchmarking' }
83
110
MFTExercise class >> legCurl [
84
111
85
Removed:
^ self newWithEnglishName yourself
112
Added:
^ self newWithEnglishName
86
113
]
87
114
88
115
{ #category : 'benchmarking' }
89
116
MFTExercise class >> legExtension [
90
117
91
Removed:
^ self newWithEnglishName yourself
118
Added:
^ self newWithEnglishName
92
119
]
93
120
121
Added:
{ #category : 'as yet unclassified' }
122
Added:
MFTExercise class >> lyingFrenchPress [
123
Added:
124
Added:
^ self newWithEnglishName equipment: MFTEquipment ezBar
125
Added:
]
126
Added:
94
127
{ #category : 'benchmarking' }
95
128
MFTExercise class >> newWithEnglishName [
96
129
"I return a MFTExercise instance for which englishName is set to the calling method selector, as a space-separated string."
@@ -99,42 +132,35 @@
99
132
exerciseNameFromSender := (thisContext sender selector splitCamelCase
100
133
collect: #asLowercase) joinUsing:
101
134
Character space.
102
Removed:
^ self new
103
Removed:
englishName: exerciseNameFromSender;
104
Removed:
yourself
135
Added:
^ self new englishName: exerciseNameFromSender
105
136
]
106
137
107
138
{ #category : 'benchmarking' }
108
Removed:
MFTExercise class >> shoulderPressDumbell [
139
Added:
MFTExercise class >> rearDeltFly [
109
140
110
Removed:
^ self new
111
Removed:
englishName: 'shoulder press (dumbell)';
112
Removed:
activates: MFTMuscle deltoidAnterior percent: 90;
113
Removed:
activates: MFTMuscle deltoidMedial percent: 60;
114
Removed:
equipment: MFTEquipment dumbell;
115
Removed:
yourself
141
Added:
^ self newWithEnglishName equipment: MFTEquipment pecDeck
116
142
]
117
143
118
Removed:
{ #category : 'benchmarking' }
119
Removed:
MFTExercise class >> snatch [
144
Added:
{ #category : 'shoulder' }
145
Added:
MFTExercise class >> shoulderPressDumbell [
120
146
121
Removed:
^ self newWithEnglishName
122
Removed:
activates: MFTMuscle quadricepsFemoris percent: 100;
123
Removed:
activates: MFTMuscle trapezius percent: 90;
124
Removed:
activates: MFTMuscle deltoidPosterior percent: 80;
125
Removed:
yourself
147
Added:
^ self register: (self new
148
Added:
englishName: 'shoulder press (dumbell)';
149
Added:
activates: MFTMuscle deltoidAnterior percent: 90;
150
Added:
activates: MFTMuscle deltoidMedial percent: 60;
151
Added:
equipment: MFTEquipment dumbell)
126
152
]
127
153
128
Removed:
{ #category : 'benchmarking' }
154
Added:
{ #category : 'compound' }
129
155
MFTExercise class >> squat [
130
156
131
Removed:
^ self newWithEnglishName yourself
157
Added:
^ self newWithEnglishName
132
158
]
133
159
134
160
{ #category : 'benchmarking' }
135
161
MFTExercise class >> tricepExtension [
136
162
137
Removed:
^ self newWithEnglishName yourself
163
Added:
^ self newWithEnglishName
138
164
]
139
165
140
166
{ #category : 'accessing' }
@@ -150,6 +176,13 @@
150
176
]
151
177
152
178
{ #category : 'accessing' }
179
Added:
MFTExercise >> activatesAll: aMFTMuscleCollection percent: aPercent [
180
Added:
181
Added:
aMFTMuscleCollection do: [ :muscle |
182
Added:
activatedMuscles at: muscle put: aPercent ]
183
Added:
]
184
Added:
185
Added:
{ #category : 'accessing' }
153
186
MFTExercise >> canonicalName [
154
187
155
188
^ englishName
@@ -174,9 +207,9 @@
174
207
]
175
208
176
209
{ #category : 'accessing' }
177
Removed:
MFTExercise >> equipment: anMFTEquipment [
210
Added:
MFTExercise >> equipment: aMFTEquipment [
178
211
179
Removed:
equipment := anMFTEquipment
212
Added:
equipment := aMFTEquipment
180
213
]
181
214
182
215
{ #category : 'accessing' }
src/MyFitnessTracker-Core/MFTMuscleGroup.class.st
@@ -7,8 +7,7 @@
7
7
#instVars : [
8
8
'englishName',
9
9
'frenchName',
10
Removed:
'muscles',
11
Removed:
'description'
10
Added:
'muscles'
12
11
],
13
12
#category : 'MyFitnessTracker-Core',
14
13
#package : 'MyFitnessTracker-Core'
@@ -133,36 +132,24 @@
133
132
]
134
133
135
134
{ #category : 'accessing' }
136
Removed:
MFTMuscleGroup >> description [
137
Removed:
138
Removed:
^ description
139
Removed:
]
140
Removed:
141
Removed:
{ #category : 'accessing' }
142
Removed:
MFTMuscleGroup >> description: aString [
143
Removed:
144
Removed:
description := aString
145
Removed:
]
146
Removed:
147
Removed:
{ #category : 'as yet unclassified' }
148
135
MFTMuscleGroup >> englishName [
149
136
150
137
^ englishName
151
138
]
152
139
153
Removed:
{ #category : 'as yet unclassified' }
140
Added:
{ #category : 'accessing' }
154
141
MFTMuscleGroup >> englishName: aString [
155
142
156
143
englishName := aString
157
144
]
158
145
159
Removed:
{ #category : 'as yet unclassified' }
146
Added:
{ #category : 'accessing' }
160
147
MFTMuscleGroup >> frenchName [
161
148
162
149
^ frenchName
163
150
]
164
151
165
Removed:
{ #category : 'as yet unclassified' }
152
Added:
{ #category : 'accessing' }
166
153
MFTMuscleGroup >> frenchName: anObject [
167
154
168
155
frenchName := anObject
@@ -174,17 +161,16 @@
174
161
super initialize.
175
162
englishName := String new.
176
163
frenchName := String new.
177
Removed:
description := String new.
178
164
muscles := OrderedCollection new
179
165
]
180
166
181
Removed:
{ #category : 'as yet unclassified' }
167
Added:
{ #category : 'accessing' }
182
168
MFTMuscleGroup >> muscles [
183
169
184
170
^ muscles
185
171
]
186
172
187
Removed:
{ #category : 'as yet unclassified' }
173
Added:
{ #category : 'accessing' }
188
174
MFTMuscleGroup >> muscles: anObject [
189
175
190
176
muscles := anObject
src/MyFitnessTracker-Core/MFTObject.class.st
@@ -11,6 +11,12 @@
11
11
#package : 'MyFitnessTracker-Core'
12
12
}
13
13
14
Added:
{ #category : 'initialization' }
15
Added:
MFTObject >> canonicalName [
16
Added:
17
Added:
^ self subclassResponsibility
18
Added:
]
19
Added:
14
20
{ #category : 'accessing' }
15
21
MFTObject >> id [
16
22
@@ -21,4 +27,10 @@
21
27
MFTObject >> id: anObject [
22
28
23
29
id := anObject
30
Added:
]
31
Added:
32
Added:
{ #category : 'initialization' }
33
Added:
MFTObject >> printOn: aStream [
34
Added:
35
Added:
aStream nextPutAll: self canonicalName
24
36
]
src/MyFitnessTracker-Core/MFTSet.class.st
@@ -1,20 +1,44 @@
1
1
"
2
Removed:
I represent a working set within a workout.
2
Added:
I represent an exercise set performed during a workout.
3
3
"
4
4
Class {
5
5
#name : 'MFTSet',
6
6
#superclass : 'MFTObject',
7
7
#instVars : [
8
Added:
'exercise',
8
9
'reps',
9
10
'load',
10
Removed:
'workout',
11
Removed:
'exercise',
12
11
'setGroup'
13
12
],
14
13
#category : 'MyFitnessTracker-Core',
15
14
#package : 'MyFitnessTracker-Core'
16
15
}
17
16
17
Added:
{ #category : 'as yet unclassified' }
18
Added:
MFTSet class >> exercise: aMFTExercise reps: anInteger load: aNumber [
19
Added:
20
Added:
^ self new
21
Added:
exercise: aMFTExercise;
22
Added:
reps: anInteger;
23
Added:
load: aNumber;
24
Added:
yourself
25
Added:
]
26
Added:
27
Added:
{ #category : 'as yet unclassified' }
28
Added:
MFTSet class >> reps: anInteger load: aNumber [
29
Added:
30
Added:
^ self new
31
Added:
reps: anInteger;
32
Added:
load: aNumber;
33
Added:
yourself
34
Added:
]
35
Added:
36
Added:
{ #category : 'initialization' }
37
Added:
MFTSet >> canonicalName [
38
Added:
39
Added:
^ reps asString , '×' , load asString , ' ' , exercise canonicalName
40
Added:
]
41
Added:
18
42
{ #category : 'accessing' }
19
43
MFTSet >> exercise [
20
44
@@ -22,9 +46,9 @@
22
46
]
23
47
24
48
{ #category : 'accessing' }
25
Removed:
MFTSet >> exercise: anObject [
49
Added:
MFTSet >> exercise: aMFTExercise [
26
50
27
Removed:
exercise := anObject
51
Added:
exercise := aMFTExercise
28
52
]
29
53
30
54
{ #category : 'testing' }
@@ -46,9 +70,9 @@
46
70
]
47
71
48
72
{ #category : 'accessing' }
49
Removed:
MFTSet >> load: anObject [
73
Added:
MFTSet >> load: aNumber [
50
74
51
Removed:
load := anObject
75
Added:
load := aNumber
52
76
]
53
77
54
78
{ #category : 'accessing' }
@@ -58,9 +82,9 @@
58
82
]
59
83
60
84
{ #category : 'accessing' }
61
Removed:
MFTSet >> reps: anObject [
85
Added:
MFTSet >> reps: anInteger [
62
86
63
Removed:
reps := anObject
87
Added:
reps := anInteger
64
88
]
65
89
66
90
{ #category : 'accessing' }
@@ -85,11 +109,5 @@
85
109
{ #category : 'accessing' }
86
110
MFTSet >> workout [
87
111
88
Removed:
^ workout
89
Removed:
]
90
Removed:
91
Removed:
{ #category : 'accessing' }
92
Removed:
MFTSet >> workout: anObject [
93
Removed:
94
Removed:
workout := anObject
112
Added:
^ self setGroup workout
95
113
]
src/MyFitnessTracker-Core/MFTSetGroup.class.st
@@ -12,23 +12,13 @@
12
12
}
13
13
14
14
{ #category : 'as yet unclassified' }
15
Removed:
MFTSetGroup class >> superset: aMFTWorkoutSet1 and: aMFTWorkoutSet2 [
15
Added:
MFTSetGroup class >> exercise: aMFTExercise sets: aMFTSetCollection [
16
16
17
Removed:
^ self new sets: {
18
Removed:
aMFTWorkoutSet1.
19
Removed:
aMFTWorkoutSet2 }
17
Added:
^ self withSets:
18
Added:
(aMFTSetCollection collect: [ :set | set exercise: aMFTExercise ])
20
19
]
21
20
22
21
{ #category : 'as yet unclassified' }
23
Removed:
MFTSetGroup class >> triset: aMFTWorkoutSet1 and: aMFTWorkoutSet2 and: aMFTWorkoutSet3 [
24
Removed:
25
Removed:
^ self new sets: {
26
Removed:
aMFTWorkoutSet1.
27
Removed:
aMFTWorkoutSet2.
28
Removed:
aMFTWorkoutSet3 }
29
Removed:
]
30
Removed:
31
Removed:
{ #category : 'as yet unclassified' }
32
22
MFTSetGroup class >> withSet: aMFTWorkoutSet [
33
23
34
24
^ self new
@@ -57,32 +47,11 @@
57
47
]
58
48
59
49
{ #category : 'initialization' }
60
Removed:
MFTSetGroup >> description [
50
Added:
MFTSetGroup >> canonicalName [
61
51
62
Removed:
^ 'FIXME'
63
Removed:
"self isSuperset ifTrue: [
64
Removed:
| ex1 ex2 |
65
Removed:
ex1 := sets first exercise.
66
Removed:
ex2 := sets second exercise.
67
Removed:
ex1 primaryMuscleGroupId = ex2 primaryMuscleGroupId ifTrue: [
68
Removed:
^ 'agonist superset ({1})' format:
69
Removed:
{ ex1 primaryMuscleGroup englishName } ].
70
Removed:
(MFTMuscleGroup antagonistIds includes: {
71
Removed:
ex1 primaryMuscleGroupId.
72
Removed:
ex2 primaryMuscleGroupId } asSet) ifTrue: [
73
Removed:
^ 'antagonist superset' ].
74
Removed:
^ 'superset' ].
75
Removed:
self isTriSet ifTrue: [ ^ 'tri-set' ].
76
Removed:
self isGiantSet ifTrue: [ ^ 'giant set' ].
77
Removed:
^ 'regular set'"
52
Added:
^ self type
78
53
]
79
54
80
Removed:
{ #category : 'as yet unclassified' }
81
Removed:
MFTSetGroup >> duplicateSet: aMFTSet [
82
Removed:
83
Removed:
sets add: aMFTSet after: aMFTSet
84
Removed:
]
85
Removed:
86
55
{ #category : 'testing' }
87
56
MFTSetGroup >> hasLoad [
88
57
@@ -96,12 +65,6 @@
96
65
]
97
66
98
67
{ #category : 'testing' }
99
Removed:
MFTSetGroup >> hasRpe [
100
Removed:
101
Removed:
^ sets anySatisfy: #hasRpe
102
Removed:
]
103
Removed:
104
Removed:
{ #category : 'testing' }
105
68
MFTSetGroup >> hasVolume [
106
69
107
70
^ sets anySatisfy: #hasVolume
@@ -114,48 +77,6 @@
114
77
sets := OrderedCollection new
115
78
]
116
79
117
Removed:
{ #category : 'testing' }
118
Removed:
MFTSetGroup >> isGiantSet [
119
Removed:
120
Removed:
^ self uniqueExercisesInSets >= 4
121
Removed:
]
122
Removed:
123
Removed:
{ #category : 'testing' }
124
Removed:
MFTSetGroup >> isIrregularSetGroup [
125
Removed:
126
Removed:
^ self isRegularSetGroup not
127
Removed:
]
128
Removed:
129
Removed:
{ #category : 'testing' }
130
Removed:
MFTSetGroup >> isRegularSetGroup [
131
Removed:
132
Removed:
^ self uniqueExercisesInSets = 1
133
Removed:
]
134
Removed:
135
Removed:
{ #category : 'testing' }
136
Removed:
MFTSetGroup >> isSuperset [
137
Removed:
138
Removed:
^ self uniqueExercisesInSets = 2
139
Removed:
]
140
Removed:
141
Removed:
{ #category : 'testing' }
142
Removed:
MFTSetGroup >> isTriSet [
143
Removed:
144
Removed:
^ self uniqueExercisesInSets = 3
145
Removed:
]
146
Removed:
147
Removed:
{ #category : 'adding' }
148
Removed:
MFTSetGroup >> removeSet: aMFTSet [
149
Removed:
150
Removed:
sets remove: aMFTSet
151
Removed:
]
152
Removed:
153
Removed:
{ #category : 'adding' }
154
Removed:
MFTSetGroup >> removeSets: aMFTSetCollection [
155
Removed:
156
Removed:
sets removeAll: aMFTSetCollection
157
Removed:
]
158
Removed:
159
80
{ #category : 'accessing' }
160
81
MFTSetGroup >> sets [
161
82
@@ -171,37 +92,21 @@
171
92
{ #category : 'initialization' }
172
93
MFTSetGroup >> type [
173
94
174
Removed:
self isSuperset ifTrue: [ ^ 'superset' ].
175
Removed:
self isTriSet ifTrue: [ ^ 'tri-set' ].
176
Removed:
self isGiantSet ifTrue: [ ^ 'giant set' ].
177
Removed:
^ 'regular set'
95
Added:
| size |
96
Added:
size := self uniqueExercisesInSets size.
97
Added:
size = 0 ifTrue: [ ^ 'empty set group' ].
98
Added:
size = 1 ifTrue: [ ^ 'regular set' ].
99
Added:
size > 1 ifTrue: [ ^ 'superset' ]
178
100
]
179
101
180
102
{ #category : 'testing' }
181
103
MFTSetGroup >> uniqueExercisesInSets [
182
Removed:
"I answer the amount of unique exercises in all sets."
104
Added:
"I answer unique exercises across all sets."
183
105
184
Removed:
| uniqueExerciseIds |
185
Removed:
uniqueExerciseIds := (sets collect: [ :set |
186
Removed:
set exercise canonicalName ]) asSet.
187
Removed:
^ uniqueExerciseIds size
106
Added:
^ (sets collect: #exercise) asSet
188
107
]
189
108
190
Removed:
{ #category : 'as yet unclassified' }
191
Removed:
MFTSetGroup >> updateSet: aMFTSet1 with: aMFTSet2 [
192
Removed:
193
Removed:
sets at: (sets indexOf: aMFTSet1) put: aMFTSet2
194
Removed:
]
195
Removed:
196
Removed:
{ #category : 'as yet unclassified' }
197
Removed:
MFTSetGroup >> updateSets: aMFTSetCollection1 with: aMFTSetCollection2 [
198
Removed:
199
Removed:
aMFTSetCollection1
200
Removed:
with: aMFTSetCollection2
201
Removed:
do: [ :oldSet :newSet | self updateSet: oldSet with: newSet ]
202
Removed:
]
203
Removed:
204
Removed:
{ #category : 'as yet unclassified' }
109
Added:
{ #category : 'accessing' }
205
110
MFTSetGroup >> volume [
206
111
207
112
^ (sets collect: #volume) sum
src/MyFitnessTracker-Core/MFTTrainee.class.st
@@ -0,0 +1,45 @@
1
Added:
"
2
Added:
I represent a user of MFT.
3
Added:
"
4
Added:
Class {
5
Added:
#name : 'MFTTrainee',
6
Added:
#superclass : 'MFTObject',
7
Added:
#instVars : [
8
Added:
'workoutPlan'
9
Added:
],
10
Added:
#category : 'MyFitnessTracker-Core',
11
Added:
#package : 'MyFitnessTracker-Core'
12
Added:
}
13
Added:
14
Added:
{ #category : 'as yet unclassified' }
15
Added:
MFTTrainee class >> newDefault [
16
Added:
17
Added:
^ self new
18
Added:
workoutPlan: MFTWorkoutPlan placeholder;
19
Added:
yourself
20
Added:
]
21
Added:
22
Added:
{ #category : 'initialization' }
23
Added:
MFTTrainee >> canonicalName [
24
Added:
25
Added:
^ 'trainee'
26
Added:
]
27
Added:
28
Added:
{ #category : 'initialization' }
29
Added:
MFTTrainee >> initialize [
30
Added:
31
Added:
super initialize.
32
Added:
workoutPlan := MFTWorkoutPlan new
33
Added:
]
34
Added:
35
Added:
{ #category : 'accessing' }
36
Added:
MFTTrainee >> workoutPlan [
37
Added:
38
Added:
^ workoutPlan
39
Added:
]
40
Added:
41
Added:
{ #category : 'accessing' }
42
Added:
MFTTrainee >> workoutPlan: aMFTWorkoutPlan [
43
Added:
44
Added:
workoutPlan := aMFTWorkoutPlan
45
Added:
]
src/MyFitnessTracker-Core/MFTUser.class.st
@@ -1,198 +0,0 @@
1
Removed:
"
2
Removed:
I represent a user of MFT.
3
Removed:
"
4
Removed:
Class {
5
Removed:
#name : 'MFTUser',
6
Removed:
#superclass : 'MFTObject',
7
Removed:
#instVars : [
8
Removed:
'username',
9
Removed:
'passwordHash',
10
Removed:
'realFirstName',
11
Removed:
'realLastName',
12
Removed:
'dateOfBirth',
13
Removed:
'isLoggedIn',
14
Removed:
'lastLoginDateAndTime',
15
Removed:
'accountRegisterDateAndTime',
16
Removed:
'workouts',
17
Removed:
'weights'
18
Removed:
],
19
Removed:
#category : 'MyFitnessTracker-Core',
20
Removed:
#package : 'MyFitnessTracker-Core'
21
Removed:
}
22
Removed:
23
Removed:
{ #category : 'as yet unclassified' }
24
Removed:
MFTUser class >> defaultReps [
25
Removed:
26
Removed:
^ 8
27
Removed:
]
28
Removed:
29
Removed:
{ #category : 'as yet unclassified' }
30
Removed:
MFTUser class >> defaultRpe [
31
Removed:
32
Removed:
^ 6
33
Removed:
]
34
Removed:
35
Removed:
{ #category : 'as yet unclassified' }
36
Removed:
MFTUser class >> newDefault [
37
Removed:
38
Removed:
^ self new
39
Removed:
username: 'mrs_default';
40
Removed:
realFirstName: 'Deborah';
41
Removed:
realLastName: 'Default';
42
Removed:
dateOfBirth: (Date year: 2000 month: 1 day: 1);
43
Removed:
isLoggedIn: false;
44
Removed:
workouts: MFTWorkout placeholderCollection;
45
Removed:
weights: MFTWeight placeholderCollection
46
Removed:
]
47
Removed:
48
Removed:
{ #category : 'as yet unclassified' }
49
Removed:
MFTUser >> accountRegisterDateAndTime [
50
Removed:
51
Removed:
^ accountRegisterDateAndTime
52
Removed:
]
53
Removed:
54
Removed:
{ #category : 'as yet unclassified' }
55
Removed:
MFTUser >> accountRegisterDateAndTime: anObject [
56
Removed:
57
Removed:
accountRegisterDateAndTime := anObject
58
Removed:
]
59
Removed:
60
Removed:
{ #category : 'as yet unclassified' }
61
Removed:
MFTUser >> dataDictionary [
62
Removed:
63
Removed:
^ OrderedDictionary newFrom: {
64
Removed:
('username' -> username).
65
Removed:
('date of birth' -> dateOfBirth).
66
Removed:
('first name' -> realFirstName).
67
Removed:
('last name' -> realLastName).
68
Removed:
('last login date and time' -> lastLoginDateAndTime) }
69
Removed:
]
70
Removed:
71
Removed:
{ #category : 'as yet unclassified' }
72
Removed:
MFTUser >> dateOfBirth [
73
Removed:
74
Removed:
^ dateOfBirth ifNil: [ Date today ]
75
Removed:
]
76
Removed:
77
Removed:
{ #category : 'as yet unclassified' }
78
Removed:
MFTUser >> dateOfBirth: aDate [
79
Removed:
80
Removed:
dateOfBirth := aDate
81
Removed:
]
82
Removed:
83
Removed:
{ #category : 'initialization' }
84
Removed:
MFTUser >> initialize [
85
Removed:
86
Removed:
super initialize.
87
Removed:
username := String new.
88
Removed:
passwordHash := String new.
89
Removed:
realFirstName := String new.
90
Removed:
realLastName := String new.
91
Removed:
dateOfBirth := Date new.
92
Removed:
isLoggedIn := false.
93
Removed:
lastLoginDateAndTime := DateAndTime now asUTC rounded asString.
94
Removed:
workouts := OrderedCollection new.
95
Removed:
weights := OrderedCollection new
96
Removed:
]
97
Removed:
98
Removed:
{ #category : 'as yet unclassified' }
99
Removed:
MFTUser >> isLoggedIn [
100
Removed:
101
Removed:
^ isLoggedIn
102
Removed:
]
103
Removed:
104
Removed:
{ #category : 'as yet unclassified' }
105
Removed:
MFTUser >> isLoggedIn: aBoolean [
106
Removed:
107
Removed:
isLoggedIn := aBoolean
108
Removed:
]
109
Removed:
110
Removed:
{ #category : 'as yet unclassified' }
111
Removed:
MFTUser >> lastLoginDateAndTime [
112
Removed:
113
Removed:
^ lastLoginDateAndTime
114
Removed:
]
115
Removed:
116
Removed:
{ #category : 'as yet unclassified' }
117
Removed:
MFTUser >> lastLoginDateAndTime: aDateAndTime [
118
Removed:
119
Removed:
lastLoginDateAndTime := aDateAndTime
120
Removed:
]
121
Removed:
122
Removed:
{ #category : 'as yet unclassified' }
123
Removed:
MFTUser >> passwordHash [
124
Removed:
125
Removed:
^ passwordHash
126
Removed:
]
127
Removed:
128
Removed:
{ #category : 'as yet unclassified' }
129
Removed:
MFTUser >> passwordHash: aByteArray [
130
Removed:
131
Removed:
passwordHash := aByteArray
132
Removed:
]
133
Removed:
134
Removed:
{ #category : 'as yet unclassified' }
135
Removed:
MFTUser >> passwordHashFromString: aString [
136
Removed:
137
Removed:
passwordHash := SHA256 new hashMessage: aString
138
Removed:
]
139
Removed:
140
Removed:
{ #category : 'as yet unclassified' }
141
Removed:
MFTUser >> realFirstName [
142
Removed:
143
Removed:
^ realFirstName
144
Removed:
]
145
Removed:
146
Removed:
{ #category : 'as yet unclassified' }
147
Removed:
MFTUser >> realFirstName: aString [
148
Removed:
149
Removed:
realFirstName := aString
150
Removed:
]
151
Removed:
152
Removed:
{ #category : 'as yet unclassified' }
153
Removed:
MFTUser >> realLastName [
154
Removed:
155
Removed:
^ realLastName
156
Removed:
]
157
Removed:
158
Removed:
{ #category : 'as yet unclassified' }
159
Removed:
MFTUser >> realLastName: aString [
160
Removed:
161
Removed:
realLastName := aString
162
Removed:
]
163
Removed:
164
Removed:
{ #category : 'as yet unclassified' }
165
Removed:
MFTUser >> username [
166
Removed:
167
Removed:
^ username
168
Removed:
]
169
Removed:
170
Removed:
{ #category : 'as yet unclassified' }
171
Removed:
MFTUser >> username: aString [
172
Removed:
173
Removed:
username := aString
174
Removed:
]
175
Removed:
176
Removed:
{ #category : 'as yet unclassified' }
177
Removed:
MFTUser >> weights [
178
Removed:
179
Removed:
^ weights
180
Removed:
]
181
Removed:
182
Removed:
{ #category : 'as yet unclassified' }
183
Removed:
MFTUser >> weights: aMFTWeightCollection [
184
Removed:
185
Removed:
weights := aMFTWeightCollection
186
Removed:
]
187
Removed:
188
Removed:
{ #category : 'as yet unclassified' }
189
Removed:
MFTUser >> workouts [
190
Removed:
191
Removed:
^ workouts
192
Removed:
]
193
Removed:
194
Removed:
{ #category : 'as yet unclassified' }
195
Removed:
MFTUser >> workouts: aMFTWorkoutCollection [
196
Removed:
197
Removed:
workouts := aMFTWorkoutCollection
198
Removed:
]
src/MyFitnessTracker-Core/MFTWeight.class.st
@@ -32,6 +32,12 @@
32
32
(self kilograms: 93 date: (Date year: 2024 month: 1 day: 4)) }
33
33
]
34
34
35
Added:
{ #category : 'initialization' }
36
Added:
MFTWeight >> canonicalName [
37
Added:
38
Added:
^ kilograms, ' kilograms'
39
Added:
]
40
Added:
35
41
{ #category : 'accessing' }
36
42
MFTWeight >> date [
37
43
src/MyFitnessTracker-Core/MFTWorkout.class.st
@@ -5,93 +5,112 @@
5
5
#name : 'MFTWorkout',
6
6
#superclass : 'MFTObject',
7
7
#instVars : [
8
Removed:
'setGroups',
9
Removed:
'user',
10
Removed:
'primaryMuscleGroup',
11
Removed:
'secondaryMuscleGroups',
12
8
'plan',
13
Removed:
'datePlanned',
14
Removed:
'dateCompleted',
15
Removed:
'isCompleted'
9
Added:
'trainee',
10
Added:
'setGroups',
11
Added:
'planned',
12
Added:
'started',
13
Added:
'completed'
16
14
],
17
15
#category : 'MyFitnessTracker-Core',
18
16
#package : 'MyFitnessTracker-Core'
19
17
}
20
18
21
Removed:
{ #category : 'as yet unclassified' }
22
Removed:
MFTWorkout class >> placeholderCollection [
19
Added:
{ #category : 'heavyDutyOne' }
20
Added:
MFTWorkout class >> heavyDutyOneDay1 [
23
21
24
Removed:
| workout1 workout2 workout3 |
25
Removed:
workout1 := self new
26
Removed:
datePlanned: (Date year: 2024 month: 1 day: 1);
27
Removed:
dateCompleted: (Date year: 2024 month: 1 day: 1);
28
Removed:
isCompleted: true;
29
Removed:
primaryMuscleGroup: MFTMuscleGroup back;
30
Removed:
setGroups: {
31
Removed:
(MFTSetGroup withSet: (MFTSet new
32
Removed:
reps: 8;
33
Removed:
load: 120;
34
Removed:
exercise: MFTExercise latPulldown)).
35
Removed:
(MFTSetGroup withSet: (MFTSet new
36
Removed:
reps: 8;
37
Removed:
load: 120;
38
Removed:
exercise: MFTExercise deadlift)).
39
Removed:
(MFTSetGroup withSet: (MFTSet new
40
Removed:
reps: 8;
41
Removed:
load: 120;
42
Removed:
exercise: MFTExercise latPulldown)) }.
22
Added:
^ self new
23
Added:
addSetGroup: (MFTSetGroup withSets: {
24
Added:
(MFTSet exercise: MFTExercise dumbbellFly reps: 8 load: 80).
25
Added:
(MFTSet exercise: MFTExercise inclinePress reps: 8 load: 80) });
26
Added:
addSets: {
27
Added:
(MFTSet exercise: MFTExercise lateralRaise reps: 12 load: 60).
28
Added:
(MFTSet exercise: MFTExercise rearDeltFly reps: 12 load: 60) };
29
Added:
addSetGroup: (MFTSetGroup withSets: {
30
Added:
(MFTSet exercise: MFTExercise lyingFrenchPress reps: 8 load: 80).
31
Added:
(MFTSet exercise: MFTExercise dip reps: 8 load: 0) })
32
Added:
]
43
33
44
Removed:
workout2 := self new
45
Removed:
datePlanned: (Date year: 2024 month: 1 day: 2);
46
Removed:
primaryMuscleGroup: MFTMuscleGroup legs;
47
Removed:
setGroups: {
48
Removed:
(MFTSetGroup withSets: {
49
Removed:
(MFTSet new
50
Removed:
reps: 12;
51
Removed:
load: 140;
52
Removed:
exercise: MFTExercise legExtension).
53
Removed:
(MFTSet new
54
Removed:
reps: 8;
55
Removed:
load: 120;
56
Removed:
exercise: MFTExercise squat) }).
57
Removed:
(MFTSetGroup withSet: (MFTSet new
58
Removed:
reps: 10;
59
Removed:
load: 80;
60
Removed:
exercise: MFTExercise legCurl)) }.
34
Added:
{ #category : 'heavyDutyOne' }
35
Added:
MFTWorkout class >> heavyDutyOneDay2 [
36
Added:
]
61
37
62
Removed:
workout3 := self new
63
Removed:
datePlanned: (Date year: 2024 month: 1 day: 3);
64
Removed:
primaryMuscleGroup: MFTMuscleGroup chest;
65
Removed:
addSets: {
66
Removed:
(MFTSet new
67
Removed:
reps: 8;
68
Removed:
load: 120;
69
Removed:
exercise: MFTExercise benchPress).
70
Removed:
(MFTSet new
71
Removed:
reps: 8;
72
Removed:
load: 120;
73
Removed:
exercise: MFTExercise latPulldown).
74
Removed:
(MFTSet new
75
Removed:
reps: 8;
76
Removed:
load: 120;
77
Removed:
exercise: MFTExercise latPulldown) }.
38
Added:
{ #category : 'heavyDutyOne' }
39
Added:
MFTWorkout class >> heavyDutyOneDay3 [
40
Added:
]
78
41
79
Removed:
^ OrderedCollection withAll: {
80
Removed:
workout1.
81
Removed:
workout2.
82
Removed:
workout3 }
42
Added:
{ #category : 'placeholders' }
43
Added:
MFTWorkout class >> placeholderForToday [
44
Added:
45
Added:
^ self new
46
Added:
planned: Date today;
47
Added:
setGroups: {
48
Added:
(MFTSetGroup withSets: {
49
Added:
(MFTSet new
50
Added:
reps: 12;
51
Added:
load: 140;
52
Added:
exercise: MFTExercise legExtension).
53
Added:
(MFTSet new
54
Added:
reps: 8;
55
Added:
load: 120;
56
Added:
exercise: MFTExercise squat) }).
57
Added:
(MFTSetGroup withSet: (MFTSet new
58
Added:
reps: 10;
59
Added:
load: 80;
60
Added:
exercise: MFTExercise legCurl)) };
61
Added:
yourself
83
62
]
84
63
85
Removed:
{ #category : 'as yet unclassified' }
64
Added:
{ #category : 'placeholders' }
65
Added:
MFTWorkout class >> placeholderForTomorrow [
66
Added:
67
Added:
^ self new
68
Added:
planned: Date tomorrow;
69
Added:
addSets: {
70
Added:
(MFTSet new
71
Added:
reps: 8;
72
Added:
load: 120;
73
Added:
exercise: MFTExercise barbellBenchPress).
74
Added:
(MFTSet new
75
Added:
reps: 8;
76
Added:
load: 120;
77
Added:
exercise: MFTExercise squat).
78
Added:
(MFTSet new
79
Added:
reps: 8;
80
Added:
load: 110;
81
Added:
exercise: MFTExercise latPulldown) };
82
Added:
yourself
83
Added:
]
84
Added:
85
Added:
{ #category : 'placeholders' }
86
Added:
MFTWorkout class >> placeholderForYesterday [
87
Added:
88
Added:
^ self new
89
Added:
planned: Date yesterday;
90
Added:
completed: Date yesterday;
91
Added:
setGroups: {
92
Added:
(MFTSetGroup exercise: MFTExercise latPulldown sets: {
93
Added:
(MFTSet reps: 6 load: 100).
94
Added:
(MFTSet reps: 8 load: 120) }).
95
Added:
(MFTSetGroup
96
Added:
exercise: MFTExercise deadlift
97
Added:
sets: { (MFTSet reps: 8 load: 120) }).
98
Added:
(MFTSetGroup
99
Added:
exercise: MFTExercise latPulldown
100
Added:
sets: { (MFTSet reps: 8 load: 120) }) };
101
Added:
yourself
102
Added:
]
103
Added:
104
Added:
{ #category : 'adding' }
86
105
MFTWorkout >> addSetGroup: aMFTSetGroup [
87
106
88
Removed:
setGroups add: aMFTSetGroup
107
Added:
setGroups addLast: aMFTSetGroup
89
108
]
90
109
91
Removed:
{ #category : 'as yet unclassified' }
110
Added:
{ #category : 'adding' }
92
111
MFTWorkout >> addSetGroups: aMFTSetGroupCollection [
93
112
94
Removed:
aMFTSetGroupCollection do: [ :setGroup | setGroups add: setGroup ]
113
Added:
setGroups addAll: aMFTSetGroupCollection
95
114
]
96
115
97
116
{ #category : 'adding' }
@@ -99,136 +118,128 @@
99
118
"Automatically wrap each MFTSet in a MFTSetGroup."
100
119
101
120
aMFTSetCollection do: [ :set |
102
Removed:
| setGroup |
103
Removed:
setGroup := MFTSetGroup withSet: set.
104
Removed:
setGroups addLast: setGroup ]
121
Added:
setGroups addLast: (MFTSetGroup withSet: set) ]
105
122
]
106
123
107
Removed:
{ #category : 'as yet unclassified' }
124
Added:
{ #category : 'testing' }
108
125
MFTWorkout >> allSetGroupsAreRegular [
109
126
110
127
^ self anySetGroupIsIrregular not
111
128
]
112
129
113
Removed:
{ #category : 'as yet unclassified' }
130
Added:
{ #category : 'testing' }
114
131
MFTWorkout >> anySetGroupIsIrregular [
115
132
116
Removed:
^ setGroups anySatisfy: [ :group | group isRegularSetGroup not ]
133
Added:
^ setGroups anySatisfy: [ :setGroup | setGroup isRegularSetGroup not ]
117
134
]
118
135
119
Removed:
{ #category : 'as yet unclassified' }
136
Added:
{ #category : 'testing' }
120
137
MFTWorkout >> anySetHasLoad [
121
138
122
139
^ self sets anySatisfy: #hasLoad
123
140
]
124
141
125
Removed:
{ #category : 'as yet unclassified' }
142
Added:
{ #category : 'testing' }
126
143
MFTWorkout >> anySetHasVolume [
127
144
128
145
^ self sets anySatisfy: #hasVolume
129
146
]
130
147
131
Removed:
{ #category : 'accessing' }
132
Removed:
MFTWorkout >> dateCompleted [
148
Added:
{ #category : 'initialization' }
149
Added:
MFTWorkout >> canonicalName [
133
150
134
Removed:
^ dateCompleted
151
Added:
^ self isCompleted
152
Added:
ifTrue: [ 'completed ' , completed asString ]
153
Added:
ifFalse: [ 'planned ' , planned asString ]
135
154
]
136
155
137
156
{ #category : 'accessing' }
138
Removed:
MFTWorkout >> dateCompleted: aDate [
157
Added:
MFTWorkout >> completed [
139
158
140
Removed:
dateCompleted := aDate
159
Added:
^ completed
141
160
]
142
161
143
162
{ #category : 'accessing' }
144
Removed:
MFTWorkout >> datePlanned [
163
Added:
MFTWorkout >> completed: aDateAndTime [
145
164
146
Removed:
^ datePlanned
165
Added:
completed := aDateAndTime
147
166
]
148
167
149
Removed:
{ #category : 'accessing' }
150
Removed:
MFTWorkout >> datePlanned: aDate [
151
Removed:
152
Removed:
datePlanned := aDate
153
Removed:
]
154
Removed:
155
168
{ #category : 'initialization' }
156
169
MFTWorkout >> initialize [
157
170
158
171
super initialize.
159
Removed:
datePlanned := Date today.
160
Removed:
setGroups := OrderedCollection new.
161
Removed:
secondaryMuscleGroups := OrderedCollection new.
162
Removed:
isCompleted := false
172
Added:
planned := DateAndTime today.
173
Added:
setGroups := OrderedCollection new
163
174
]
164
175
165
Removed:
{ #category : 'accessing' }
176
Added:
{ #category : 'testing' }
166
177
MFTWorkout >> isCompleted [
167
178
168
Removed:
^ isCompleted
179
Added:
^ completed isNotNil
169
180
]
170
181
171
Removed:
{ #category : 'accessing' }
172
Removed:
MFTWorkout >> isCompleted: aBoolean [
182
Added:
{ #category : 'testing' }
183
Added:
MFTWorkout >> isLive [
173
184
174
Removed:
isCompleted := aBoolean
185
Added:
^ self isStarted and: self isCompleted not
175
186
]
176
187
177
Removed:
{ #category : 'accessing' }
178
Removed:
MFTWorkout >> plan [
188
Added:
{ #category : 'testing' }
189
Added:
MFTWorkout >> isPlanned [
179
190
180
Removed:
^ plan
191
Added:
^ planned isNotNil
181
192
]
182
193
183
Removed:
{ #category : 'accessing' }
184
Removed:
MFTWorkout >> plan: aMFTWorkoutPlan [
194
Added:
{ #category : 'testing' }
195
Added:
MFTWorkout >> isStarted [
185
196
186
Removed:
plan := aMFTWorkoutPlan
197
Added:
^ started isNotNil
187
198
]
188
199
189
200
{ #category : 'accessing' }
190
Removed:
MFTWorkout >> primaryMuscleGroup [
201
Added:
MFTWorkout >> plan [
191
202
192
Removed:
^ primaryMuscleGroup
203
Added:
^ plan
193
204
]
194
205
195
206
{ #category : 'accessing' }
196
Removed:
MFTWorkout >> primaryMuscleGroup: anObject [
207
Added:
MFTWorkout >> plan: aMFTWorkoutPlan [
197
208
198
Removed:
primaryMuscleGroup := anObject
209
Added:
plan := aMFTWorkoutPlan
199
210
]
200
211
201
212
{ #category : 'accessing' }
202
Removed:
MFTWorkout >> secondaryMuscleGroups [
213
Added:
MFTWorkout >> planned [
203
214
204
Removed:
^ secondaryMuscleGroups
215
Added:
^ planned
205
216
]
206
217
207
218
{ #category : 'accessing' }
208
Removed:
MFTWorkout >> secondaryMuscleGroups: anObject [
219
Added:
MFTWorkout >> planned: aDateAndTime [
209
220
210
Removed:
secondaryMuscleGroups := anObject
221
Added:
planned := aDateAndTime
211
222
]
212
223
213
Removed:
{ #category : 'as yet unclassified' }
224
Added:
{ #category : 'accessing' }
214
225
MFTWorkout >> setGroups [
215
226
216
227
^ setGroups
217
228
]
218
229
219
Removed:
{ #category : 'as yet unclassified' }
230
Added:
{ #category : 'accessing' }
220
231
MFTWorkout >> setGroups: aMFTSetGroupCollection [
221
232
222
233
setGroups := aMFTSetGroupCollection
223
234
]
224
235
225
Removed:
{ #category : 'as yet unclassified' }
236
Added:
{ #category : 'accessing' }
226
237
MFTWorkout >> sets [
227
238
228
239
^ setGroups flatCollect: #sets
229
240
]
230
241
231
Removed:
{ #category : 'as yet unclassified' }
242
Added:
{ #category : 'accessing' }
232
243
MFTWorkout >> sets: aMFTSetCollection [
233
244
234
245
| groups |
@@ -240,24 +251,39 @@
240
251
]
241
252
242
253
{ #category : 'accessing' }
254
Added:
MFTWorkout >> started [
255
Added:
256
Added:
^ started
257
Added:
]
258
Added:
259
Added:
{ #category : 'accessing' }
260
Added:
MFTWorkout >> started: aDateAndTime [
261
Added:
262
Added:
started := aDateAndTime
263
Added:
]
264
Added:
265
Added:
{ #category : 'accessing' }
243
266
MFTWorkout >> status [
244
267
245
Removed:
^ dateCompleted ifNotNil: [ #completed ] ifNil: [ #planned ]
268
Added:
self isCompleted ifTrue: [ ^ 'completed ' , completed asString ].
269
Added:
self isLive ifTrue: [ ^ 'started ' , started asString ].
270
Added:
self isPlanned ifTrue: [ ^ 'planned ' , planned asString ].
271
Added:
^ 'no status'
246
272
]
247
273
248
274
{ #category : 'accessing' }
249
Removed:
MFTWorkout >> user [
275
Added:
MFTWorkout >> trainee [
250
276
251
Removed:
^ user
277
Added:
^ trainee
252
278
]
253
279
254
280
{ #category : 'accessing' }
255
Removed:
MFTWorkout >> user: anObject [
281
Added:
MFTWorkout >> trainee: aMFTTrainee [
256
282
257
Removed:
user := anObject
283
Added:
trainee := aMFTTrainee
258
284
]
259
285
260
Removed:
{ #category : 'as yet unclassified' }
286
Added:
{ #category : 'accessing' }
261
287
MFTWorkout >> volume [
262
288
263
289
^ (setGroups collect: #volume) sum
src/MyFitnessTracker-Core/MFTWorkoutPlan.class.st
@@ -6,12 +6,34 @@
6
6
#superclass : 'MFTObject',
7
7
#instVars : [
8
8
'workouts',
9
Removed:
'user'
9
Added:
'trainee'
10
10
],
11
11
#category : 'MyFitnessTracker-Core',
12
12
#package : 'MyFitnessTracker-Core'
13
13
}
14
14
15
Added:
{ #category : 'as yet unclassified' }
16
Added:
MFTWorkoutPlan class >> heavyDutyOneIdealRoutine [
17
Added:
18
Added:
^ self new
19
Added:
addWorkouts: {
20
Added:
MFTWorkout heavyDutyOneDay1.
21
Added:
MFTWorkout heavyDutyOneDay2.
22
Added:
MFTWorkout heavyDutyOneDay3 };
23
Added:
yourself
24
Added:
]
25
Added:
26
Added:
{ #category : 'as yet unclassified' }
27
Added:
MFTWorkoutPlan class >> placeholder [
28
Added:
29
Added:
^ self new
30
Added:
addWorkouts: {
31
Added:
MFTWorkout placeholderForYesterday.
32
Added:
MFTWorkout placeholderForToday.
33
Added:
MFTWorkout placeholderForTomorrow };
34
Added:
yourself
35
Added:
]
36
Added:
15
37
{ #category : 'adding' }
16
38
MFTWorkoutPlan >> addWorkout: aMFTWorkout [
17
39
@@ -26,6 +48,18 @@
26
48
aMFTWorkoutCollection do: [ :workout | workout plan: self ]
27
49
]
28
50
51
Added:
{ #category : 'initialization' }
52
Added:
MFTWorkoutPlan >> canonicalName [
53
Added:
54
Added:
^ workouts size asString , ' workouts'
55
Added:
]
56
Added:
57
Added:
{ #category : 'as yet unclassified' }
58
Added:
MFTWorkoutPlan >> completedWorkouts [
59
Added:
60
Added:
^ workouts select: #isCompleted
61
Added:
]
62
Added:
29
63
{ #category : 'accessing' }
30
64
MFTWorkoutPlan >> initialize [
31
65
@@ -33,16 +67,28 @@
33
67
workouts := OrderedCollection new
34
68
]
35
69
70
Added:
{ #category : 'as yet unclassified' }
71
Added:
MFTWorkoutPlan >> nextPlannedWorkout [
72
Added:
73
Added:
^ (self plannedWorkouts sort: [:a :b | a planned > b planned]) first
74
Added:
]
75
Added:
76
Added:
{ #category : 'as yet unclassified' }
77
Added:
MFTWorkoutPlan >> plannedWorkouts [
78
Added:
79
Added:
^ workouts select: #isPlanned
80
Added:
]
81
Added:
36
82
{ #category : 'accessing' }
37
Removed:
MFTWorkoutPlan >> user [
83
Added:
MFTWorkoutPlan >> trainee [
38
84
39
Removed:
^ user
85
Added:
^ trainee
40
86
]
41
87
42
88
{ #category : 'accessing' }
43
Removed:
MFTWorkoutPlan >> user: aMFTUser [
89
Added:
MFTWorkoutPlan >> trainee: aMFTTrainee [
44
90
45
Removed:
user := aMFTUser
91
Added:
trainee := aMFTTrainee
46
92
]
47
93
48
94
{ #category : 'accessing' }