1 import os
2 import warnings
3
4 import cherrypy
5
6
8
9 on = True
10
13
27
31
32
33 global_config_contained_paths = False
34
36 for sn, app in cherrypy.tree.apps.iteritems():
37 if not app.config:
38 msg = "The Application mounted at %r has an empty config." % sn
39 if self.global_config_contained_paths:
40 msg += (" It looks like the config you passed to "
41 "cherrypy.config.update() contains application-"
42 "specific sections. You must explicitly pass "
43 "application config via "
44 "cherrypy.tree.mount(..., config=app_config)")
45 warnings.warn(msg)
46 return
47
49
50 request = cherrypy.request
51 for sn, app in cherrypy.tree.apps.iteritems():
52 request.app = app
53 for section in app.config:
54
55 request.get_resource(section + "/dummy.html")
56 conf = request.config.get
57
58 if conf("tools.staticdir.on", False):
59 msg = ""
60 root = conf("tools.staticdir.root")
61 dir = conf("tools.staticdir.dir")
62 if dir is None:
63 msg = "tools.staticdir.dir is not set."
64 else:
65 fulldir = ""
66 if os.path.isabs(dir):
67 fulldir = dir
68 if root:
69 msg = ("dir is an absolute path, even "
70 "though a root is provided.")
71 testdir = os.path.join(root, dir[1:])
72 if os.path.exists(testdir):
73 msg += ("\nIf you meant to serve the "
74 "filesystem folder at %r, remove "
75 "the leading slash from dir." % testdir)
76 else:
77 if not root:
78 msg = "dir is a relative path and no root provided."
79 else:
80 fulldir = os.path.join(root, dir)
81 if not os.path.isabs(fulldir):
82 msg = "%r is not an absolute path." % fulldir
83
84 if fulldir and not os.path.exists(fulldir):
85 if msg:
86 msg += "\n"
87 msg += ("%r (root + dir) is not an existing "
88 "filesystem path." % fulldir)
89
90 if msg:
91 warnings.warn("%s\nsection: [%s]\nroot: %r\ndir: %r"
92 % (msg, section, root, dir))
93
94
95
96
97 obsolete = {
98 'server.default_content_type': 'tools.response_headers.headers',
99 'log_access_file': 'log.access_file',
100 'log_config_options': None,
101 'log_file': 'log.error_file',
102 'log_file_not_found': None,
103 'log_request_headers': 'tools.log_headers.on',
104 'log_to_screen': 'log.screen',
105 'show_tracebacks': 'request.show_tracebacks',
106 'throw_errors': 'request.throw_errors',
107 'profiler.on': ('cherrypy.tree.mount(profiler.make_app('
108 'cherrypy.Application(Root())))'),
109 }
110
111 deprecated = {}
112
114 """Process config and warn on each obsolete or deprecated entry."""
115 for section, conf in config.iteritems():
116 if isinstance(conf, dict):
117 for k, v in conf.iteritems():
118 if k in self.obsolete:
119 warnings.warn("%r is obsolete. Use %r instead.\n"
120 "section: [%s]" %
121 (k, self.obsolete[k], section))
122 elif k in self.deprecated:
123 warnings.warn("%r is deprecated. Use %r instead.\n"
124 "section: [%s]" %
125 (k, self.deprecated[k], section))
126 else:
127 if section in self.obsolete:
128 warnings.warn("%r is obsolete. Use %r instead."
129 % (section, self.obsolete[section]))
130 elif section in self.deprecated:
131 warnings.warn("%r is deprecated. Use %r instead."
132 % (section, self.deprecated[section]))
133
139
140
141
142
143 extra_config_namespaces = []
144
146 ns = ["wsgi"]
147 ns.extend(cherrypy.engine.request_class.namespaces.keys())
148 ns.extend(cherrypy.config.namespaces.keys())
149 ns += self.extra_config_namespaces
150
151 for section, conf in config.iteritems():
152 is_path_section = section.startswith("/")
153 if is_path_section and isinstance(conf, dict):
154 for k, v in conf.iteritems():
155 atoms = k.split(".")
156 if len(atoms) > 1:
157 if atoms[0] not in ns:
158 if (atoms[0] == "cherrypy" and atoms[1] in ns):
159 msg = ("The config entry %r is invalid; "
160 "try %r instead.\nsection: [%s]"
161 % (k, ".".join(atoms[1:]), section))
162 else:
163 msg = ("The config entry %r is invalid, because "
164 "the %r config namespace is unknown.\n"
165 "section: [%s]" % (k, atoms[0], section))
166 warnings.warn(msg)
167
172
173
174
175
176 known_config_types = {}
177
179 import __builtin__
180 builtins = [x for x in vars(__builtin__).values()
181 if type(x) is type(str)]
182
183 def traverse(obj, namespace):
184 for name in dir(obj):
185 vtype = type(getattr(obj, name, None))
186 if vtype in builtins:
187 self.known_config_types[namespace + "." + name] = vtype
188
189 traverse(cherrypy.request, "request")
190 traverse(cherrypy.response, "response")
191 traverse(cherrypy.server, "server")
192 traverse(cherrypy.engine, "engine")
193 traverse(cherrypy.log, "log")
194
196 msg = ("The config entry %r in section %r is of type %r, "
197 "which does not match the expected type %r.")
198
199 for section, conf in config.iteritems():
200 if isinstance(conf, dict):
201 for k, v in conf.iteritems():
202 if v is not None:
203 expected_type = self.known_config_types.get(k, None)
204 vtype = type(v)
205 if expected_type and vtype != expected_type:
206 warnings.warn(msg % (k, section, vtype.__name__,
207 expected_type.__name__))
208 else:
209 k, v = section, conf
210 if v is not None:
211 expected_type = self.known_config_types.get(k, None)
212 vtype = type(v)
213 if expected_type and vtype != expected_type:
214 warnings.warn(msg % (k, section, vtype.__name__,
215 expected_type.__name__))
216
222