This repository has been archived on 2024-05-09. You can view files and clone it, but cannot push or open issues/pull-requests.
ipodderx-core/objc/_pythonify.py

82 lines
2.4 KiB
Python

import _objc
__all__ = []
class OC_PythonFloat(float):
__slots__=('__pyobjc_object__',)
def __new__(cls, obj, value):
self = float.__new__(cls, value)
self.__pyobjc_object__ = obj
return self
__class__ = property(lambda self: self.__pyobjc_object__.__class__)
def __getattr__(self, attr):
return getattr(self.__pyobjc_object__, attr)
class OC_PythonLong(long):
def __new__(cls, obj, value):
self = long.__new__(cls, value)
self.__pyobjc_object__ = obj
return self
__class__ = property(lambda self: self.__pyobjc_object__.__class__)
def __getattr__(self, attr):
return getattr(self.__pyobjc_object__, attr)
# The long type doesn't support __slots__ on subclasses, fake
# one part of the effect of __slots__: don't allow setting of attributes.
def __setattr__(self, attr, value):
if attr != '__pyobjc_object__':
raise AttributeError, "'%s' object has no attribute '%s')"%(self.__class__.__name__, attr)
self.__dict__['__pyobjc_object__'] = value
class OC_PythonInt(int):
__slots__=('__pyobjc_object__',)
def __new__(cls, obj, value):
self = int.__new__(cls, value)
self.__pyobjc_object__ = obj
return self
__class__ = property(lambda self: self.__pyobjc_object__.__class__)
def __getattr__(self, attr):
return getattr(self.__pyobjc_object__, attr)
NSNumber = _objc.lookUpClass('NSNumber')
NSDecimalNumber = _objc.lookUpClass('NSDecimalNumber')
Foundation = None
def numberWrapper(obj):
if isinstance(obj, NSDecimalNumber):
return obj
# ensure that NSDecimal is around
global Foundation
if Foundation is None:
import Foundation
# return NSDecimal
return Foundation.NSDecimal(obj)
try:
tp = obj.objCType()
except AttributeError:
import warnings
warnings.warn(RuntimeWarning, "NSNumber instance doesn't implement objCType? %r" % (obj,))
return obj
if tp in 'qQLfd':
if tp == 'q':
return OC_PythonLong(obj, obj.longLongValue())
elif tp in 'QL':
return OC_PythonLong(obj, obj.unsignedLongLongValue())
else:
return OC_PythonFloat(obj, obj.doubleValue())
else:
return OC_PythonInt(obj, obj.longValue())
_objc.setNSNumberWrapper(numberWrapper)