# Copyright 2013 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """A Resource is a file and its various associated canonical names.""" import codecs import os class Resource(object): """Represents a file found via a path search.""" def __init__(self, toplevel_dir, absolute_path, binary=False): self.toplevel_dir = toplevel_dir self.absolute_path = absolute_path self._contents = None self._binary = binary @property def relative_path(self): """The path to the file from the top-level directory""" return os.path.relpath(self.absolute_path, self.toplevel_dir) @property def unix_style_relative_path(self): return self.relative_path.replace(os.sep, '/') @property def name(self): """The dotted name for this resource based on its relative path.""" return self.name_from_relative_path(self.relative_path) @staticmethod def name_from_relative_path(relative_path): dirname = os.path.dirname(relative_path) basename = os.path.basename(relative_path) modname = os.path.splitext(basename)[0] if len(dirname): name = dirname.replace(os.path.sep, '.') + '.' + modname else: name = modname return name @property def contents(self): if self._contents: return self._contents if not os.path.exists(self.absolute_path): raise Exception('%s not found.' % self.absolute_path) if self._binary: f = open(self.absolute_path, mode='rb') else: f = codecs.open(self.absolute_path, mode='r', encoding='utf-8') self._contents = f.read() f.close() return self._contents