Update fzf location
[dotfiles] / repl.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4 # faut que ça marche pareil en P2 et P3
5 from __future__ import unicode_literals, print_function, absolute_import
6
7 # Les imports des modules de la libs standars que j'utilise le plus
8 # car à force çe me gave de les réimporter moi-même à chaque session
9 import sys
10 import os
11 import re
12 import json
13 import csv
14 import random
15 import hashlib
16 import tempfile
17 import random
18 import shelve
19 import subprocess
20 from glob import glob
21 from uuid import uuid4
22 from pprint import pprint
23
24 # on shadow le open() builtin histoire d'avoir toujours le
25 # paramètre encoding
26 from codecs import open
27
28 from itertools import *
29 from collections import *
30 from datetime import datetime, timedelta
31
32 # imports d'outils tierces parties que j'utilise souvent mais qui pourraient ne
33 # pas être installés
34 try:
35 import arrow
36 except ImportError:
37 pass
38
39 try:
40 import requests
41 except ImportError:
42 pass
43
44 try:
45 from path import path
46 except ImportError:
47 pass
48
49 try:
50 from minibelt import *
51 except ImportError:
52 pass
53
54 # activation d'autocompletion si ce n'est pas déjà le cas, notamment sous
55 # des vieux shell Python ordinnaire
56 try:
57 import rlcompleter
58 import readline
59 readline.parse_and_bind("tab: complete")
60 except ImportError:
61 pass
62
63 # si on est dans un virtual env
64 env = os.environ.get('VIRTUAL_ENV')
65 if env:
66
67 # afficher le nom de l'env dans le prompt (marche pas dans ipython qui
68 # a sa propre config pour ça)
69 env_name = os.path.basename(env)
70 sys.ps1 = '(%s) %s ' % (env_name, getattr(sys, 'ps1', '>>>'))
71
72 # affichage une fois des modules installés avec pip pour qu'on sache
73 # ce qu'on a a dispo dans cet env
74 print("\nVirtualenv '{}' contains:\n".format(env_name))
75 cmd = subprocess.check_output([env + "/bin/pip", "freeze"],
76 stderr=subprocess.STDOUT)
77 try:
78 cmd = cmd.decode('utf8')
79 except:
80 pass
81
82 cmd = cmd.strip().split("\n")
83 p = re.compile(r'(^.*\:\s)|((#|@).*$)|(==.*$)')
84 print("'" + "', '".join(sorted(set(os.path.basename(p.sub('', f)) for f in cmd))) + "'\n")
85
86
87 # alias pour printer rapidement
88 p = print
89 pp = pprint
90
91 # avoir toujours un dossier temporaire près à l'usage
92 TEMP_DIR = os.path.join(tempfile.gettempdir(), 'pythontemp')
93 try:
94 os.path.makedirs(TEMP_DIR)
95 TEMP_DIR = path(TEMP_DIR) # si possible un objet path
96 except Exception as e:
97 pass
98
99 # avoir un dico persistant pour garder des objets entre deux sessions. Pratique quand
100 # on a un gros array numpy qu'on a pas envie de se faire chier à se recréer
101
102 # class Store(object):
103 # def __init__(self, filename):
104 # object.__setattr__(self, 'DICT', shelve.DbfilenameShelf(filename))
105 # # cleaning the dict on the way out
106 # atexit.register(self._clean)
107
108 # def __getattribute__(self, name):
109 # if name not in ("DICT", '_clean'):
110 # try:
111 # return self.DICT[name]
112 # except:
113 # return None
114 # return object.__getattribute__(self, name)
115
116 # def __setattr__(self, name, value):
117 # if name in ("DICT", '_clean'):
118 # raise ValueError("'%s' is a reserved name for this store" % name)
119 # self.DICT[name] = value
120
121 # def _clean(self):
122 # self.DICT.sync()
123 # self.DICT.close()
124
125 # Ainsi on peut faire store.foo = 'bar' et récupérer store.foo à la session
126 # suivante. Moi je store tout dans un truc temporaire mais si vous voulez
127 # garder la persistance entre deux reboots, il suffit de choisir un autre
128 # dossier.
129 # store = Store(os.path.join(TEMP_DIR, 'store'))