META manipulation now goes into Metafile class

master
Lertsenem 2015-08-17 16:50:53 +02:00
parent ebf051fe3f
commit 0292d4d706
2 changed files with 99 additions and 16 deletions

View File

@ -2,10 +2,11 @@
import argparse import argparse
import logging import logging
import json
import os, os.path import os, os.path
import shutil import shutil
from metafile import Metafile, MalformedMetafileError, NoPathDefinedError
# FUNCTIONS # FUNCTIONS
######################################## ########################################
def yes_no_question(question="Yes or no?", default=False): def yes_no_question(question="Yes or no?", default=False):
@ -153,28 +154,29 @@ if args.command == "add":
confpath = appdir + "/" + confname confpath = appdir + "/" + confname
# Load app META file # Load app META file
metafile = appdir + "/" + args.metafile
try: try:
appmeta = json.load( open(metafile) ) appmeta = Metafile(json_path = appdir + "/" + args.metafile)
except FileNotFoundError: except FileNotFoundError:
log.info("Metafile %s does not exist for app %s" % (args.metafile, args.app)) log.info("Metafile %s does not exist for app %s" % (args.metafile, args.app))
appmeta = { "name" : args.app, "depends": {}, "files": {} } appmeta = Metafile( name=args.app )
except MalformedMetafileError:
log.error("Malformed metafile %s in app %s" % (args.metafile, args.app) )
exit(1)
# Check that the file is really new # Check that the file is really new
absconf = contractuser( os.path.abspath(os.path.expanduser(args.conf)) ) absconf = contractuser( os.path.abspath(os.path.expanduser(args.conf)) )
try: try:
destslist = {} dstdic = appmeta.get_files_dst2src()
for (fname,finfo) in appmeta["files"].items(): except MalformedMetafileError:
destslist[finfo["dest"]] = fname
except KeyError:
log.error("Malformed metafile %s in app %s" % (args.metafile, args.app) ) log.error("Malformed metafile %s in app %s" % (args.metafile, args.app) )
exit(1) exit(1)
if absconf in destslist: if absconf in dstdic:
log.error("File %s already exists as %s in app %s" % (absconf, destslist[absconf], args.app)) log.error("File %s already exists as %s in app %s" % (absconf, dstdic[absconf], args.app))
exit(1) exit(1)
# Copy the conf dir # Copy the conf dir
@ -207,7 +209,6 @@ if args.command == "add":
try: try:
log.info("Copying conf file") log.info("Copying conf file")
shutil.copyfile(args.conf, confpath) shutil.copyfile(args.conf, confpath)
log.info("New conf file '%s' associated with app '%s'" % (confname, args.app)) log.info("New conf file '%s' associated with app '%s'" % (confname, args.app))
except PermissionError: except PermissionError:
@ -217,12 +218,16 @@ if args.command == "add":
# Add the file to META # Add the file to META
# Update META data # Update META data
log.debug("adding meta data for %s in %s" % (confname, args.app)) log.debug("adding meta data for %s in %s" % (confname, args.app))
appmeta["files"][confname] = { "dest": absconf } appmeta.add_file( confname, dest=absconf )
# Write to the metafile # Write to the metafile
log.debug("Wrinting to metafile") try:
json.dump(appmeta, open(metafile, 'w')) log.debug("Writing to metafile")
appmeta.save()
except NoPathDefinedError:
log.error("Unable to save json Metafile for app %s : no path defined" % appmeta.name)
exit(1)
######################################## ########################################

78
persoconf/metafile.py Normal file
View File

@ -0,0 +1,78 @@
#!/usr/bin/env python3
import json
class Metafile():
"""Representation of a metafile (default name META), containing (as its
name implies) metadata."""
def __init__(self, json_path=None, name=None):
self.name = name
# json_path given => we load it ; otherwise fill with default
if json_path is not None:
self.load_json(json_path) # raise FileNotFoundError
else:
self.load_default()
def load_default(self):
self.json_path = None
self.depends = {}
self.files = {}
# (Note that name is already written in __init__)
def load_json(self, json_path):
self.json_path = json_path
tmp = json.load( open(self.json_path) ) # Can raise a FileNotFoundError
try:
self.name = tmp["name"]
self.depends = tmp["depends"]
self.files = tmp["files"]
except KeyError:
raise MalformedMetafileError("Missing attribute (name, depends or files)")
def save(self):
if self.json_path is None:
raise NoPathDefinedError("json_path is not defined")
json.dump( { "name": self.name, "depends": self.depends, "files": self.files }, open(self.json_path, 'w') )
def get_files_dst2src(self):
dstdic = {}
try:
for (fname, finfo) in self.files.items():
dstdic[ finfo["dest"] ] = fname
except KeyError:
raise MalformedMetafileError("Missing 'dest' attribute in files infos")
return dstdic
def add_file(self, name, dest):
self.files[name] = { "dest": dest }
# Exceptions
########################################
class MalformedMetafileError(Exception):
"""A custom exception to alert that the metafile is malformed"""
def __init__(self, message):
Exception.__init__(self, message)
class NoPathDefinedError(Exception):
"""A custom exception to alert that the json_path properties of the
Metafile is not defined, therefore we cannot write the data."""
def __init__(self, message):
Exception.__init__(self, message)