From: Stefano Rivera Date: Sun, 11 May 2014 16:38:51 +0000 (+0200) Subject: Turn resources into a module, which can hold mutators too X-Git-Tag: 0.1~411^2~1 X-Git-Url: https://git.ctpug.org.za/?p=naja.git;a=commitdiff_plain;h=ea0fea7855b70665b1b155f1d20495e88096b73a Turn resources into a module, which can hold mutators too --- diff --git a/naja/resources.py b/naja/resources.py deleted file mode 100644 index 00ebe1c..0000000 --- a/naja/resources.py +++ /dev/null @@ -1,103 +0,0 @@ -import os -import sys - -try: - from pkg_resources import resource_filename -except ImportError: - # OK, we're most likely running under py2exe, so this is safe - # (for values of safe that are unconcerned about py2exe being involved) - def resource_filename(mod, path): - # There are better ways of doing this, but I've spent too much - # time going down this rabbithole already - return os.path.join(os.path.dirname(__file__), '..', 'data', path) -import pygame - - -class ResourceNotFound(Exception): - pass - - -class Resources(object): - CONVERT_ALPHA = True - - def __init__(self, resource_module, language=None): - self.resource_module = resource_module - self.lang_dialect = language - self.language = language.split('_', 1)[0] if language else None - self._cache = {} - - def create_resource_path(self, *path_fragments): - return resource_filename(self.resource_module, - os.path.join(*path_fragments)) - - def get_resource_path(self, *path_fragments): - for mod, full_path_fragments in self.lang_locations(path_fragments): - path = resource_filename(mod, os.path.join(*full_path_fragments)) - if os.path.exists(path): - return path - raise ResourceNotFound(os.path.join(*path_fragments)) - - def lang_locations(self, path_fragments): - ''' - For each resource module, yield: - * (, (_, )) - * (, (, )) - * (, (, )) - ''' - for module in (self.resource_module,): - if self.lang_dialect: - yield (module, (self.lang_dialect,) + path_fragments) - if self.language != self.lang_dialect: - yield (module, (self.language,) + path_fragments) - yield (module, path_fragments) - - def get_file(self, *path_fragments, **kw): - mode = kw.get('mode', "rU") - try: - path = self.get_resource_path(*path_fragments) - except ResourceNotFound: - if 'w' in mode: - path = self.create_resource_path(*path_fragments) - else: - raise - return file(path, mode) - - def get_image(self, *name_fragments, **kw): - transforms = kw.get('transforms', ()) - basedir = kw.get('basedir', 'images') - - path = (basedir,) + name_fragments - - if path not in self._cache: - fn = self.get_resource_path(*path) - image = pygame.image.load(fn) - if self.CONVERT_ALPHA: - if not pygame.display.get_init(): - print >> sys.stderr, ("Display not initialized, " - "image '%s' not loaded." - % os.path.join(*path)) - return - image = image.convert_alpha(pygame.display.get_surface()) - self._cache[path] = image - - key = (path, transforms) - if key not in self._cache: - image = self._cache[path] - for mutator in transforms: - image = mutator(image) - self._cache[key] = image - - return self._cache[key] - - def get_font(self, file_name, font_size): - basedir = 'fonts' - key = (basedir, file_name, font_size) - - if key not in self._cache: - fn = self.get_resource_path(basedir, file_name) - self._cache[key] = pygame.font.Font(fn, font_size) - - return self._cache[key] - - -resources = Resources('data') diff --git a/naja/resources/__init__.py b/naja/resources/__init__.py new file mode 100644 index 0000000..191cbd4 --- /dev/null +++ b/naja/resources/__init__.py @@ -0,0 +1,3 @@ +from naja.resources.loader import Loader + +resources = Loader('data') diff --git a/naja/resources/loader.py b/naja/resources/loader.py new file mode 100644 index 0000000..28a3c7a --- /dev/null +++ b/naja/resources/loader.py @@ -0,0 +1,101 @@ +import os +import sys + +try: + from pkg_resources import resource_filename +except ImportError: + # OK, we're most likely running under py2exe, so this is safe + # (for values of safe that are unconcerned about py2exe being involved) + def resource_filename(mod, path): + # There are better ways of doing this, but I've spent too much + # time going down this rabbithole already + return os.path.join(os.path.dirname(__file__), '..', '..', 'data', + path) +import pygame + + +class ResourceNotFound(Exception): + pass + + +class Loader(object): + CONVERT_ALPHA = True + + def __init__(self, resource_module, language=None): + self.resource_module = resource_module + self.lang_dialect = language + self.language = language.split('_', 1)[0] if language else None + self._cache = {} + + def create_resource_path(self, *path_fragments): + return resource_filename(self.resource_module, + os.path.join(*path_fragments)) + + def get_resource_path(self, *path_fragments): + for mod, full_path_fragments in self.lang_locations(path_fragments): + path = resource_filename(mod, os.path.join(*full_path_fragments)) + if os.path.exists(path): + return path + raise ResourceNotFound(os.path.join(*path_fragments)) + + def lang_locations(self, path_fragments): + ''' + For each resource module, yield: + * (, (_, )) + * (, (, )) + * (, (, )) + ''' + for module in (self.resource_module,): + if self.lang_dialect: + yield (module, (self.lang_dialect,) + path_fragments) + if self.language != self.lang_dialect: + yield (module, (self.language,) + path_fragments) + yield (module, path_fragments) + + def get_file(self, *path_fragments, **kw): + mode = kw.get('mode', "rU") + try: + path = self.get_resource_path(*path_fragments) + except ResourceNotFound: + if 'w' in mode: + path = self.create_resource_path(*path_fragments) + else: + raise + return file(path, mode) + + def get_image(self, *name_fragments, **kw): + transforms = kw.get('transforms', ()) + basedir = kw.get('basedir', 'images') + + path = (basedir,) + name_fragments + + if path not in self._cache: + fn = self.get_resource_path(*path) + image = pygame.image.load(fn) + if self.CONVERT_ALPHA: + if not pygame.display.get_init(): + print >> sys.stderr, ("Display not initialized, " + "image '%s' not loaded." + % os.path.join(*path)) + return + image = image.convert_alpha(pygame.display.get_surface()) + self._cache[path] = image + + key = (path, transforms) + if key not in self._cache: + image = self._cache[path] + for mutator in transforms: + image = mutator(image) + self._cache[key] = image + + return self._cache[key] + + def get_font(self, file_name, font_size): + basedir = 'fonts' + key = (basedir, file_name, font_size) + + if key not in self._cache: + fn = self.get_resource_path(basedir, file_name) + self._cache[key] = pygame.font.Font(fn, font_size) + + return self._cache[key]