Update core.

Commit
e2c9fb5154869944658d9f626b38b72dbb8b9d0b
Author
Marius Peter <dev@marius-peter.com>
Author date
Committer
Marius Peter <dev@marius-peter.com>
Committer date
Changed files
src/MyFitnessTracker-Core/MFTEquipment.class.st
index 618c9f5d..0c09bfea 100644..100644
@@ -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
index ca294068..e0bbc21f 100644..100644
@@ -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
index 4c30383b..c3601c7b 100644..100644
@@ -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
index 82f8025d..62c9218e 100644..100644
@@ -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
index 9401bc60..18615d9b 100644..100644
@@ -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
index ecb1c14b..50672479 100644..100644
@@ -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
index 00000000..c251c892 000000..100644
@@ -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
index 14ef2db0..00000000 100644..000000
@@ -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
index 1e2c672b..5a29766f 100644..100644
@@ -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
index 4d458d37..dd5a7a1c 100644..100644
@@ -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
index 8149eb41..e3b5d009 100644..100644
@@ -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' }