ftl/common/context.py (41 lines of code) (raw):

# Copyright 2017 Google Inc. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """This package defines the interface for accessing the build context.""" import abc import os class Base(object): """Base is an abstract base class representing an application context. It provides methods used by builders for accessing app files. """ # __enter__ and __exit__ allow use as a context manager. def __enter__(self): """Initialize the context.""" return self def __exit__(self, unused_type, unused_value, unused_traceback): """Cleanup the context.""" @abc.abstractmethod def Contains(self, relative_path): """Whether the application context contains the given file.""" @abc.abstractmethod def ListFiles(self): """Recursively enumerate the files under the workspace. Yields: the paths of files within the context, suitable for use with GetFile. """ @abc.abstractmethod def GetFile(self, relative_path): """Retrieve the contents of a particular file. Args: relative_path: The relative path of the file to read. Returns: the contents of the file. """ class Workspace(Base): """Workspace is a context implementation for working with files in a local directory. """ def __init__(self, directory): super(Workspace, self).__init__() self._directory = directory def Contains(self, relative_path): """Override.""" fqpath = os.path.join(self._directory, relative_path) return os.path.isfile(fqpath) def ListFiles(self): """Override.""" dir = self._directory + '/' for root, dirnames, filenames in os.walk(dir): relative = root[len(dir):] for fname in filenames: yield os.path.join(relative, fname) def GetFile(self, filename): """Override.""" fqname = os.path.join(self._directory, filename) with open(fqname, 'rb') as f: return f.read() class Memory(Base): """Memory is a context implementation for working with files in memory.""" def __init__(self): self._files = {} def AddFile(self, filename, contents): self._files[filename] = contents def Contains(self, relative_path): return relative_path in self._files def ListFiles(self): for path in self._files: yield path def GetFile(self, filename): return self._files[filename]