forked from coleifer/peewee
-
Notifications
You must be signed in to change notification settings - Fork 0
/
pskel
executable file
·95 lines (75 loc) · 2.49 KB
/
pskel
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
#!/usr/bin/env python
from collections import namedtuple
import optparse
template = """
#!/usr/bin/env python
import logging
from peewee import *
from peewee import create_model_tables
%(extra_import)s
db = %(engine)s('%(database)s')
class BaseModel(Model):
class Meta:
database = db
%(models)s
def main():
db.create_tables([%(model_names)s], True)
%(logging)s
if __name__ == '__main__':
main()
""".strip()
model_template = """
class %(model_name)s(BaseModel):
pass
"""
logging_template = """
logger = logging.getLogger('peewee')
logger.setLevel(logging.DEBUG)
logger.addHandler(logging.StreamHandler())
"""
class Engine(namedtuple('_Engine', ('engine', 'imports'))):
def __new__(cls, engine, imports=None):
return super(Engine, cls).__new__(cls, engine, imports)
def get_import(self):
if self.imports:
return 'from %s import *' % self.imports
return ''
engine_mapping = {
'postgres': Engine('PostgresqlDatabase'),
'postgres_ext': Engine('PostgresqlExtDatabase', 'playhouse.postgres_ext'),
'sqlite': Engine('SqliteDatabase'),
'sqlite_ext': Engine('SqliteExtDatabase', 'playhouse.sqlite_ext'),
'mysql': Engine('MySQLDatabase'),
'apsw': Engine('APSWDatabase', 'playhouse.apsw_ext'),
'bdb': Engine('BerkeleyDatabase', 'playhouse.berkeleydb'),
}
def render_models(models, engine, database, logging=False):
rendered_models = []
class_names = []
for model in models:
class_name = model.strip().title()
class_names.append(class_name)
rendered_models.append(model_template % {'model_name': class_name})
parameters = {
'database': database,
'engine': engine.engine,
'extra_import': engine.get_import(),
'logging': logging_template if logging else '',
'models': '\n'.join(rendered_models + ['']),
'model_names': ', '.join(class_names),
}
return template % parameters
if __name__ == '__main__':
parser = optparse.OptionParser(
usage='Usage: %prog [options] model1 model2...')
ao = parser.add_option
ao('-l', '--logging', dest='logging', action='store_true')
ao('-e', '--engine', dest='engine', choices=sorted(engine_mapping.keys()),
default='sqlite')
ao('-d', '--database', dest='database', default=':memory:')
options, models = parser.parse_args()
print render_models(
models,
engine=engine_mapping[options.engine],
database=options.database,
logging=options.logging)