0001-Fix-dynamic-converter-selection-for-numeric-types.patch

J. Wienke, 05/07/2013 01:57 PM

Download (6.68 KB)

View differences:

rsb/__init__.py
188 188
                # Try to add converters form global map
189 189
                globalMap = rsb.converter.getGlobalConverterMap(wireType)
190 190
                for ((wireSchema, dataType), converter) in globalMap.getConverters().items():
191
                    priority = globalMap.getPriority(converter)
191 192
                    # Converter can be added if converterOptions does not
192 193
                    # contain a disambiguation that gives precedence to a
193 194
                    # different converter. map may still raise an
194 195
                    # exception in case of ambiguity.
195 196
                    if not wireSchema in converterOptions \
196 197
                            or dataType.__name__ == converterOptions[wireSchema]:
197
                        self.__converters.addConverter(converter)
198
                        self.__converters.addConverter(converter, priority = priority)
198 199
            else:
199 200
                # If the converter has already been created and configured.
200 201
                self.__converters = converter_
rsb/converter.py
155 155
    def __init__(self, wireType):
156 156
        self._wireType = wireType
157 157
        self._converters = {}
158
        self._priorities = {}
158 159

  
159 160
    def getWireType(self):
160 161
        return self._wireType
161 162

  
162
    def addConverter(self, converter, replaceExisting=False):
163
    def addConverter(self, converter, replaceExisting=False, priority = 0):
163 164
        key = (converter.getWireSchema(), converter.getDataType())
164 165
        if key in self._converters and not replaceExisting:
165 166
            raise RuntimeError("There already is a converter with wire-schema `%s' and data-type `%s'"
166 167
                               % key)
167 168
        self._converters[key] = converter
169
        self._priorities[converter] = priority
170

  
171
    def getPriority(self, converter):
172
        return self._priorities[converter]
168 173

  
169 174
    def _getConverterForWireSchema(self, wireSchema):
170 175
        for ((converterWireSchema, ignored), converter) in self._converters.items():
......
172 177
                return converter
173 178

  
174 179
    def _getConverterForDataType(self, dataType):
175
        for ((ignored, converterDataType), converter) in self._converters.items():
180
        for ((ignored, converterDataType), converter) \
181
                in sorted(self._converters.items(),
182
                          key = lambda x: self._priorities[x[1]]):
176 183
            if issubclass(dataType, converterDataType):
177 184
                return converter
178 185

  
......
231 238
    def __init__(self, wireType):
232 239
        super(UnambiguousConverterMap, self).__init__(wireType)
233 240

  
234
    def addConverter(self, converter, replaceExisting=False):
241
    def addConverter(self, converter, replaceExisting = False, priority = 0 ):
235 242
        for (wireSchema, dataType) in self.getConverters().keys():
236 243
            if wireSchema == converter.getWireSchema():
237 244
                if dataType == converter.getDataType():
......
239 246
                else:
240 247
                    raise RuntimeError("Trying to register ambiguous converter with data type `%s' for wire-schema `%s' (present converter is for data type `%s')."
241 248
                                       % (converter.getDataType(), wireSchema, dataType))
242
        super(UnambiguousConverterMap, self).addConverter(converter, replaceExisting)
249
        super(UnambiguousConverterMap, self) \
250
            .addConverter(converter,
251
                          replaceExisting= replaceExisting,
252
                          priority = priority)
243 253

  
244 254
__globalConverterMaps = {}
245 255

  
246
def registerGlobalConverter(converter, replaceExisting=False):
256
def registerGlobalConverter(converter, replaceExisting = False, priority = 0):
247 257
    """
248 258
    Register B{converter} as a globally available converter.
249 259

  
......
255 265
                            an error is raised.
256 266
    """
257 267
    mapForWireType = getGlobalConverterMap(converter.getWireType())
258
    mapForWireType.addConverter(converter, replaceExisting)
268
    mapForWireType.addConverter(converter,
269
                                replaceExisting = replaceExisting,
270
                                priority = priority)
259 271

  
260 272
def getGlobalConverterMap(wireType):
261 273
    """
......
340 352

  
341 353
makeStructBasedConverter('DoubleConverter', Real,     'double', '<d', 8)
342 354
makeStructBasedConverter('FloatConverter',  Real,     'float',  '<f', 4)
343
makeStructBasedConverter('Uint32Converter', Integral, 'uint32', '<I', 4)
344
makeStructBasedConverter('Int32Converter',  Integral, 'int32',  '<i', 4)
355
makeStructBasedConverter('Uint32Converter', int,      'uint32', '<I', 4)
356
makeStructBasedConverter('Int32Converter',  int,      'int32',  '<i', 4)
345 357
makeStructBasedConverter('Uint64Converter', Integral, 'uint64', '<Q', 8)
346 358
makeStructBasedConverter('Int64Converter',  Integral, 'int64',  '<q', 8)
347 359
makeStructBasedConverter('BoolConverter',   bool,     'bool',   '?',  1)
......
431 443
        return str(self)
432 444

  
433 445
registerGlobalConverter(NoneConverter())
434
registerGlobalConverter(DoubleConverter())
435
registerGlobalConverter(FloatConverter())
436
registerGlobalConverter(Uint32Converter())
437
registerGlobalConverter(Int32Converter())
438
registerGlobalConverter(Uint64Converter())
439
registerGlobalConverter(Int64Converter())
446
registerGlobalConverter(DoubleConverter(), priority = 6)
447
registerGlobalConverter(FloatConverter(),  priority = 5)
448
registerGlobalConverter(Uint32Converter(), priority = 1)
449
registerGlobalConverter(Int32Converter(),  priority = 2)
450
registerGlobalConverter(Uint64Converter(), priority = 3)
451
registerGlobalConverter(Int64Converter(),  priority = 4)
440 452
registerGlobalConverter(BoolConverter())
441 453
registerGlobalConverter(StringConverter(wireSchema="utf-8-string", dataType=str, encoding="utf_8"))
442 454
registerGlobalConverter(ByteArrayConverter())
443
-