-
Notifications
You must be signed in to change notification settings - Fork 0
/
Runner.py
400 lines (331 loc) · 15.2 KB
/
Runner.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
import argparse
import os
import sys
from decouple import config
from Award import Award
from datetime import datetime
from AwardCategory import AwardCategory
from AwardNameToNominees import AwardNameToNominees
from TweetsToHost import find_host
from AwardNameToPresenters import AwardNameToPresenters
from TweetsToAwardNames import get_award_categories_from_json
from AwardNameToWinners import AwardNameToWinners
import json
from utils import preprocess
from TweetsToRedCarpet import find_redcarpet
from TweetsToSentiment import find_sentiments
# Import gg_apifake.py from the autograder directory
sys.path.append(os.path.join(os.path.dirname(__file__), 'autograder'))
import gg_apifake
import gg_api
import autograder
# https://www.geeksforgeeks.org/singleton-method-python-design-patterns/
MOCK_AWARD_CATEGORIES = config('MOCK_AWARD_CATEGORIES', cast=bool, default=False)
MOCK_AWARD_PRESENTERS = config('MOCK_AWARD_PRESENTERS', cast=bool, default=False)
MOCK_AWARD_WINNERS = config('MOCK_AWARD_WINNERS', cast=bool, default=False)
MOCK_AWARD_NOMINEES = config('MOCK_AWARD_NOMINEES', cast=bool, default=False)
MOCK_HOSTS = config('MOCK_HOSTS', cast=bool, default=False)
MOCK_RED_CARPET = config('MOCK_RED_CARPET', cast=bool, default=False)
MOCK_SENTIMENT = config('MOCK_SENTIMENT', cast=bool, default=False)
class Runner:
__shared_instance = 'runner'
@staticmethod
def getInstance(year=None):
"""Static Access Method"""
if Runner.__shared_instance == 'runner':
Runner(year)
return Runner.__shared_instance
def __init__(self, year):
"""virtual private constructor"""
Runner.__shared_instance = self
self.tweets = preprocess(json.load(open(f'gg{year}.json')))
def get_award_categories(self, year):
startTime = datetime.now()
dt_string = startTime.strftime("%d/%m/%Y %H:%M:%S")
print("[Get Award Categories] process started at =", dt_string)
award_categories = []
if MOCK_AWARD_CATEGORIES:
print("[RUNNER] Mocking award categories")
award_categories = gg_apifake.get_awards(year)
award_categories = [AwardCategory(category) for category in award_categories]
else:
print("[RUNNER] Not mocking award categories")
award_categories = [v for k,v in get_award_categories_from_json(self.tweets).items()]
# award_categories = self.get_award_categories()
self.awards: list[Award] = []
for award_category in award_categories:
self.awards.append(Award(award_category))
endTime = datetime.now()
dt_string = endTime.strftime("%d/%m/%Y %H:%M:%S")
print("[Get Award Categories] process ended at =", dt_string)
print("[Get Award Categories] duration:",str(endTime-startTime))
def get_all_award_presenters(self, year):
startTime = datetime.now()
dt_string = startTime.strftime("%d/%m/%Y %H:%M:%S")
print("[Get Award Presenters] process started at =", dt_string)
if MOCK_AWARD_PRESENTERS:
print("[RUNNER] Mocking award presenters")
presenters = gg_apifake.get_presenters(year)
for category in presenters.keys():
for award in self.awards:
if award.award_category.award_name == category:
award.SetPresenters(presenters[category])
else:
print("[RUNNER] Not mocking award presenters")
for award in self.awards:
award.SetPresenters(self.get_presenter_for_award(award))
endTime = datetime.now()
dt_string = endTime.strftime("%d/%m/%Y %H:%M:%S")
print("[Get Award Presenters] process ended at =", dt_string)
print("[Get Award Presenters] duration:",str(endTime-startTime))
def get_presenter_for_award(self, award):
return AwardNameToPresenters(award, self.tweets, self.blacklist)
def get_award_nominees(self, year):
startTime = datetime.now()
dt_string = startTime.strftime("%d/%m/%Y %H:%M:%S")
print("[Get Award Nominees] process started at =", dt_string)
if MOCK_AWARD_NOMINEES:
print("[RUNNER] Mocking award nominees")
nominees = gg_apifake.get_nominees(year)
for category in nominees.keys():
for award in self.awards:
if award.award_category.award_name == category:
award.SetNominees(nominees[category])
else:
print("[RUNNER] Not mocking award nominees")
for award in self.awards:
award.SetNominees(self.get_nominees_for_award(award))
for award in self.awards:
self.blacklist |= set(award.nominees)
endTime = datetime.now()
dt_string = endTime.strftime("%d/%m/%Y %H:%M:%S")
print("[Get Award Nominees] process ended at =", dt_string)
print("[Get Award Nominees] duration:",str(endTime-startTime))
# if MOCK_AWARD_NOMINEES:
# print("[RUNNER] Mocking award nominees")
# nominees = gg_apifake.get_nominees(year)
# for category in nominees.keys():
# for award in self.awards:
# if award.award_category.award_name == category:
# award.SetNominees(nominees[category])
# else:
# print("[RUNNER] Not mocking award nominees")
# for award in self.awards:
# award.SetNominees(self.get_nominees_for_award(award))
def get_nominees_for_award(self, award):
return AwardNameToNominees(self.tweets,award,self.blacklist)
def get_awards(self, year):
return self.awards
def get_award_winners(self, year):
startTime = datetime.now()
dt_string = startTime.strftime("%d/%m/%Y %H:%M:%S")
print("[Get Award Winners] process started at =", dt_string)
if MOCK_AWARD_WINNERS:
print("[RUNNER] Mocking award winners")
winners = gg_apifake.get_winner(year)
for category in winners.keys():
for award in self.awards:
if award.award_category.award_name == category:
award.SetWinner(winners[category])
else:
print("[RUNNER] Not mocking award winners")
for award in self.awards:
award.SetWinner(self.get_winner_for_award(award))
endTime = datetime.now()
dt_string = endTime.strftime("%d/%m/%Y %H:%M:%S")
print("[Get Award Winners] process ended at =", dt_string)
print("[Get Award Winners] duration:",str(endTime-startTime))
def get_winner_for_award(self, award):
return AwardNameToWinners(self.tweets,award)
def get_red_carpet(self, year):
startTime = datetime.now()
dt_string = startTime.strftime("%d/%m/%Y %H:%M:%S")
print("[Get Red Carpet] process started at =", dt_string)
if MOCK_RED_CARPET:
print("[RUNNER] Mocking red carpet")
self.red_carpet_results = {}
self.red_carpet_results['Three Most Discussed'] = ['Jennifer Lawrence', 'Kate Hudson', 'Tina Fey']
self.red_carpet_results['Best Dressed'] = 'Kate Hudson'
self.red_carpet_results['Worst Dressed'] = 'Sienna Miller'
self.red_carpet_results['Most Controversial'] = 'Tommy Lee Jones'
else:
self.red_carpet_results = find_redcarpet(self.tweets)
endTime = datetime.now()
dt_string = endTime.strftime("%d/%m/%Y %H:%M:%S")
print("[Get Red Carpet] process ended at =", dt_string)
print("[Get Red Carpet] duration:",str(endTime-startTime))
def get_sentiments(self, year):
startTime = datetime.now()
dt_string = startTime.strftime("%d/%m/%Y %H:%M:%S")
print("[Get Sentiments] process started at =", dt_string)
if MOCK_SENTIMENT:
print("[RUNNER] Mocking sentiments")
self.sentiment_results = dict()
self.sentiment_results['tina fey'] = "The general sentiment of host " + "Tina Fey" + " was positive, with a sentiment score of " + str(1912)
self.sentiment_results['amy poehler'] = "The general sentiment of host " + "Amy Poehler" + " was positive, with a sentiment score of " + str(1788)
self.sentiment_results['winner 1'] = "The best sentiment from tweeters was for winner Anne Hathaway with a sentiment score of 339"
self.sentiment_results['winner 2'] = "The worst sentiment from tweeters was for winner Girls with a sentiment score of 2"
else:
self.sentiment_results = find_sentiments(self.tweets, self.export_hosts(), self.awards)
endTime = datetime.now()
dt_string = endTime.strftime("%d/%m/%Y %H:%M:%S")
print("[Get Sentiments] process ended at =", dt_string)
print("[Get Sentiments] duration:",str(endTime-startTime))
def get_hosts(self, year):
startTime = datetime.now()
dt_string = startTime.strftime("%d/%m/%Y %H:%M:%S")
print("[Get Hosts] process started at =", dt_string)
if MOCK_HOSTS:
print("[RUNNER] Mocking hosts")
self.hosts = gg_apifake.get_hosts(year)
else:
print("[RUNNER] Not mocking hosts")
self.hosts = find_host(self.tweets)
self.blacklist = set(self.hosts)
endTime = datetime.now()
dt_string = endTime.strftime("%d/%m/%Y %H:%M:%S")
print("[Get Hosts] process ended at =", dt_string)
print("[Get Hosts] duration:",str(endTime-startTime))
def export_hosts(self):
'''
Returns:
list: a list of hosts
'''
return self.hosts
def export_presenters(self):
'''
Returns:
dict: a dictionary of presenters names with the key being the award name
'''
presenters = {}
for award in self.awards:
presenters[award.award_category.award_name] = award.presenters
return presenters
def export_nominees(self):
'''
Returns:
dict: a dictionary of nominees names with the key being the award name
'''
nominees = {}
for award in self.awards:
nominees[award.award_category.award_name] = award.nominees
return nominees
def export_winners(self):
'''
Returns:
dict: a dictionary of winners with the key being the award name
'''
winners = {}
for award in self.awards:
winners[award.award_category.award_name] = award.winner
return winners
def export_award_categories(self):
'''
Returns:
list: a list of award categories
'''
awardsNames = []
for award in self.awards:
awardsNames.append(award.award_category.award_name)
return awardsNames
def export_red_carpet(self):
return self.red_carpet_results
def export_sentiment(self):
return self.sentiment_results
def parse_arguments():
parser = argparse.ArgumentParser()
parser.add_argument('--year', dest='year', action='store', help='the year of the awards to get', nargs=1)
parser.add_argument("--autograde", nargs='*', default=None, help='call the autograder which will output autograded information')
parser.add_argument('--output_results', dest='output_results', action='store_true', help='output a human readable version of the awards that have been found')
parser.add_argument('--save_json', dest='save_json', action='store_true', help='save the results of the autograder to a json file')
args = parser.parse_args()
return args
if __name__ == '__main__':
args = parse_arguments()
# TODO - make sure this works
if args.year:
year = args.year[0]
try:
year = int(year)
if year < 1900 or year > 2022:
raise ValueError("Year must be between 2013 and 2022")
except ValueError:
print("Invalid year: {}".format(year))
sys.exit(1)
else:
year = '2013'
autograde = False
functions = ["hosts", "awards", "nominees", "presenters", "winner"]
if args.autograde is not None:
autograde = True
if len(args.autograde) > 0:
functions = args.autograde
# os.system('cls' if os.name == 'nt' else 'clear')
startTime = datetime.now()
dt_string = startTime.strftime("%d/%m/%Y %H:%M:%S")
print("[RUNNER] process started at =", dt_string)
print("[RUNNER] Mocking the following: ")
mocks = {
"MOCK_AWARD_CATEGORIES": MOCK_AWARD_CATEGORIES,
"MOCK_AWARD_NOMINEES": MOCK_AWARD_NOMINEES,
"MOCK_AWARD_PRESENTERS": MOCK_AWARD_PRESENTERS,
"MOCK_AWARD_WINNERS": MOCK_AWARD_WINNERS,
"MOCK_HOSTS": MOCK_HOSTS,
"MOCK_RED_CARPET": MOCK_RED_CARPET,
"MOCK_SENTIMENT": MOCK_SENTIMENT
}
for key in mocks.keys():
print("[RUNNER] {}: {}".format(key, mocks[key]))
# print("")
# if autograde:
# os.system('cls' if os.name == 'nt' else 'clear')
# print("[RUNNER] Running autograder.py with the following arguments: {} {}".format(year, " ".join(functions)))
#
# autograder.main([year], functions)
# runner = gg_api.get_runner(year)
# else:
runner = Runner.getInstance(year)
runner.get_hosts(year)
runner.get_award_categories(year)
runner.get_award_nominees(year)
runner.get_all_award_presenters(year)
runner.get_award_winners(year)
endTime = datetime.now()
dt_string = endTime.strftime("%d/%m/%Y %H:%M:%S")
print("[RUNNER] process ended at =", dt_string)
print("[RUNNER] duration:",str(endTime-startTime))
if args.output_results:
awards = runner.get_awards(year)
runner.get_red_carpet(year)
runner.get_sentiments(year)
print("Hosts: " + str(runner.export_hosts()) + "\n")
for award in awards:
print(str(award) + "\n")
print("Red Carpet Results:")
red_carpet_results = runner.export_red_carpet()
print("\tThree Most Discussed: " + str(red_carpet_results["Three Most Discussed"]))
print("\tBest Dressed: " + str(red_carpet_results["Best Dressed"]))
print("\tWorst Dressed: " + str(red_carpet_results["Worst Dressed"]))
print("\tMost Controversial: " + str(red_carpet_results["Most Controversial"]))
print("\n")
print("Sentiment Results:")
sentiment_results = runner.export_sentiment()
for sent in sentiment_results:
print(sentiment_results[sent])
if args.save_json:
awards = runner.get_awards(year)
hosts = runner.export_hosts()
data = {
"Host": hosts,
}
for award in awards:
# TODO - Remove winner if Larry says so
# if award.winner not in award.nominees:
# award.nominees.append(award.winner)
data[award.award_category.award_name] = {
"Nominees": award.nominees,
"Presenters": award.presenters,
"Winner": award.winner
}
with open('gg_{}_generated_answers.json'.format(year), 'w') as outfile:
json.dump(data, outfile, indent=4, sort_keys=True)