Changeset 761
- Timestamp:
- 10/30/05 18:46:28
- Files:
-
- trunk/cherrypy/_cperror.py (modified) (1 diff)
- trunk/cherrypy/_cphttptools.py (modified) (1 diff)
- trunk/cherrypy/_cpserver.py (modified) (1 diff)
- trunk/cherrypy/_cpwsgi.py (modified) (1 diff)
- trunk/cherrypy/config.py (modified) (5 diffs)
- trunk/cherrypy/lib/cptools.py (modified) (1 diff)
- trunk/cherrypy/lib/filter/logdebuginfofilter.py (modified) (1 diff)
- trunk/cherrypy/test/test_config.py (added)
- trunk/cherrypy/test/test_core.py (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/cherrypy/_cperror.py
r710 r761 188 188 cherrypy.log(tb) 189 189 190 defaultOn = (cherrypy.config.get('server.environment') == 'development') 191 if not cherrypy.config.get('server.showTracebacks', defaultOn): 190 if not cherrypy.config.get('server.showTracebacks', False): 192 191 tb = None 193 192 trunk/cherrypy/_cphttptools.py
r760 r761 662 662 # Failure in _cpOnError, error filter, or finalize. 663 663 # Bypass them all. 664 defaultOn = (cherrypy.config.get('server.environment') == 'development') 665 if cherrypy.config.get('server.showTracebacks', defaultOn): 664 if cherrypy.config.get('server.showTracebacks', False): 666 665 body = self.dbltrace % (_cputil.formatExc(exc), 667 666 _cputil.formatExc()) trunk/cherrypy/_cpserver.py
r758 r761 93 93 # autoreload calls sys.exit. 94 94 if serverClass is not None: 95 defaultOn = (conf("server.environment") == "development") 96 if conf('autoreload.on', defaultOn): 95 if conf('autoreload.on', False): 97 96 try: 98 97 autoreload.main(self._start) trunk/cherrypy/_cpwsgi.py
r758 r761 107 107 tb = _cputil.formatExc() 108 108 cherrypy.log(tb) 109 defaultOn = (cherrypy.config.get('server.environment') == 'development') 110 if not cherrypy.config.get("server.showTracebacks", defaultOn): 109 if not cherrypy.config.get("server.showTracebacks", False): 111 110 tb = "" 112 111 s, h, b = _cputil.bareError(tb) trunk/cherrypy/config.py
r760 r761 47 47 'server.socketFile': '', 48 48 'server.socketQueueSize': 5, 49 50 'server.environment': 'development',51 49 'server.protocolVersion': 'HTTP/1.0', 52 50 'server.logToScreen': True, … … 54 52 'server.reverseDNS': False, 55 53 'server.threadPool': 0, 54 'server.environment': "development", 56 55 } 56 57 environments = { 58 "development": { 59 'autoreload.on': True, 60 'logDebugInfoFilter.on': True, 61 'server.logFileNotFound': True, 62 'server.showTracebacks': True, 63 }, 64 "staging": { 65 'autoreload.on': False, 66 'logDebugInfoFilter.on': False, 67 'server.logFileNotFound': False, 68 'server.showTracebacks': False, 69 }, 70 "production": { 71 'autoreload.on': False, 72 'logDebugInfoFilter.on': False, 73 'server.logFileNotFound': False, 74 'server.showTracebacks': False, 75 }, 76 } 77 78 def update(updateMap=None, file=None, overwrite=True): 79 """Update configMap from a dictionary or a config file. 80 81 If overwrite is False then the update will not modify values 82 already defined in the configMap. 83 """ 84 if updateMap is None: 85 updateMap = {} 86 87 if file: 88 if file not in autoreload.reloadFiles: 89 autoreload.reloadFiles.append(file) 90 updateMap = updateMap.copy() 91 updateMap.update(dict_from_config_file(file)) 92 93 # Load new conf into cherrypy.configMap 94 for section, valueMap in updateMap.iteritems(): 95 # Handle shortcut syntax for "global" section 96 # example: update({'server.socketPort': 80}) 97 if not isinstance(valueMap, dict): 98 valueMap = {section: valueMap} 99 section = 'global' 100 101 bucket = configMap.setdefault(section, {}) 102 if overwrite: 103 bucket.update(valueMap) 104 else: 105 for key, value in valueMap.iteritems(): 106 bucket.setdefault(key, value) 57 107 58 108 def reset(useDefaults=True): … … 60 110 configMap.clear() 61 111 if useDefaults: 62 configMap["global"] = defaultGlobal.copy()112 update(defaultGlobal) 63 113 reset() 64 65 def update(updateMap=None, file=None, override=True):66 """Update configMap from a dictionary or a config file67 If override is True then the update will not modify values already defined68 in the configMap.69 """70 if updateMap:71 for section, valueMap in updateMap.iteritems():72 if not isinstance(valueMap, dict):73 # Shortcut syntax74 # ex: update({'server.socketPort': 80})75 valueMap = {section: valueMap}76 section = 'global'77 sectionMap = configMap.setdefault(section, {})78 if override:79 sectionMap.update(valueMap)80 else:81 for key, value in valueMap.iteritems():82 sectionMap.setdefault(key, value)83 if file:84 if file not in autoreload.reloadFiles:85 autoreload.reloadFiles.append(file)86 _load(file, override)87 114 88 115 def get(key, defaultValue=None, returnSection=False, path = None): … … 106 133 try: 107 134 result = configMap[path][key] 135 break 108 136 except KeyError: 109 if path == "global": 110 result = defaultValue 111 elif path == "/": 112 path = "global" 113 continue 114 else: 115 path = path[:path.rfind("/")] 116 continue 117 break 137 pass 138 139 try: 140 # Check for a server.environment entry at this node. 141 env = configMap[path]["server.environment"] 142 result = environments[env][key] 143 break 144 except KeyError: 145 pass 146 147 if path == "global": 148 result = defaultValue 149 break 150 151 # Move one node up the tree and try again. 152 if path == "/": 153 path = "global" 154 else: 155 path = path[:path.rfind("/")] 118 156 119 157 if returnSection: … … 199 237 200 238 201 def _load(configFile, override=True):202 """Merge an INI file into configMap203 If override is false, preserve values already in the configMap.204 """205 206 conf = dict_from_config_file(configFile)207 208 # Load new conf into cherrypy.configMap209 for section, options in conf.iteritems():210 bucket = configMap.setdefault(section, {})211 for key, value in options.iteritems():212 if override:213 bucket[key] = value214 else:215 bucket.setdefault(key, value)216 217 218 239 def outputConfigMap(): 219 240 """Log server configuration parameters""" trunk/cherrypy/lib/cptools.py
r760 r761 245 245 stat = os.stat(path) 246 246 except OSError: 247 if cherrypy.config.get('server. environment') == 'development':247 if cherrypy.config.get('server.logFileNotFound', False): 248 248 cherrypy.log(" NOT FOUND file: %s" % path, "DEBUG") 249 249 raise cherrypy.NotFound() trunk/cherrypy/lib/filter/logdebuginfofilter.py
r687 r761 48 48 49 49 def beforeFinalize(self): 50 if cherrypy.config.get('server.environment') == 'development': 51 # In "dev" environment, log everything by default 52 defaultOn = True 53 else: 54 defaultOn = False 55 56 if not cherrypy.config.get('logDebugInfoFilter.on', defaultOn): 50 if not cherrypy.config.get('logDebugInfoFilter.on', False): 57 51 return 58 52 trunk/cherrypy/test/test_core.py
r760 r761 324 324 'server.protocolVersion': "HTTP/1.1", 325 325 }, 326 '/': {327 'foo': 'this',328 'bar': 'that',329 },330 '/foo': {331 'foo': 'this2',332 'baz': 'that2',333 },334 '/foo/bar': {335 'foo': 'this3',336 'bax': 'this4',337 },338 326 '/flatten': { 339 327 'server.logFile': logFile, … … 358 346 }) 359 347 360 # Shortcut syntax--should get put in the "global" bucket361 cherrypy.config.update({'luxuryyacht': 'throatwobblermangrove'})362 348 363 349 import helper 364 350 365 351 class CoreRequestHandlingTest(helper.CPWebCase): 366 367 def testConfig(self):368 tests = [369 ('global', 'luxuryyacht', 'throatwobblermangrove'),370 ('/', 'nex', None ),371 ('/', 'foo', 'this' ),372 ('/', 'bar', 'that' ),373 ('/xyz', 'foo', 'this' ),374 ('/foo', 'foo', 'this2'),375 ('/foo', 'bar', 'that' ),376 ('/foo', 'bax', None ),377 ('/foo/bar', 'baz', 'that2'),378 ('/foo/nex', 'baz', 'that2'),379 ]380 for path, key, expected in tests:381 from cherrypy import _cphttptools382 cherrypy.serving.request = r = _cphttptools.Request("", "", "")383 r.objectPath = r.path = path384 result = cherrypy.config.get(key, None)385 self.assertEqual(result, expected)386 352 387 353 def testParams(self):

