[Pharo] Personal fitness tracker web app.
1
"
2
I represent an exercise performed by a user.
3
"
4
Class {
5
#name : 'MFTExercise',
6
#superclass : 'MFTObject',
7
#instVars : [
8
'englishName',
9
'frenchName',
10
'activatedMuscleGroups',
11
'equipment'
12
],
13
#category : 'MyFitnessTracker-Core-Base',
14
#package : 'MyFitnessTracker-Core',
15
#tag : 'Base'
16
}
17
18
{ #category : 'chest' }
19
MFTExercise class >> barbellBenchPress [
20
21
^ self newWithEnglishName
22
equipment: MFTEquipment barbell;
23
activates: MFTMuscleGroup chest
24
]
25
26
{ #category : 'compound' }
27
MFTExercise class >> barbellSquat [
28
29
^ self newWithEnglishName
30
activates: MFTMuscleGroup leg;
31
equipment: MFTEquipment barbell
32
]
33
34
{ #category : 'back' }
35
MFTExercise class >> bentOverBarbellRows [
36
37
^ self new
38
englishName: 'bent-over barbell rows';
39
equipment: MFTEquipment barbell
40
]
41
42
{ #category : 'bicep' }
43
MFTExercise class >> bicepCurl [
44
45
^ self newWithEnglishName activates: MFTMuscleGroup arm
46
]
47
48
{ #category : 'back' }
49
MFTExercise class >> cableCross [
50
51
^ self newWithEnglishName activates: MFTMuscleGroup chest
52
]
53
54
{ #category : 'back' }
55
MFTExercise class >> cableRow [
56
57
^ self newWithEnglishName activates: MFTMuscleGroup back
58
]
59
60
{ #category : 'calves' }
61
MFTExercise class >> calfRaise [
62
63
^ self newWithEnglishName activates: MFTMuscleGroup calf
64
]
65
66
{ #category : 'back' }
67
MFTExercise class >> closeGripPalmsUpPulldown [
68
69
^ self new
70
englishName: 'close-grip palms-up pulldown';
71
activates: MFTMuscleGroup back;
72
equipment: MFTEquipment cable
73
]
74
75
{ #category : 'compound' }
76
MFTExercise class >> deadlift [
77
78
^ self newWithEnglishName activates: MFTMuscleGroup back
79
]
80
81
{ #category : 'compound' }
82
MFTExercise class >> dip [
83
84
^ self newWithEnglishName
85
activates: MFTMuscleGroup chest;
86
activates: MFTMuscleGroup arm
87
]
88
89
{ #category : 'chest' }
90
MFTExercise class >> dumbbellBenchPress [
91
92
^ self newWithEnglishName
93
equipment: MFTEquipment dumbbell;
94
activates: MFTMuscleGroup chest
95
]
96
97
{ #category : 'chest' }
98
MFTExercise class >> dumbbellFly [
99
100
^ self newWithEnglishName
101
activates: MFTMuscleGroup chest;
102
equipment: MFTEquipment dumbbell
103
]
104
105
{ #category : 'compound' }
106
MFTExercise class >> gobletSquat [
107
108
^ self newWithEnglishName equipment: MFTEquipment dumbbell
109
]
110
111
{ #category : 'bicep' }
112
MFTExercise class >> hammerCurl [
113
114
^ self newWithEnglishName activates: MFTMuscleGroup arm
115
]
116
117
{ #category : 'back' }
118
MFTExercise class >> hyperextension [
119
120
^ self newWithEnglishName equipment: MFTEquipment dumbbell
121
]
122
123
{ #category : 'chest' }
124
MFTExercise class >> inclinePress [
125
126
^ self newWithEnglishName activates: MFTMuscleGroup chest
127
]
128
129
{ #category : 'back' }
130
MFTExercise class >> latPulldown [
131
132
^ self newWithEnglishName
133
activates: MFTMuscleGroup back;
134
equipment: MFTEquipment cable
135
]
136
137
{ #category : 'back' }
138
MFTExercise class >> latPullover [
139
140
^ self newWithEnglishName equipment: MFTEquipment dumbbell
141
]
142
143
{ #category : 'shoulder' }
144
MFTExercise class >> lateralRaise [
145
146
^ self newWithEnglishName activates: MFTMuscleGroup shoulder
147
]
148
149
{ #category : 'leg' }
150
MFTExercise class >> legExtension [
151
152
^ self newWithEnglishName
153
activates: MFTMuscleGroup leg;
154
equipment: MFTEquipment legExtensionMachine
155
]
156
157
{ #category : 'back' }
158
MFTExercise class >> legPress [
159
160
^ self newWithEnglishName
161
activates: MFTMuscleGroup leg;
162
equipment: MFTEquipment legPressMachine
163
]
164
165
{ #category : 'tricep' }
166
MFTExercise class >> lyingFrenchPress [
167
168
^ self newWithEnglishName
169
activates: MFTMuscleGroup arm;
170
equipment: MFTEquipment ezBar
171
]
172
173
{ #category : 'as yet unclassified' }
174
MFTExercise class >> newWithEnglishName [
175
"I return a MFTExercise instance for which englishName is set to the calling method selector, as a space-separated string."
176
177
| exerciseNameFromSender |
178
exerciseNameFromSender := (thisContext sender selector splitCamelCase
179
collect: #asLowercase) joinUsing:
180
Character space.
181
^ self new englishName: exerciseNameFromSender
182
]
183
184
{ #category : 'leg' }
185
MFTExercise class >> pecDeck [
186
187
^ self newWithEnglishName
188
activates: MFTMuscleGroup chest;
189
equipment: MFTEquipment pecDeck
190
]
191
192
{ #category : 'traps' }
193
MFTExercise class >> rearDeltFly [
194
195
^ self newWithEnglishName
196
activates: MFTMuscleGroup shoulder;
197
equipment: MFTEquipment pecDeck
198
]
199
200
{ #category : 'leg' }
201
MFTExercise class >> seatedLegCurl [
202
203
^ self newWithEnglishName
204
activates: MFTMuscleGroup leg;
205
equipment: MFTEquipment seatedLegCurlMachine
206
]
207
208
{ #category : 'shoulder' }
209
MFTExercise class >> shoulderPressDumbell [
210
211
^ self new
212
englishName: 'shoulder press (dumbell)';
213
activates: MFTMuscleGroup shoulder;
214
equipment: MFTEquipment dumbbell
215
]
216
217
{ #category : 'traps' }
218
MFTExercise class >> shrug [
219
220
^ self newWithEnglishName
221
activates: MFTMuscleGroup back;
222
equipment: MFTEquipment dumbbell
223
]
224
225
{ #category : 'core' }
226
MFTExercise class >> sitUp [
227
228
^ self new
229
englishName: 'sit-up';
230
activates: MFTMuscleGroup abdominal
231
]
232
233
{ #category : 'tricep' }
234
MFTExercise class >> tricepExtension [
235
236
^ self newWithEnglishName
237
activates: MFTMuscleGroup arm;
238
equipment: MFTEquipment cable
239
]
240
241
{ #category : 'chest' }
242
MFTExercise class >> tricepPressdown [
243
244
^ self newWithEnglishName
245
activates: MFTMuscleGroup arm;
246
equipment: MFTEquipment cable
247
]
248
249
{ #category : 'comparing' }
250
MFTExercise >> = anObject [
251
"Answer whether the receiver and anObject represent the same object."
252
253
self == anObject ifTrue: [ ^ true ].
254
self class = anObject class ifFalse: [ ^ false ].
255
^ equipment = anObject equipment and: [
256
englishName = anObject englishName ]
257
]
258
259
{ #category : 'accessing' }
260
MFTExercise >> activates: aMFTMuscleGroup [
261
262
activatedMuscleGroups at: aMFTMuscleGroup put: 100
263
]
264
265
{ #category : 'accessing' }
266
MFTExercise >> activates: aMFTMuscleGroup percent: aPercentage [
267
268
activatedMuscleGroups at: aMFTMuscleGroup put: aPercentage
269
]
270
271
{ #category : 'accessing' }
272
MFTExercise >> canonicalName [
273
274
^ englishName
275
]
276
277
{ #category : 'accessing' }
278
MFTExercise >> englishName [
279
280
^ englishName
281
]
282
283
{ #category : 'accessing' }
284
MFTExercise >> englishName: aString [
285
286
englishName := aString
287
]
288
289
{ #category : 'accessing' }
290
MFTExercise >> equipment [
291
292
^ equipment
293
]
294
295
{ #category : 'accessing' }
296
MFTExercise >> equipment: aMFTEquipment [
297
298
equipment := aMFTEquipment
299
]
300
301
{ #category : 'accessing' }
302
MFTExercise >> frenchName [
303
304
^ frenchName
305
]
306
307
{ #category : 'accessing' }
308
MFTExercise >> frenchName: aString [
309
310
frenchName := aString
311
]
312
313
{ #category : 'comparing' }
314
MFTExercise >> hash [
315
"Answer an integer value that is related to the identity of the receiver."
316
317
^ equipment hash bitXor: englishName hash
318
]
319
320
{ #category : 'initialization' }
321
MFTExercise >> initialize [
322
323
super initialize.
324
englishName := String new.
325
frenchName := String new.
326
activatedMuscleGroups := Dictionary new
327
]
328
329
{ #category : 'accessing' }
330
MFTExercise >> mainActivatedMuscleGroups [
331
332
| values maxValue |
333
values := activatedMuscleGroups values ifEmpty: [ ^ nil ].
334
maxValue := values max.
335
^ activatedMuscleGroups keys select: [ :group |
336
(activatedMuscleGroups at: group) = maxValue ]
337
]
338