You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Lark/lark/cli/__init__.py

119 lines
3.2 KiB
Python

import argparse
import copy
import dataclasses
import os.path
import xdg
import lark.cli.model
from lark import metadata
# TODO: This stuff goes in an eventual config module/class.
SQLITE_FILENAME = 'metadata.db'
data_path = os.path.join(xdg.XDG_DATA_HOME, 'lark')
# TODO: This is pretty clunky, maybe it can be redesigned?
ALIASES = {
'verbs': {
'list': ['list', 'ls'],
'add': ['add', 'a'],
'modify': ['modify', 'mod'],
'remove': ['remove', 'rm', 'delete', 'del'],
'test': ['test'],
},
'objects': {
'platform': ['platform', 'platforms'],
},
}
parser = argparse.ArgumentParser('Lark')
parser.add_argument('verb')
parser.add_argument('object')
parser.add_argument('parameters', nargs=argparse.REMAINDER)
args = parser.parse_args()
metadata.configure(os.path.join(data_path, SQLITE_FILENAME))
def cli_init():
if args.verb in ALIASES['verbs']['list']:
verb_list()
elif args.verb in ALIASES['verbs']['add']:
verb_add()
elif args.verb in ALIASES['verbs']['modify']:
verb_modify()
elif args.verb in ALIASES['verbs']['remove']:
verb_remove()
elif args.verb in ALIASES['verbs']['test']:
verb_test()
else:
print('Verb %s was not recognized.' % args.verb)
# TODO: Probably make a verbs submodule.
def verb_list():
if args.object in ALIASES['objects']['platform']:
filters = {}
with metadata.get_db_session() as session:
print(metadata.search(session, metadata.Platform, **filters))
else:
error_unsupported_object()
def verb_add():
if args.object in ALIASES['objects']['platform']:
parameters = parse_parameters(args.parameters)
# TODO: Ask for confirmation.
# TODO: Data editor
new_platform = metadata.Platform(**parameters)
with metadata.get_db_session() as session:
session.add(new_platform)
print('Added platform %s.' % new_platform.shortcode)
else:
error_unsupported_object()
def verb_modify():
if args.object in ALIASES['objects']['platform']:
parameters = parse_parameters(args.parameters)
with metadata.get_db_session() as session:
platforms = metadata.search(session, metadata.Platform, **parameters)
platform_to_modify = lark.cli.model.prompt_select_from_list(
platforms, 'Select a platform to modify.')
lark.cli.model.editor(platform_to_modify)
def verb_remove():
if args.object in ALIASES['objects']['platform']:
parameters = parse_parameters(args.parameters)
with metadata.get_db_session() as session:
platforms = metadata.search(session, metadata.Platform, **parameters)
for platform in platforms:
print('Removing %s.' % platform.fullname)
session.delete(platform)
def verb_test():
pass
# TODO: Probably make an errors submodule.
def error_unsupported_object():
print('Verb %s does not support object %s.' % (args.verb, args.object))
def parse_parameters(parameters_list):
parameters = {}
for parameter_string in parameters_list:
key, value = parameter_string.split('=')
parameters[key] = value
return parameters