Source code for epygram.resources.FileResource
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright (c) Météo France (2014-)
# This software is governed by the CeCILL-C license under French law.
# http://www.cecill.info
"""
Contains the class that handle a FileResource.
"""
from __future__ import print_function, absolute_import, unicode_literals, division
import os
import footprints
from bronx.syntax.decorators import nicedeco
from epygram.base import Resource
from epygram import epygramError, config
epylog = footprints.loggers.getLogger(__name__)
[docs]class FileResource(Resource):
"""Generic abstract class implementing a Resource."""
_abstract = True
_collector = ('epyresource', 'dataformat')
_footprint = dict(
attr=dict(
format=dict(
optional=True,
info="Format of the resource."),
filename=dict(
info="File name (absolute or relative) of the resource."),
fmtdelayedopen=dict(
optional=True,
default=False,
type=bool,
info="Opening of the resource delayed (not at time of " +
"construction).")
)
)
@nicedeco
def _openbeforedelayed(mtd):
"""Decorator for Resource: open resource before calling method."""
def nowopen(self, *args, **kwargs):
if not self.isopen:
self.open()
return mtd(self, *args, **kwargs)
return nowopen
_openbeforedelayed = staticmethod(_openbeforedelayed)
def __init__(self, *args, **kwargs):
super(Resource, self).__init__(*args, **kwargs)
self.container = footprints.proxy.container(filename=self.filename)
if self.openmode in ('r', 'a') and\
not os.path.exists(self.container.abspath):
raise IOError(self.container.abspath + " does not exist.")
if self.openmode in ('r', 'a'):
assert os.access(self.container.abspath, os.R_OK), \
'No reading permission for file: ' + self.container.abspath
# protection against unhappy overwrites...
if config.protect_unhappy_writes and \
os.path.exists(self.container.abspath) and self.openmode == 'w':
self._overwrite = input(' '.join([self.container.abspath,
"will be overwritten:",
"do you want to continue",
"(y/n) ? "])) == 'y'
if not self._overwrite:
raise epygramError(self.container.abspath + " already exists.")
if self.openmode == 'a':
assert os.access(self.container.abspath, os.W_OK), \
'No writing permission for file: ' + self.container.abspath
if self.openmode == 'w':
if os.path.exists(self.container.abspath):
assert os.access(self.container.abspath, os.W_OK), \
'No overwriting permission for file: ' + self.container.abspath
else:
dirpath = os.path.dirname(self.container.abspath)
assert os.path.exists(dirpath), \
'Trying to write into non-existing directory: ' + dirpath
assert os.access(dirpath, os.W_OK), \
'No writing permission in directory: ' + dirpath
[docs] def open(self, openmode=None):
"""
Opens the resource properly.
:param openmode: to open with a specific openmode, eventually different from
the one specified at initialization.
"""
if openmode is not None:
self._attributes['openmode'] = openmode
footprints.collectors.get(tag='epyresources').fasttrack = ('format',)
footprints.collectors.get(tag='dataformats').fasttrack = ('format',)