You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
108 lines
3.6 KiB
108 lines
3.6 KiB
import argparse
|
|
import csv
|
|
import json
|
|
import sys
|
|
from typing import Optional
|
|
from typing import Sequence
|
|
|
|
from pysondb import db
|
|
from pysondb.utils import merge_n_db
|
|
from pysondb.utils import migrate
|
|
from pysondb.utils import print_db_as_table
|
|
from pysondb.utils import purge_db
|
|
|
|
try:
|
|
import ujson as json # type:ignore # noqa: F811
|
|
except ImportError:
|
|
import json
|
|
|
|
|
|
def main(argv: Optional[Sequence[str]] = None) -> int:
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument('--info', action='store_true',
|
|
help='Get the pysondb version info and the JSON parser info')
|
|
|
|
sub = parser.add_subparsers(dest='sub')
|
|
migrate_cmd = sub.add_parser('migrate')
|
|
migrate_cmd.add_argument(
|
|
'old', help='the path to the db with the old schema')
|
|
migrate_cmd.add_argument(
|
|
'new', help='the path to the file to put the db with the new schema')
|
|
migrate_cmd.add_argument('--indent', type=int,
|
|
default=4, help='set the indent of the output DB')
|
|
show = sub.add_parser('show')
|
|
show.add_argument('db', help='the path to the db to print as a table')
|
|
merge = sub.add_parser(
|
|
'merge', help='merge two or more DB with the same keys')
|
|
merge.add_argument('filenames', nargs='*')
|
|
merge.add_argument('--output', '-o', required=True,
|
|
help='The name of the output JSON file.')
|
|
to_csv = sub.add_parser('tocsv')
|
|
to_csv.add_argument('db_file', help='The DB file to convert to CSV')
|
|
to_csv.add_argument(
|
|
'--output', '-o', help='The name fo the output csv file')
|
|
purge = sub.add_parser('purge')
|
|
purge.add_argument('db_file', help='The DB file to purge')
|
|
|
|
args = parser.parse_args(argv)
|
|
if args.info:
|
|
print('PysonDB - 2.0.0')
|
|
if db.UJSON:
|
|
print("using 'ujson' JSON parser")
|
|
else:
|
|
print('using builtin JSON parser')
|
|
return 0
|
|
|
|
if args.sub == 'migrate':
|
|
with open(args.old) as f:
|
|
new_data = migrate(json.load(f))
|
|
with open(args.new, 'w') as f:
|
|
json.dump(new_data, f, indent=args.indent)
|
|
return 0
|
|
|
|
if args.sub == 'show':
|
|
with open(args.db) as f:
|
|
content, code = print_db_as_table(json.load(f))
|
|
print(content)
|
|
return code
|
|
|
|
if args.sub == 'merge':
|
|
dbs_data = []
|
|
for _file in args.filenames:
|
|
with open(_file, encoding='utf-8') as f:
|
|
dbs_data.append(json.load(f))
|
|
new_db, op_string, err_code = merge_n_db(*dbs_data)
|
|
if op_string and err_code:
|
|
print(op_string, file=sys.stderr)
|
|
return err_code
|
|
|
|
else:
|
|
with open(args.output, 'w', encoding='utf-8') as f:
|
|
json.dump(new_db, f)
|
|
print('DB\'s merged successfully')
|
|
return err_code
|
|
|
|
if args.sub == 'tocsv':
|
|
with open(args.db_file, encoding='utf-8') as f:
|
|
with open(args.output, 'w', encoding='utf-8') as o:
|
|
csv_write = csv.writer(o)
|
|
db_data = json.load(f)
|
|
if isinstance(db_data['keys'], list):
|
|
keys = ['id'] + sorted(db_data['keys'])
|
|
csv_write.writerow(keys)
|
|
if isinstance(db_data['data'], dict):
|
|
for k, v in db_data['data'].items():
|
|
csv_write.writerow([k, *[v[i] for i in keys[1:]]])
|
|
return 0
|
|
|
|
if args.sub == 'purge':
|
|
with open(args.db_file, mode='w', encoding='utf-8') as f:
|
|
new_p_data = purge_db({})
|
|
json.dump(new_p_data, f)
|
|
return 0
|
|
return 0
|
|
|
|
|
|
if __name__ == '__main__':
|
|
raise SystemExit(main())
|