forked from assume-framework/assume
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcli.py
151 lines (129 loc) · 4.05 KB
/
cli.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#!/usr/bin/env python
# PYTHON_ARGCOMPLETE_OK
# SPDX-FileCopyrightText: ASSUME Developers
#
# SPDX-License-Identifier: AGPL-3.0-or-later
import argparse
import logging
import os
import sys
from pathlib import Path
import argcomplete
import yaml
from sqlalchemy import make_url
os.makedirs("./examples/outputs", exist_ok=True)
os.makedirs("./examples/local_db", exist_ok=True)
def db_uri_completer(prefix, parsed_args, **kwargs):
return {
"sqlite://example.db": "example",
f"sqlite://examples/local_db/{parsed_args.scenario}.db": "current scenario",
"sqlite:///": "in-memory",
"postgresql://assume:assume@localhost:5432/assume": "localhost",
"postgresql://assume:assume@assume_db:5432/assume": "docker",
"mysql://username:password@localhost:3306/database": "mysql",
}
def config_directory_completer(prefix, parsed_args, **kwargs):
directory = Path(parsed_args.input_path)
if directory.is_dir():
config_folders = [
folder
for folder in directory.iterdir()
if folder.is_dir() and (folder / "config.yaml").exists()
]
return [
folder.name for folder in config_folders if folder.name.startswith(prefix)
]
return [""]
def config_case_completer(prefix, parsed_args, **kwargs):
config_file = (
Path(parsed_args.input_path) / Path(parsed_args.scenario) / "config.yaml"
)
if config_file.is_file():
with open(str(config_file), "r") as f:
config = yaml.safe_load(f)
return list(config.keys())
return [""]
def cli(args=None):
if not args:
args = sys.argv[1:]
parser = argparse.ArgumentParser(
description="Command Line Interface for ASSUME simulations",
)
parser.add_argument(
"-s",
"--scenario",
help="name of the scenario file which should be used",
default="example_01a",
type=str,
).completer = config_directory_completer
parser.add_argument(
"-c",
"--case-study",
help="name of the case in that scenario which should be simulated",
default="",
type=str,
).completer = config_case_completer
parser.add_argument(
"-csv",
"--csv-export-path",
help="optional path to the csv export",
default="",
type=str,
).completer = argcomplete.DirectoriesCompleter()
parser.add_argument(
"-db",
"--db-uri",
help="uri string for a database",
default="",
type=str,
).completer = db_uri_completer
parser.add_argument(
"-i",
"--input-path",
help="path to the input folder",
default="examples/inputs",
type=str,
).completer = argcomplete.DirectoriesCompleter()
parser.add_argument(
"-l",
"--loglevel",
help="logging level used for file log",
default="INFO",
type=str,
metavar="LOGLEVEL",
choices=set(logging._nameToLevel.keys()),
)
argcomplete.autocomplete(parser)
args = parser.parse_args(args)
name = args.scenario
if args.db_uri:
db_uri = make_url(args.db_uri)
else:
db_uri = f"sqlite:///./examples/local_db/{name}.db"
try:
from assume import World, load_scenario_folder, run_learning
world = World(
database_uri=db_uri,
export_csv_path=args.csv_export_path,
log_level=args.loglevel,
)
load_scenario_folder(
world,
inputs_path=args.input_path,
scenario=args.scenario,
study_case=args.case_study,
)
if world.learning_config.get("learning_mode", False):
run_learning(
world,
inputs_path=args.input_path,
scenario=args.scenario,
study_case=args.case_study,
)
world.run()
except KeyboardInterrupt:
pass
if __name__ == "__main__":
cli()
# args = "-s example_02 -db postgresql://assume:assume@localhost:5432/assume"
# cli(args.split(" "))