Source code for amt.save.save

"""
amt-save -- Artifact Management Tool Reader

amt is a Tool for managing software artifacts

It defines classes_and_methods and a command line interface

@author:     Kenneth E. Bellock

@copyright:

@contact:    ken@bellock.net

"""
import os
import sys
import tempfile
import shutil
from filecmp import dircmp
import yaml

SCRIPT_PATH = os.path.abspath(os.path.dirname(__file__))
sys.path.insert(0, os.path.join(os.path.dirname(SCRIPT_PATH), 'meta'))
from meta import MetaDict
from meta import MetaList
yaml.add_representer(MetaDict,
                     lambda dumper, data: dumper.represent_mapping(
                         'tag:yaml.org,2002:map', data.items()))
yaml.add_representer(MetaList,
                     lambda dumper, data: dumper.represent_sequence(
                         'tag:yaml.org,2002:seq', data))

__all__ = ['save']


def _d(path, data):
    for key, value in data.items():
        try:
            with open(os.path.join(path, value._file), 'w') as f_obj:
                f_obj.write(yaml.dump(value, default_flow_style=False))
        except:
            newpth = os.path.join(path, key)
            if not os.path.isdir(newpth):
                os.makedirs(newpth)
            save(newpth, value)


def _d2(dcmp):
    for f in dcmp.left_only:
        if os.path.isdir(f):
            shutil.rmtree(f)
        elif os.path.isfile(f):
            os.remove(f)
    for fname in list(set(dcmp.right_only + dcmp.diff_files)):
        f = os.path.join(dcmp.right, fname)
        if os.path.isfile(f):
            relpath = os.path.relpath(f, dcmp.right)
            target = os.path.join(dcmp.left, relpath)
            target_dirname = os.path.dirname(target)
            if not os.path.isdir(target_dirname):
                os.makedirs(target_dirname)
            shutil.copy2(f, target)
        elif os.path.isdir(f):
            shutil.copytree(os.path.join(dcmp.right, fname),
                            os.path.join(dcmp.left, fname))
    for key, value in dcmp.subdirs.items():
        _d2(value)


[docs]def save(path, data, header=None, footer=None): """ Save an artifacts tree to a file or directory location. Args: path (str): The file or directory location to save the artifacts tree to. data (str or list or dict): The artifacts tree. header (:obj:`str`, optional): Header for artifacts files. footer (:obj:`str`, optional): Footer for artifacts files. """ if path.lower().endswith('.yaml'): write_data = data.copy() f_obj = open(path, 'w') if header: f_obj.write(header) f_obj.write(yaml.dump(write_data, default_flow_style=False)) if footer: f_obj.write(footer) f_obj.close() else: tmp = tempfile.mkdtemp() _d(tmp, data) _d2(dircmp(path, tmp)) shutil.rmtree(tmp)