Source code for tic.utils.jsonpickle.util
# -*- coding: utf-8 -*-
#
# Copyright (C) 2008 John Paulett (john -at- paulett.org)
# All rights reserved.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution.
"""Helper functions for pickling and unpickling. Most functions assist in
determining the type of an object.
"""
import time
import types
import datetime
from tic.utils.jsonpickle import tags
from tic.utils.jsonpickle.compat import set
COLLECTIONS = set, list, tuple
PRIMITIVES = str, unicode, int, float, bool, long
NEEDS_REPR = (datetime.datetime, datetime.time, datetime.date,
datetime.timedelta)
[docs]def is_date(obj):
"""
Returns True if obj is string and represents a javascript date
should be in the following format "new Date(23421432311);"
"""
try:
if tags.DATE_REG_EXP.match(obj):
return True
return False
except:
return False
[docs]def is_type(obj):
"""Returns True is obj is a reference to a type.
>>> is_type(1)
False
>>> is_type(object)
True
>>> class Klass: pass
>>> is_type(Klass)
True
"""
#FIXME "<class" seems like a hack. It will incorrectly return True
# for any class that does not define a custom __repr__ in a
# module that starts with "class" (e.g. "classify.SomeClass")
return type(obj) is types.TypeType or repr(obj).startswith('<class')
[docs]def is_object(obj):
"""Returns True is obj is a reference to an object instance.
>>> is_object(1)
True
>>> is_object(object())
True
>>> is_object(lambda x: 1)
False
"""
return (isinstance(obj, object) and
type(obj) is not types.TypeType and
type(obj) is not types.FunctionType)
[docs]def is_primitive(obj):
"""Helper method to see if the object is a basic data type. Strings,
integers, longs, floats, booleans, and None are considered primitive
and will return True when passed into *is_primitive()*
>>> is_primitive(3)
True
>>> is_primitive([4,4])
False
"""
if obj is None:
return True
elif type(obj) in PRIMITIVES:
return True
return False
[docs]def is_dictionary(obj):
"""Helper method for testing if the object is a dictionary.
>>> is_dictionary({'key':'value'})
True
"""
return type(obj) is dict
[docs]def is_collection(obj):
"""Helper method to see if the object is a Python collection (list,
set, or tuple).
>>> is_collection([4])
True
"""
return type(obj) in COLLECTIONS
[docs]def is_list(obj):
"""Helper method to see if the object is a Python list.
>>> is_list([4])
True
"""
return type(obj) is list
[docs]def is_set(obj):
"""Helper method to see if the object is a Python set.
>>> is_set(set())
True
"""
return type(obj) is set
[docs]def is_tuple(obj):
"""Helper method to see if the object is a Python tuple.
>>> is_tuple((1,))
True
"""
return type(obj) is tuple
[docs]def is_dictionary_subclass(obj):
"""Returns True if *obj* is a subclass of the dict type. *obj* must be
a subclass and not the actual builtin dict.
>>> class Temp(dict): pass
>>> is_dictionary_subclass(Temp())
True
"""
return (hasattr(obj, '__class__') and
issubclass(obj.__class__, dict) and not is_dictionary(obj))
[docs]def is_collection_subclass(obj):
"""Returns True if *obj* is a subclass of a collection type, such as list
set, tuple, etc.. *obj* must be a subclass and not the actual builtin, such
as list, set, tuple, etc..
>>> class Temp(list): pass
>>> is_collection_subclass(Temp())
True
"""
#TODO add UserDict
return issubclass(obj.__class__, COLLECTIONS) and not is_collection(obj)
[docs]def is_noncomplex(obj):
"""Returns True if *obj* is a special (weird) class, that is more complex
than primitive data types, but is not a full object. Including:
* :class:`~time.struct_time`
"""
if type(obj) is time.struct_time:
return True
return False
[docs]def is_repr(obj):
"""Returns True if the *obj* must be encoded and decoded using the
:func:`repr` function. Including:
* :class:`~datetime.datetime`
* :class:`~datetime.date`
* :class:`~datetime.time`
* :class:`~datetime.timedelta`
"""
return isinstance(obj, NEEDS_REPR)
[docs]def is_function(obj):
"""Returns true if passed a function
>>> is_function(lambda x: 1)
True
>>> is_function(locals)
True
>>> def method(): pass
>>> is_function(method)
True
>>> is_function(1)
False
"""
if type(obj) is types.FunctionType:
return True
if not is_object(obj):
return False
if not hasattr(obj, '__class__'):
return False
module = obj.__class__.__module__
name = obj.__class__.__name__
return (module == '__builtin__' and
name in ('function',
'builtin_function_or_method',
'instancemethod',
'method-wrapper'))
[docs]def is_module(obj):
"""Returns True if passed a module
>>> import os
>>> is_module(os)
True
"""
return type(obj) is types.ModuleType
[docs]def is_picklable(name, value):
"""Return True if an object cannot be pickled
>>> import os
>>> is_picklable('os', os)
True
>>> def foo(): pass
>>> is_picklable('foo', foo)
False
"""
if name in tags.RESERVED:
return False
return not is_function(value)
[docs]def is_installed(module):
"""Tests to see if ``module`` is available on the sys.path
>>> is_installed('sys')
True
>>> is_installed('hopefullythisisnotarealmodule')
False
"""
try:
__import__(module)
return True
except ImportError, e:
return False