Source code for franz.openrdf.util.contexts

################################################################################
# Copyright (c) 2006-2017 Franz Inc.  
# All rights reserved. This program and the accompanying materials are
# made available under the terms of the MIT License which accompanies
# this distribution, and is available at http://opensource.org/licenses/MIT
################################################################################

"""
Utilities related to context managers.
"""
from contextlib import contextmanager
import doctest
import os
import sys

from past.builtins import basestring


[docs]@contextmanager def wrap_context(value): """ Wrap a no-op context around an arbitrary value, so that it can be used in a ``with`` statement. :param value: Value to be returned by the context manager. :return: A context manager wrapping ``value``. """ yield value
[docs]@contextmanager def output_to(target): """ Returns a file-like object constructed from target. Target can be: - None: the returned stream will ignore all data - True: data will be written to stdout. - a string: a file will be opened (in binary mode) - a file-like object: will be returned as is. - an int - a file descriptor. :param target: File path, None or a file-like object. """ if target is None: # TODO: consider replacing with an object with empty methods target = os.devnull # Note that True is also an int (and it equals 1 = stdout), # but we give it a special treatment because our doctests # are not smart enough to capture things written to an fd. if target is True: # Make sure that the thing we return supports binary I/O if hasattr(sys.stdout, 'buffer'): yield sys.stdout.buffer # Doctest checker only accepts strings, not bytes... elif isinstance(sys.stdout, doctest._SpoofOut): yield BinWrapper(sys.stdout) else: yield sys.stdout elif isinstance(target, int): with os.fdopen(target, 'wb') as out: yield out elif isinstance(target, basestring): with open(target, 'wb') as out: yield out elif hasattr(target, 'write'): # If it quacks like a duck and has a write method... yield target else: raise ValueError('Invalid output specification %s' % target)
# Used to convert text output streams to binary UTF-8 streams
[docs]class BinWrapper(object):
[docs] def __init__(self, target): self.target = target
[docs] def write(self, byte_string): self.target.write(byte_string.decode('utf-8'))