"""
Support for files, either as :class:`File` or external files.
"""
import copy
import os.path
import pprint
import sys
from openmdao.main.rbac import rbac, rbac_decorate
__all__ = ('FileMetadata', 'RemoteFile')
# Standard metadata and default values.
_FILEMETA = {
'path': '',
'desc': '',
'content_type': '',
'platform': sys.platform,
'binary': False,
'big_endian': sys.byteorder == 'big',
'single_precision': False,
'integer_8': False,
'unformatted': False,
'recordmark_8': False,
}
[docs]class RemoteFile(object):
"""
Wraps a :class:`file` with remote-access annotations such that only role
'owner' may access the file.
"""
def __init__(self, fileobj):
self.fileobj = fileobj
@property
[docs] def closed(self):
""" True if file is not open. """
return self.fileobj.closed
# Decorated below since we need to proxy ourselves.
def __enter__(self):
""" Enter context. """
self.fileobj.__enter__()
return self
@rbac('owner')
def __exit__(self, exc_type, exc_value, traceback):
""" Exit context. """
return self.fileobj.__exit__(exc_type, exc_value, traceback)
@rbac('owner')
[docs] def close(self):
""" Close the file. """
return self.fileobj.close()
@rbac('owner')
[docs] def flush(self):
""" Flush any buffered output. """
return self.fileobj.flush()
@rbac('owner')
def __iter__(self):
""" Return iterator. """
self.fileobj.__iter__()
return self
@rbac('owner')
[docs] def next(self):
""" Return next input line or raise StopIteration. """
return self.fileobj.next()
@rbac('owner')
[docs] def read(self, size=-1):
""" Read up to `size` bytes. """
return self.fileobj.read(size)
@rbac('owner')
[docs] def readline(self, size=-1):
""" Read one line. """
return self.fileobj.readline(size)
@rbac('owner')
[docs] def readlines(self, sizehint=-1):
""" Read until EOF. """
return self.fileobj.readlines(sizehint)
@rbac('owner')
[docs] def write(self, data):
""" Write `data` to the file. """
return self.fileobj.write(data)
rbac_decorate(RemoteFile.__enter__, 'owner', proxy_types=(RemoteFile,))
rbac_decorate(RemoteFile.__iter__, 'owner', proxy_types=(RemoteFile,))