Source code for foundations.common
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
**common.py**
**Platform:**
Windows, Linux, Mac Os X.
**Description:**
This module defines **Foundations** package common utilities objects that don't fall in any specific category.
**Others:**
:func:`isBinaryFile` from Jorge Orpinel:
http://stackoverflow.com/questions/898669/how-can-i-detect-if-a-file-is-binary-non-text-in-python
:func:`dependencyResolver` from Louis RIVIERE: http://code.activestate.com/recipes/576570-dependency-resolver/
"""
#**********************************************************************************************************************
#*** External imports.
#**********************************************************************************************************************
import itertools
import os
import urllib2
#**********************************************************************************************************************
#*** Internal imports.
#**********************************************************************************************************************
import foundations.verbose
#**********************************************************************************************************************
#*** Module attributes.
#**********************************************************************************************************************
__author__ = "Thomas Mansencal"
__copyright__ = "Copyright (C) 2008 - 2012 - Thomas Mansencal"
__license__ = "GPL V3.0 - http://www.gnu.org/licenses/"
__maintainer__ = "Thomas Mansencal"
__email__ = "thomas.mansencal@gmail.com"
__status__ = "Production"
__all__ = ["LOGGER",
"CONNECTION_IP",
"wait",
"uniqify",
"orderedUniqify",
"pathExists",
"getFirstItem",
"getLastItem",
"isBinaryFile",
"repeat",
"dependencyResolver",
"isInternetAvailable"]
LOGGER = foundations.verbose.installLogger()
CONNECTION_IP = "74.125.113.99"
#**********************************************************************************************************************
#*** Module classes and definitions.
#**********************************************************************************************************************
[docs]def uniqify(sequence):
"""
This definition uniqifies the given sequence even if unhashable.
:param sequence: Sequence. ( Object )
:return: Uniqified sequence. ( List )
:note: The sequence order is not maintained by this definition.
"""
return [key for key, group in itertools.groupby(sorted(sequence))]
[docs]def orderedUniqify(sequence):
"""
This definition uniqifies the given hashable sequence while preserving its order.
:param sequence: Sequence. ( Object )
:return: Uniqified sequence. ( List )
"""
items = set()
return [key for key in sequence if key not in items and not items.add(key)]
[docs]def pathExists(path):
"""
This definition returns if given path exists.
:param path: Path. ( String )
:return: Path existence. ( Boolean )
"""
if not path:
return False
else:
return os.path.exists(path)
[docs]def getFirstItem(iterable, default=None):
"""
This definition returns the first item of given iterable.
:param iterable: Iterable. ( Object )
:param default: Default value. ( Object )
:return: First iterable item. ( Object )
"""
if not iterable:
return default
for item in iterable:
return item
[docs]def getLastItem(iterable, default=None):
"""
This definition returns the last item of given iterable.
:param iterable: Iterable. ( Object )
:param default: Default value. ( Object )
:return: Last iterable item. ( Object )
"""
if not iterable:
return default
return iterable[-1]
[docs]def isBinaryFile(file):
"""
This definition returns if given file is a binary file.
:param file: File path. ( String )
:return: Is file binary. ( Boolean )
"""
fileHandle = open(file, "rb")
try:
chunkSize = 1024
while True:
chunk = fileHandle.read(chunkSize)
if "\0" in chunk:
return True
if len(chunk) < chunkSize:
break
finally:
fileHandle.close()
return False
[docs]def repeat(object, iterations=1):
"""
This definition repeats given object iterations times.
:param object: Object to repeat. ( Object )
:param iterations: Repetitions number. ( Integer )
:return: Object return values. ( List )
"""
return [object() for i in range(iterations)]
[docs]def dependencyResolver(dependencies):
"""
This definition resolves given dependencies.
:param dependencies: Dependencies to resolve. ( Dictionary )
:return: Resolved dependencies. ( List )
"""
items = dict((key, set(dependencies[key])) for key in dependencies)
resolvedDependencies = []
while items:
batch = set(item for value in items.values() for item in value) - set(items.keys())
batch.update(key for key, value in items.items() if not value)
resolvedDependencies.append(batch)
items = dict(((key, value - batch) for key, value in items.items() if value))
return resolvedDependencies
[docs]def isInternetAvailable(ip=CONNECTION_IP, timeout=1):
"""
This definition returns if an internet connection is available.
:param ip: Alternative address ip to check against. ( String )
:param timeout: Timeout in seconds. ( Integer )
:return: Is internet available. ( Boolean )
"""
try:
urllib2.urlopen("http://{0}".format(ip), timeout=timeout)
return True
except urllib2.URLError as error:
return False