[cranslib/conffile] Une librairie pour gérer les fichiers de configuration

* S'utilise avec un context manager, le but est de faire un fichier
 temporaire de backup, et de s'assurer qu'on ferme bien le fichier dans
 lequel on écrit au fur et à mesure du temps
This commit is contained in:
Pierre-Elliott Bécue 2014-04-30 21:30:58 +02:00
parent cc3bdf8b7c
commit 980afad15c

81
cranslib/conffile.py Normal file
View file

@ -0,0 +1,81 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Library designed to write in config files data
# safely.
#
# Author : Pierre-Elliott Bécue <becue@crans.org>
# License : GPLv3
# Date : 30/05/2014
import tempfile
import shutil
import sys
import time
class ConfFile(object):
"""Class handling ConfigFiles
"""
def __init__(self, filename):
self._name = filename
self._backup = None
self._fd = None
def __enter__(self):
"""This file is used in context manager
In case of syntax "with ConfFile("blop") as troll,
troll will bind on self
"""
self.safe_open()
return self
def __exit__(self, etype, evalue, etraceback):
"""Closes file, and, if there is any traceback, restores
the backup
"""
self._fd.close()
if etype:
# In case of exception, cleans the mess.
self.restore()
def safe_open(self):
"""Open a file in writemode but backups it before.
"""
self._backup = tempfile.NamedTemporaryFile()
try:
shutil.copyfile(self._name, self._backup.name)
except IOError:
self._backup = None
self._fd = open(self._name, 'w')
def write(self, data):
"""Writes data into file
"""
self._fd.write(data)
def restore(self):
"""Restores the tempfile
"""
if self._backup is not None:
shutil.copyfile(self._backup.name, self._name)
def header(self, comment="#"):
myHeader = """********************************************************************************************
This file was generated automatically using the software %s.
You should not modify it directly if you don't know what you are doing.
Date : %s
********************************************************************************************""" % (sys.argv[0].split("/")[-1], time.strftime("%d/%m/%Y - %H:%M:%S", time.localtime()))
myHeader = comment + myHeader.replace("\n", "\n%s" % (comment,))
myHeader += "\n\n"
self.write(myHeader)