From 6e80026fcb5a1b22b74c3e02323b8c1334269365 Mon Sep 17 00:00:00 2001 From: deadc0de6 Date: Sun, 17 Dec 2017 16:10:46 +0100 Subject: [PATCH] adding ability to edit storage meta with default editor --- catcli/catcli.py | 32 +++++++++++++++++++++++++++----- catcli/logger.py | 2 +- catcli/noder.py | 5 +++++ catcli/utils.py | 16 ++++++++++++++++ 4 files changed, 49 insertions(+), 6 deletions(-) diff --git a/catcli/catcli.py b/catcli/catcli.py index c8f3190..36616be 100755 --- a/catcli/catcli.py +++ b/catcli/catcli.py @@ -19,6 +19,7 @@ from .logger import Logger from .catalog import Catalog from .walker import Walker from .noder import Noder +from .utils import * NAME = 'catcli' CUR = os.path.dirname(os.path.abspath(__file__)) @@ -41,6 +42,7 @@ Usage: {1} rm [--catalog=] [-fV] {1} tree [--catalog=] [-V] [] {1} rename [--catalog=] [-fV] + {1} edit [--catalog=] [-fV] {1} graph [--catalog=] [-V] [] {1} help {1} --help @@ -73,7 +75,8 @@ def cmd_index(args, noder, catalog, top): return False start = datetime.datetime.now() walker = Walker(noder, nohash=nohash) - root = noder.storage_node(name, path, parent=top, attr=args['--meta']) + attr = noder.clean_storage_attr(args['--meta']) + root = noder.storage_node(name, path, parent=top, attr=attr) _, cnt = walker.index(path, name, parent=root, parentpath=path) if subsize: noder.rec_size(root) @@ -104,8 +107,8 @@ def cmd_rm(args, noder, catalog, top): if what in storages: node = next(filter(lambda x: x.name == what, top.children)) node.parent = None - catalog.save(top) - Logger.info('Storage \"{}\" removed'.format(what)) + if catalog.save(top): + Logger.info('Storage \"{}\" removed'.format(what)) else: Logger.err('Storage named \"{}\" does not exist'.format(what)) return top @@ -139,8 +142,25 @@ def cmd_rename(args, noder, catalog, top): if storage in storages: node = next(filter(lambda x: x.name == storage, top.children)) node.name = new - catalog.save(top) - Logger.info('Storage \"{}\" renamed to \"{}\"'.format(storage, new)) + if catalog.save(top): + Logger.info('Storage \"{}\" renamed to \"{}\"'.format(storage, new)) + else: + Logger.err('Storage named \"{}\" does not exist'.format(storage)) + return top + + +def cmd_edit(args, noder, catalog, top): + storage = args[''] + storages = list(x.name for x in top.children) + if storage in storages: + node = next(filter(lambda x: x.name == storage, top.children)) + attr = node.attr + if not attr: + attr = '' + new = edit(attr) + node.attr = noder.clean_storage_attr(new) + if catalog.save(top): + Logger.info('Storage \"{}\" edited'.format(storage)) else: Logger.err('Storage named \"{}\" does not exist'.format(storage)) return top @@ -190,6 +210,8 @@ def main(): cmd_graph(args, noder, top) elif args['rename']: cmd_rename(args, noder, catalog, top) + elif args['edit']: + cmd_edit(args, noder, catalog, top) return True diff --git a/catcli/logger.py b/catcli/logger.py index acfd90b..0acfebe 100644 --- a/catcli/logger.py +++ b/catcli/logger.py @@ -32,7 +32,7 @@ class Logger: ''' print a storage node ''' end = '' if attr: - end = ' {}({}){}'.format(Logger.GRAY, ','.join(attr), Logger.RESET) + end = ' {}({}){}'.format(Logger.GRAY, attr, Logger.RESET) s = '{}{}storage{}:'.format(pre, Logger.UND, Logger.RESET) s += ' {}{}{}{}'.format(Logger.PURPLE, name, Logger.RESET, end) sys.stdout.write(s+'\n') diff --git a/catcli/noder.py b/catcli/noder.py index 6b2ad09..8194c62 100644 --- a/catcli/noder.py +++ b/catcli/noder.py @@ -45,6 +45,11 @@ class Noder: ''' return a list of all storage names ''' return [x.name for x in list(top.children)] + def clean_storage_attr(self, attr): + if not attr: + return '' + return ', '.join(attr.splitlines()) + def get_node(self, top, path): ''' get the node at path ''' r = anytree.resolver.Resolver('name') diff --git a/catcli/utils.py b/catcli/utils.py index 7fe0e6a..5b0e59c 100644 --- a/catcli/utils.py +++ b/catcli/utils.py @@ -7,6 +7,9 @@ helpers import os import hashlib +import sys +import tempfile +import subprocess # local imports from catcli.logger import Logger @@ -49,3 +52,16 @@ def ask(question): ''' ask the user what to do ''' resp = input('{} [y|N] ? '.format(question)) return resp.lower() == 'y' + + +def edit(string): + ''' edit the information with the default EDITOR ''' + string = string.encode('utf-8') + EDITOR = os.environ.get('EDITOR','vim') + with tempfile.NamedTemporaryFile(prefix='catcli', suffix='.tmp') as f: + f.write(string) + f.flush() + subprocess.call([EDITOR, f.name]) + f.seek(0) + new = f.read() + return new.decode('utf-8')