Implement lexicon delete and list
This commit is contained in:
parent
45f2cbd344
commit
6c5111a067
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
@ -36,3 +57,41 @@ def create_lexicon(name, editor):
|
||||||
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
|
Loading…
Reference in New Issue