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.
119 lines
3.2 KiB
Python
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
|