Implement lexicon delete and list

This commit is contained in:
Tim Van Baak 2020-01-18 17:15:16 -08:00
parent 45f2cbd344
commit 6c5111a067
2 changed files with 136 additions and 8 deletions

View File

@ -16,32 +16,101 @@ def command_create(args):
configuration before it is playable. The editor should ensure that all configuration before it is playable. The editor should ensure that all
settings are as desired before opening the lexicon for player joins. settings are as desired before opening the lexicon for player joins.
""" """
from lexicon.manage import create_lexicon # Module imports
import config
from lexicon.manage import valid_name, create_lexicon
from user import UserModel from user import UserModel
# TODO verify args
# Verify arguments
if not valid_name(args.lexicon):
config.logger.error("Lexicon name contains illegal characters: '{}'".format(
args.lexicon))
return -1
editor = UserModel.by(name=args.editor) editor = UserModel.by(name=args.editor)
create_lexicon(args.name, editor) if editor is None:
config.logger.error("Could not find user '{}'".format(args.editor))
return -1
# Internal call
create_lexicon(args.lexicon, editor)
@requires_lexicon @requires_lexicon
@add_argument("--purge", action="store_true", help="Delete the lexicon's data")
def command_delete(args): def command_delete(args):
""" """
Delete a lexicon and all its data Delete a lexicon and optionally its data
""" """
raise NotImplementedError() # TODO # Module imports
from config import logger
from lexicon import LexiconModel
from lexicon.manage import delete_lexicon
# Verify arguments
lex = LexiconModel.by(name=args.lexicon)
if lex is None:
logger.error("Could not find lexicon '{}'".format(args.lexicon))
return -1
# Internal call
delete_lexicon(lex, args.purge)
logger.info("Deleted lexicon '{}'".format(args.lexicon))
@no_argument @no_argument
def command_list(args): def command_list(args):
""" """
List all lexicons and their statuses List all lexicons and their statuses
""" """
raise NotImplementedError() # TODO # Module imports
from lexicon.manage import get_all_lexicons
# Internal call
lexicons = get_all_lexicons()
statuses = []
for lex in lexicons:
if lex.turn['current'] is None:
statuses.append("{0.lid} {0.name} ({1})".format(lex, "Unstarted"))
elif lex.turn['current'] > lex.turn['max']:
statuses.append("{0.lid} {0.name} ({1})".format(lex, "Completed"))
else:
statuses.append("{0.lid} {0.name} (Turn {1}/{2})".format(lex, lex.turn['current'], lex.turn['max']))
for s in statuses:
print(s)
@requires_lexicon @requires_lexicon
@add_argument(
"--get", metavar="PATHSPEC", dest="get",
nargs="?", const=CONFIG_GET_ROOT_VALUE, help="Get the value of a config key")
@add_argument(
"--set", metavar=("PATHSPEC", "VALUE"), dest="set",
nargs=2, help="Set the value of a config key")
def command_config(args): def command_config(args):
""" """
Interact with a lexicon's config Interact with a lexicon's config
""" """
raise NotImplementedError() # TODO # Module imports
from config import logger
from lexicon import LexiconModel
# Verify arguments
if args.get and args.set:
logger.error("Specify one of --get and --set")
return -1
lex = LexiconModel.by(name=args.lexicon)
if lex is None:
logger.error("Could not find lexicon '{}'".format(args.lexicon))
return -1
# Internal call
if args.get:
with config.json_ro(lex.config_path) as cfg:
config_get(cfg, args.get)
if args.set:
with config.json_rw(lex.config_path) as cfg:
config_set(cfg, args.set)
# #
# Player/character commands # Player/character commands

View File

@ -1,4 +1,10 @@
"""
Functions for managing lexicons, primarily within the context of the
Amanuensis config directory.
"""
import os import os
import re
import shutil
import time import time
import uuid import uuid
@ -6,9 +12,24 @@ import config
import lexicon import lexicon
import resources import resources
def valid_name(name):
"""
Validates that a lexicon name consists only of alpahnumerics, dashes,
underscores, and spaces
"""
return name is not None and re.match(r"^[A-Za-z0-9-_ ]+$", name) is not None
def create_lexicon(name, editor): def create_lexicon(name, editor):
""" """
Creates a lexicon with the given name and sets the given user as its editor
""" """
# Verify arguments
if not valid_name(name):
raise ValueError("Invalid lexicon name: '{}'".format(name))
if editor is None:
raise ValueError("Invalid editor: '{}'".format(editor))
# Create the lexicon directory and initialize it with a blank lexicon # Create the lexicon directory and initialize it with a blank lexicon
lid = uuid.uuid4().hex lid = uuid.uuid4().hex
lex_dir = config.prepend("lexicon", lid) lex_dir = config.prepend("lexicon", lid)
@ -35,4 +56,42 @@ def create_lexicon(name, editor):
config.logger.info("Created Lexicon {0.name}, ed. {1.displayname} ({0.id})".format( config.logger.info("Created Lexicon {0.name}, ed. {1.displayname} ({0.id})".format(
l, editor)) l, editor))
return l return l
def delete_lexicon(lex, purge=False):
"""
Deletes the given lexicon from the internal configuration
Does not delete the lexicon from the data folder unless purge=True.
"""
# Verify arguments
if lex is None:
raise ValueError("Invalid lexicon: '{}'".format(lex))
# Delete the lexicon from the index
with config.json_rw('lexicon', 'index.json') as j:
if lex.id in j:
del j[lex.id]
# Delete the lexicon data folder if purging
if purge:
raise NotImplementedError()
# Delete the lexicon config
lex_path = config.prepend('lexicon', lex.id)
shutil.rmtree(lex_path)
def get_all_lexicons():
"""
Loads each lexicon in the lexicon index
"""
# Get all the lexicon ids in the index
with config.json_ro('lexicon', 'index.json') as index:
lids = list(index.values())
# Load all of the lexicons
lexes = map(lambda id: lexicon.LexiconModel.by(lid=id), lids)
return lexes