blob: fc4c70d4a64be78a62c11c89d8b8ee1d4a2d497d [file] [log] [blame]
# 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