v01
This commit is contained in:
100
scripts/batch/query-config.py
Executable file
100
scripts/batch/query-config.py
Executable file
@@ -0,0 +1,100 @@
|
||||
#!/usr/bin/env python3
|
||||
#
|
||||
# BSD 3-Clause License
|
||||
#
|
||||
# This file is part of the Basalt project.
|
||||
# https://gitlab.com/VladyslavUsenko/basalt.git
|
||||
#
|
||||
# Copyright (c) 2019-2021, Vladyslav Usenko and Nikolaus Demmel.
|
||||
# All rights reserved.
|
||||
#
|
||||
|
||||
#
|
||||
# Example usage:
|
||||
# $ ./query-config.py path/to/basalt_config.json value0.\"config.vio_debug\"
|
||||
# 10G
|
||||
|
||||
import json
|
||||
import toml
|
||||
import argparse
|
||||
import sys
|
||||
|
||||
|
||||
def parse_query(query):
|
||||
query_list = []
|
||||
|
||||
quote_open_char = None
|
||||
curr = ""
|
||||
for c in query:
|
||||
if quote_open_char:
|
||||
if c == quote_open_char:
|
||||
quote_open_char = None
|
||||
else:
|
||||
curr += c
|
||||
elif c in ['"', "'"]:
|
||||
quote_open_char = c
|
||||
elif c == '.':
|
||||
query_list.append(curr)
|
||||
curr = ""
|
||||
else:
|
||||
curr += c
|
||||
query_list.append(curr)
|
||||
|
||||
return query_list
|
||||
|
||||
|
||||
def query_config(path, query, default_value=None, format_env=False, format_cli=False):
|
||||
query_list = parse_query(query)
|
||||
with open(path) as f:
|
||||
cfg = json.load(f)
|
||||
try:
|
||||
curr = cfg
|
||||
for q in query_list:
|
||||
curr = curr[q]
|
||||
result = curr
|
||||
except:
|
||||
if default_value is None:
|
||||
result = ""
|
||||
else:
|
||||
result = default_value
|
||||
if isinstance(result, dict):
|
||||
if format_env:
|
||||
lines = []
|
||||
for k, v in result.items():
|
||||
# NOTE: assumes no special escaping is necessary
|
||||
lines.append("{}='{}'".format(k, v))
|
||||
return "\n".join(lines)
|
||||
elif format_cli:
|
||||
args = ["--{} {}".format(k, v) for k, v in result.items()]
|
||||
return " ".join(args)
|
||||
else:
|
||||
result = toml.dumps(result)
|
||||
else:
|
||||
result = "{}".format(result)
|
||||
return result
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser("Parse toml file and print content of query key.")
|
||||
parser.add_argument("config_path", help="path to toml file")
|
||||
parser.add_argument("query", help="query string")
|
||||
parser.add_argument("default_value", help="value printed if query is not successful", nargs='?')
|
||||
parser.add_argument(
|
||||
"--format-env",
|
||||
action="store_true",
|
||||
help="Expect dictionary as query result and output like environment variables, i.e. VAR='VALUE' lines.")
|
||||
parser.add_argument("--format-cli",
|
||||
action="store_true",
|
||||
help="Expect dictionary as query result and output like cli arguments, i.e. --VAR 'VALUE'.")
|
||||
args = parser.parse_args()
|
||||
|
||||
res = query_config(args.config_path,
|
||||
args.query,
|
||||
default_value=args.default_value,
|
||||
format_env=args.format_env,
|
||||
format_cli=args.format_cli)
|
||||
print(res)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user