/
is_it_ready.py
159 lines (127 loc) · 5.34 KB
/
is_it_ready.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
from django.core.management.base import BaseCommand
from django.conf import settings
from django.template.loader import find_template
from django.template import TemplateDoesNotExist
import inspect
class Command(BaseCommand):
help = ('Validates the configuration settings against production '
'compliance and prints if any invalid settings are found')
def write_result(self, messages):
print (
'%(border)s\n'
'Production ready: %(status)s\n'
'%(border)s') % {'border': '-' * 20,
'status': 'No' if messages else 'Yes'}
if messages:
print 'Possible errors:'
for message in messages:
print ' *', message
def handle(self, *args, **options):
messages = Validations().run(options)
self.write_result(messages)
if messages:
exit(1)
class Validations(object):
'''Runs validations against default django settings
and returns helpful messages if any errors are found'''
def has_template(self, name, location=[]):
try:
find_template(name, location)
except TemplateDoesNotExist:
return False
else:
return True
def check_debug_values(self):
messages = []
if not settings.DEBUG:
messages.append('Set DEBUG to False')
if not settings.TEMPLATE_DEBUG:
messages.append('Set TEMPLATE_DEBUG to False')
if settings.DEBUG_PROPAGATE_EXCEPTIONS:
messages.append('Set DEBUG_PROPAGATE_EXCEPTIONS to False')
return messages
def check_contacts(self):
messages = []
message_template = 'Enter valid email address in %s section'
if not settings.ADMINS:
messages.append(message_template % 'ADMINS')
if not settings.MANAGERS:
messages.append(message_template % 'MANAGERS')
return messages
def check_email(self):
messages = []
if not settings.EMAIL_HOST_USER:
messages.append('Setup E-mail host')
if settings.SERVER_EMAIL == 'root@localhost':
messages.append('Set a valid email for SERVER_EMAIL')
if settings.DEFAULT_FROM_EMAIL == "webmaster@localhost":
messages.append('Set a valid email for DEFAULT_FROM_EMAIL')
return messages
def check_default_templates(self, templates=['404.html', '500.html']):
messages = []
for name in templates:
if not self.has_template(name, settings.TEMPLATE_DIRS):
messages.append('Template %s does not exist' % name)
return messages
def check_print_statement(self):
import ast
import os
linenos = []
linenos_list = []
class PrintStatementFinder(ast.NodeVisitor):
def visit_Print(self, node):
if node.dest is None:
linenos_list.append(node.values[0].lineno)
for (path, dirs, files) in os.walk("."):
for file_name in files:
if file_name.endswith(".py"):
with open(path + "/" + file_name, 'rU') as f:
linenos_list = []
PrintStatementFinder().visit(ast.parse("".join(f.readlines())))
if linenos_list:
linenos.append(path + "/" + file_name)
linenos.append(linenos_list)
if linenos:
if self.verbosity >= '2':
return ["There are print statements 'filename' , [list of linenos of print statements in the file ] ", linenos]
else:
return ["You have one or more print statements"]
else:
return []
def check_ipdb_import(self):
import ast
import os
linenos = []
linenos_list = []
class ImportIpdbFinder(ast.NodeVisitor):
def visit_Import(self, node):
for names in node.names:
if names.name == "ipdb" or names.name == "pdb":
linenos_list.append(node.lineno)
def visit_ImportFrom(self, node):
if node.names[0].name == "set_trace":
linenos_list.append(node.lineno)
for (path, dirs, files) in os.walk("."):
for file_name in files:
if file_name.endswith(".py"):
with open(path + "/" + file_name, 'rU') as f:
linenos_list = []
ImportIpdbFinder().visit(ast.parse("".join(f.readlines())))
if linenos_list:
linenos.append(path + "/" + file_name)
linenos.append(linenos_list)
if linenos:
if self.verbosity >= '2':
return ["There are ipdb imports 'filename' , [list of linenos of ipdb import statements in the file ] ", linenos]
else:
return ["You have one or more ipdb import statements"]
else:
return []
def run(self, options=None):
self.verbosity = options['verbosity']
messages = []
for (name, method) in inspect.getmembers(self,
predicate=inspect.ismethod):
if name.startswith('check_'):
messages += method()
return messages