SF.net SVN: fclient: [304] trunk/sandbox/fcp2/types.py
Status: Pre-Alpha
Brought to you by:
jurner
|
From: <ju...@us...> - 2008-02-29 16:26:00
|
Revision: 304
http://fclient.svn.sourceforge.net/fclient/?rev=304&view=rev
Author: jurner
Date: 2008-02-29 08:26:02 -0800 (Fri, 29 Feb 2008)
Log Message:
-----------
time deltas and byte amounts are converted now to python types
Modified Paths:
--------------
trunk/sandbox/fcp2/types.py
Modified: trunk/sandbox/fcp2/types.py
===================================================================
--- trunk/sandbox/fcp2/types.py 2008-02-29 16:25:42 UTC (rev 303)
+++ trunk/sandbox/fcp2/types.py 2008-02-29 16:26:02 UTC (rev 304)
@@ -5,6 +5,7 @@
import os, sys
import base64
+import re
#--> rel import hack
class _RelImportHack(object):
@@ -128,47 +129,85 @@
return int(value) / 1000
class FcpTypeTimeDelta(FcpType):
- """
- @todo: how to handle time deltas? No idea...
- """
+ """Time durations passed as tuple((int) number, modifier).
+
+ For modifiers see : L{consts.TimeDurationPostfix}. Number can be -1
+ aswell, meaniong 'not set' or 'undefined'.
+
+ >>> FcpTypeTimeDelta.fcpToPython('1000day')
+ (1000, 'day')
+
+ >>> FcpTypeTimeDelta.fcpToPython('arbitrary')
+ (-1, '')
+
+ >>> FcpTypeTimeDelta.pythonToFcp( (1000, 'day') )
+ '1000day'
+
+ """
+ NumberPattern = re.compile('''(\A \d+)''', re.X)
+
+ @classmethod
+ def pythonToFcp(clss, value):
+ return '%s%s' % value
+
+ @classmethod
+ def fcpToPython(clss, value):
+ value = value.lower()
+ result = clss.NumberPattern.split(value)
+ if len(result) == 3:
+ foo, foundInt, tail = result
+ if tail in consts.TimeDeltaPostfix.MembersAll:
+ num = int(foundInt)
+ return (num, tail)
+ return (-1, consts.TimeDeltaPostfix.Second)
+class FcpTypePercent(FcpTypeFloat): pass
+class FcpTypeUri(FcpType): pass
+
class FcpTypeIP(FcpType): pass
class FcpTypeIPList(FcpType): pass
class FcpTypeIPort(FcpType): pass
class FcpTypeStringList(FcpType): pass
class FcpTypeDirname(FcpType): pass
class FcpTypeFilename(FcpType): pass
-class FcpTypeNumBytes(FcpType):
+class FcpTypeByteAmount(FcpType):
+ """Byte amounts are passed as tuple((int, float) number, modifier).
+
+ For modifiers see : L{consts.ByteAmountPostfix}. Number of bytes can be -1
+ aswell, meaniong 'not set' or 'undefined'.
+
+ >>> FcpTypeByteAmount.fcpToPython('1000k')
+ (1000, 'k')
+
+ >>> FcpTypeByteAmount.fcpToPython('1.3k')
+ (1.3, 'k')
+
+ >>> FcpTypeByteAmount.fcpToPython('arbitrary')
+ (-1, '')
+
+ >>> FcpTypeByteAmount.pythonToFcp( (1000, 'k') )
+ '1000k'
+
"""
- @todo: how to handle byte ammounts? No idea...
- """
+ NumberPattern = re.compile('''(\A \d+ \. \d+) | (\A \d+)''', re.X)
- NamesBinary = ('', 'K', 'M', 'G', 'T', 'P', 'E')
- NamesCommon = ('', 'k', 'm', 'g', 't', 'p', 'e')
-
@classmethod
def pythonToFcp(clss, value):
- return format_num_bytes(value, binary=True, names=clss.NamesBinary)
+ return '%s%s' % value
@classmethod
def fcpToPython(clss, value):
- result = -1
- if value and value != '-1':
- if value[-1] in clss.NamesBinary:
- names = clss.NamesBinary
- binary = True
- else:
- names = clss.NamesCommon
- binary = False
- try:
- result = numbers.num_bytes_to_bytes(value, binary=binary, names=names)
- except ValueError:
- pass
- return result
-
-
-
-
+ result = clss.NumberPattern.split(value)
+ if len(result) == 4:
+ foo, foundFloat, foundInt, tail = result
+ if tail in consts.ByteAmountPostfix.MembersAll:
+ if foundFloat:
+ num = float(foundFloat)
+ else:
+ num = int(foundInt)
+ return (num, tail)
+ return (-1, consts.ByteAmountPostfix.Bytes)
+
class FcpTypePercent(FcpTypeFloat): pass
class FcpTypeUri(FcpType): pass
@@ -276,9 +315,9 @@
'logger.dirname': FcpTypeDirname,
'logger.enabled': FcpTypeBool,
'logger.interval': FcpTypeTimeDelta,
- 'logger.maxCachedBytes': FcpTypeNumBytes,
- 'logger.maxCachedLines': FcpTypeNumBytes, # ???
- 'logger.maxZippedLogsSize': FcpTypeNumBytes, # ???
+ 'logger.maxCachedBytes': FcpTypeByteAmount,
+ 'logger.maxCachedLines': FcpTypeByteAmount, # ???
+ 'logger.maxZippedLogsSize': FcpTypeByteAmount, # ???
'logger.priority': FcpTypeChoiceLoggerPriority,
'logger.priorityDetail': FcpType, # ???? is it Detailed priority thresholds ???
@@ -286,7 +325,7 @@
'node.assumeNATed': FcpTypeBool,
'node.bindTo': FcpTypeIP,
'node.clientThrottleFile': FcpTypeFilename,
- 'node.databaseMaxMemory': FcpTypeNumBytes,
+ 'node.databaseMaxMemory': FcpTypeByteAmount,
'node.disableHangCheckers': FcpTypeBool,
'node.disableProbabilisticHTLs': FcpTypeBool,
'node.downloadAllowedDirs': FcpTypeChoiceNodeDownloadAllowedDirs,
@@ -299,7 +338,7 @@
'node.enableULPRDataPropagation': FcpTypeBool,
'node.extraPeerDataDir': FcpTypeDirname,
'node.includeLocalAddressesInNoderefs': FcpTypeBool,
- 'node.inputBandwidthLimit': FcpTypeNumBytes, # -1 is possible as value aswell
+ 'node.inputBandwidthLimit': FcpTypeByteAmount, # -1 is possible as value aswell
'node.ipAddressOverride': FcpTypeIP,
'node.l10n': FcpType, # ???
'node.lazyResume': FcpTypeBool,
@@ -309,12 +348,12 @@
'node.name': FcpTypeString,
'node.nodeDir': FcpTypeDirname,
'node.oneConnectionPerIP': FcpTypeBool,
- 'node.outputBandwidthLimit': FcpTypeNumBytes,
+ 'node.outputBandwidthLimit': FcpTypeByteAmount,
'node.passOpennetPeersThroughDarknet': FcpTypeBool,
'node.persistentTempDir': FcpTypeDirname,
'node.storeDir': FcpTypeDirname,
'node.storeForceBigShrinks': FcpTypeBool,
- 'node.storeSize': FcpTypeNumBytes,
+ 'node.storeSize': FcpTypeByteAmount,
'node.storeType': FcpTypeString,
'node.tempDir': FcpTypeDirname,
'node.tempIPAddressHint': FcpTypeIP, # ???
@@ -324,7 +363,7 @@
'node.testnet.enabled': FcpTypeBool,
'node.load.aggressiveGC': FcpType, # ???
- 'node.load.freeHeapBytesThreshold': FcpTypeNumBytes,
+ 'node.load.freeHeapBytesThreshold': FcpTypeByteAmount,
'node.load.freeHeapPercentThreshold': FcpTypePercent,
'node.load.memoryChecker': FcpTypeBool,
'node.load.nodeThrottleFile': FcpTypeFilename,
@@ -762,5 +801,10 @@
MessageParamTypes['Peer'] = MessageParamTypes['AddPeer'] = PeerMessageParams
+#********************************************************************************************
+#
+#********************************************************************************************
+if __name__ == '__main__':
+ import doctest
+ doctest.testmod()
-
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|