]> gitweb.pimeys.fr Git - today.git/blob - gather.py
[gather] Soyons un peu plus clairs sur le cahier des charges
[today.git] / gather.py
1 #!/usr/bin/env python
2 # -*- encoding: utf-8 -*-
3
4 """ Module chargé de récupérer les nouvelles choses là où il faut et de fournir
5 le dico des derniers numéros.
6
7 * Une "nouvelle chose" doit fournir l'interface suivante :
8 une fonction qui s'appelle sans argument et renvoie un entier, le dernier id
9 * On peut avoir envie d'importer un module et du récupérer la liste module.functions
10 contenant plusieurs de ces fonctions.
11
12 """
13
14 import threading
15 import traceback
16 import inspect
17 import pprint
18 #: Gestion des chaînes youtube
19 import youtube
20
21
22 def generate_errmsg(id):
23 errmsg = "Erreur à la récupération de %s :\n" % id
24 errmsg += traceback.format_exc()
25 # On dumpe le contenu local de la mémoire au moment de l'exception
26 fobj = inspect.trace()[-1][0]
27 # On fait un peu de ménage
28 d = {k:v for (k,v) in fobj.f_locals.iteritems() if not k.startswith("_")}
29 # On évite d'envoyer truckLoadsOfShit
30 d = {k: (v if len(str(v)) < 800
31 else str(v)[:400] + "*" * 40 + "TRUNCATED OBJECT" + "*" * 40 + str(v)[-400:])
32 for (k,v) in d.iteritems()}
33 errmsg += "\nContexte : %s\n\n" % (pprint.pformat(d))
34 return errmsg
35
36 def get_storer(key_id, parser):
37 global results
38 """ Encapsuleur. Renvoie une fonction qui, une fois appelée, stockera le résultat
39 de ``parser()`` dans ``results[key_id]``, ``results`` étant global. """
40 def local_storer():
41 # On prend soin de ne pas crasher
42 try:
43 results[key_id] = parser()
44 except Exception as e:
45 # et d'afficher du debugging en cas de problème
46 print generate_errmsg(key_id)
47 return local_storer
48
49 def gather():
50 global results
51 functions = {}
52 functions.update(youtube.functions)
53
54 # On convertit les fonctions en storers
55 functions = {id : get_storer(id, parser) for (id, parser) in functions.items()}
56
57 results = {}
58 threads = []
59 for (id, f) in functions.items():
60 newthread = threading.Thread(name="retrieving-%s" % id, target = f)
61 newthread.start()
62 threads.append(newthread)
63
64 # On attend que tout le monde ait renvoyé son résultat
65 [t.join() for t in threads]
66
67 return results
68
69 if __name__ == "__main__":
70 print gather()