-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathcli.py
More file actions
131 lines (105 loc) · 3.71 KB
/
Copy pathcli.py
File metadata and controls
131 lines (105 loc) · 3.71 KB
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
"""
Root CLI for modflow-devtools.
Usage:
mf sync
mf dfns sync
mf dfns info
mf dfns list
mf dfns clean
mf models sync
mf models info
mf models list
mf models copy <model> <workspace>
mf models cp <model> <workspace> # cp is an alias for copy
mf programs sync
mf programs info
mf programs list
mf programs install <program>
mf programs uninstall <program>
mf programs history
"""
import argparse
import sys
import warnings
def _sync_all():
"""Sync all registries (dfns, models, programs)."""
print("Syncing all registries...")
print()
# Sync DFNs
print("=== DFNs ===")
try:
from modflow_devtools.dfns.registry import sync_dfns
registries = sync_dfns()
for registry in registries:
meta = registry.registry_meta
print(f" {registry.ref}: {len(meta.files)} files")
print(f"Synced {len(registries)} DFN registry(ies)")
except Exception as e:
print(f"Error syncing DFNs: {e}")
print()
# Sync Models
print("=== Models ===")
try:
from modflow_devtools.models import ModelSourceConfig
config = ModelSourceConfig.load()
config.sync()
print("Models synced successfully")
except Exception as e:
print(f"Error syncing models: {e}")
print()
# Sync Programs
print("=== Programs ===")
try:
# Suppress experimental warning
with warnings.catch_warnings():
warnings.filterwarnings("ignore", message=".*modflow_devtools.programs.*experimental.*")
from modflow_devtools.programs import ProgramSourceConfig
config = ProgramSourceConfig.load()
config.sync()
print("Programs synced successfully")
except Exception as e:
print(f"Error syncing programs: {e}")
print()
print("All registries synced!")
def main():
"""Main entry point for the mf CLI."""
parser = argparse.ArgumentParser(
prog="mf",
description="MODFLOW development tools",
)
subparsers = parser.add_subparsers(dest="subcommand", help="Available commands")
# Sync subcommand (syncs all APIs)
subparsers.add_parser("sync", help="Sync all registries (dfns, models, programs)")
# DFNs subcommand
subparsers.add_parser("dfns", help="Manage MODFLOW 6 definition files")
# Models subcommand
subparsers.add_parser("models", help="Manage MODFLOW model registries")
# Programs subcommand
subparsers.add_parser("programs", help="Manage MODFLOW program registries")
# Parse only the first level to determine which submodule to invoke
args, remaining = parser.parse_known_args()
if not args.subcommand:
parser.print_help()
sys.exit(1)
# Dispatch to the appropriate module CLI with remaining args
if args.subcommand == "sync":
_sync_all()
elif args.subcommand == "dfns":
from modflow_devtools.dfns.__main__ import main as dfns_main
sys.argv = ["mf dfns", *remaining]
sys.exit(dfns_main())
elif args.subcommand == "models":
from modflow_devtools.models.__main__ import main as models_main
# Replace sys.argv to make it look like we called the submodule directly
sys.argv = ["mf models", *remaining]
models_main()
elif args.subcommand == "programs":
import warnings
# Suppress experimental warning for official CLI
with warnings.catch_warnings():
warnings.filterwarnings("ignore", message=".*modflow_devtools.programs.*experimental.*")
from modflow_devtools.programs.__main__ import main as programs_main
sys.argv = ["mf programs", *remaining]
programs_main()
if __name__ == "__main__":
main()