[Zope3-checkins] CVS: ZODB3/ZConfig - datatypes.py:1.1.2.23
Barry Warsaw
barry@wooz.org
Fri, 3 Jan 2003 13:54:50 -0500
Update of /cvs-repository/ZODB3/ZConfig
In directory cvs.zope.org:/tmp/cvs-serv26668
Modified Files:
Tag: zconfig-schema-devel-branch
datatypes.py
Log Message:
SuffixMultiplier: A generic class to support specifications like 12h,
53MB. Used in the new byte-size type and time-interval types.
=== ZODB3/ZConfig/datatypes.py 1.1.2.22 => 1.1.2.23 ===
--- ZODB3/ZConfig/datatypes.py:1.1.2.22 Fri Jan 3 01:04:25 2003
+++ ZODB3/ZConfig/datatypes.py Fri Jan 3 13:54:47 2003
@@ -276,6 +276,29 @@
l.append('')
return l
+
+class SuffixMultiplier:
+ # d is a dictionary of suffixes to integer multipliers. If no suffixes
+ # match, default is the multiplier. Matches are case insensitive. Return
+ # values are in the fundamental unit.
+ def __init__(self, d, default=1):
+ self._d = d
+ self._default = default
+ # all keys must be the same size
+ self._keysz = None
+ for k in d.keys():
+ if self._keysz is None:
+ self._keysz = len(k)
+ else:
+ assert self._keysz == len(k)
+
+ def __call__(self, v):
+ v = v.lower()
+ for s, m in self._d.items():
+ if v[-self._keysz:] == s:
+ return int(v[:-self._keysz]) * m
+ return int(v) * self._default
+
stock_datatypes = {
"boolean": asBoolean,
"identifier": IdentifierConversion().__call__,
@@ -291,11 +314,20 @@
"socket-address":socket_address,
"ipaddr-or-hostname":IpaddrOrHostname().__call__,
"existing-directory":existing_directory,
- "existing-path":existing_path,
- "existing-file":existing_file,
- "existing-dirpath":existing_dirpath,
- "constructor":constructor_conversion,
- "key-value":space_sep_key_value_conversion,
+ "existing-path": existing_path,
+ "existing-file": existing_file,
+ "existing-dirpath": existing_dirpath,
+ "constructor": constructor_conversion,
+ "key-value": space_sep_key_value_conversion,
+ "byte-size": SuffixMultiplier({'kb': 1024,
+ 'mb': 1024*1024,
+ 'gb': 1024*1024*1024,
+ }).__call__,
+ "time-interval": SuffixMultiplier({'s': 1,
+ 'm': 60,
+ 'h': 60*60,
+ 'd': 60*60*24,
+ }).__call__,
}
class Registry: