Lightningbeam/PyGUI-2.5.3/build/lib.linux-i686-2.6/GUI/Resources.py

89 lines
2.9 KiB
Python

#
# PyGUI - Resources - Generic
#
import os
resource_path = []
resource_cache = {}
class ResourceNotFoundError(ValueError):
def __init__(self, name, type, path):
name = _append_type(name, type)
ValueError.__init__(self, "Resource %r not found in %s" % (name, path))
def _append_type(name, type):
if type:
name = "%s.%s" % (os.path.splitext(name)[0], type)
return name
def _add_directory_path(dir, up = 0):
# Add the given directory to the resource path if it exists.
dir = os.path.abspath(dir)
while up > 0:
dir = os.path.dirname(dir)
up -= 1
resdir = os.path.join(dir, "Resources")
#print "GUI.Resources: Checking for directory", repr(resdir) ###
if os.path.isdir(resdir):
resource_path.insert(0, resdir)
def _add_file_path(file, up = 0):
# Add the directory containing the given file to the resource path.
#print "GUI.Resources: Adding path for file", repr(file) ###
dir = os.path.dirname(os.path.abspath(file))
_add_directory_path(dir, up)
def _add_module_path(module, up = 0):
# Add the directory containing the given module to the resource path.
if hasattr(module, '__file__'):
_add_file_path(module.__file__, up)
def lookup_resource(name, type = None):
"""
Return the full pathname of a resource given its relative name
using '/' as a directory separator. If a type is specified, any
dot-suffix on the name is replaced with '.type'. Returns None if
no matching file is found on the resource search path.
"""
name = _append_type(name, type)
relpath = os.path.join(*name.split("/"))
for dir in resource_path:
path = os.path.join(dir, relpath)
if os.path.exists(path):
return path
return None
def find_resource(name, type = None):
"""
Returns the full pathname of a resource as per lookup_resource(), but
raises ResourceNotFoundError if the resource is not found.
"""
path = lookup_resource(name, type)
if not path:
raise ResourceNotFoundError(name, type, resource_path)
return path
def get_resource(loader, name, type = None, default = None, **kwds):
"""
Find a resource and load it using the specified loader function.
The loader is called as: loader(path, **kwds) where path is the full
pathname of the resource. The loaded resource is cached, and subsequent
calls referencing the same resource will return the cached value.
If the resource is not found, the specified default is returned if any,
otherwise ResourceNotFoundError is raised.
"""
path = lookup_resource(name, type)
if path:
result = resource_cache.get(path)
if result is None:
result = loader(path, **kwds)
resource_cache[path] = result
else:
if default is not None:
result = default
else:
raise ResourceNotFoundError(name, type, resource_path)
return result