Skip to content

Commit 7bee174

Browse files
authored
#396: Make JSON_data_files_validator_loader.py callable from the command line (#400)
* #396: fix conflicts and make 2 modules callable * #396: fix logger module import * #396: reorganize imports in 2 modules * #396: remove unused file * #396: fix some invalid import * #396: fix bad import * #396: enable to run upgrade_configuration to only reformat a configuration file * #396: remove trailing whitespace
1 parent 06666ee commit 7bee174

17 files changed

+103
-86
lines changed

docs/docs_config.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
import lbaf.Utils.csv_2_json_data_converter as Csv2JsonConverter
4141
import lbaf.Utils.data_stat_files_updater as DataStatFilesUpdater
4242
import lbaf.Utils.exception_handler as exc_handler
43-
import lbaf.Utils.logging as logging
43+
import lbaf.Utils.logger as logger
4444
import lbaf.Utils.vt_data_extractor as VTDataExtractor
4545

4646

@@ -97,7 +97,7 @@
9797
Csv2JsonConverter,
9898
DataStatFilesUpdater,
9999
exc_handler,
100-
logging,
100+
logger,
101101
VTDataExtractor,
102102
configurationUpgrader]
103103

scripts/upgrade_configuration.py

+13-6
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import argparse
33

44
from lbaf import PROJECT_PATH
5-
from lbaf.Utils.logging import get_logger
5+
from lbaf.Utils.logger import get_logger
66
from lbaf.IO.lbsConfigurationUpgrader import ConfigurationUpgrader, UpgradeAction
77

88

@@ -27,8 +27,15 @@
2727
)
2828
args = parser.parse_args()
2929

30-
if not args.add and not args.remove:
31-
raise ValueError("Missing either add (-a or --add xxx) or remove arg (-r or --remove xxx)")
30+
ACTION = UpgradeAction.FORMAT_ONLY
31+
KEY = None
32+
if args.add:
33+
ACTION = UpgradeAction.ADD_KEY
34+
KEY = args.add
35+
elif args.remove:
36+
ACTION = UpgradeAction.REMOVE_KEY
37+
KEY = args.remove
38+
3239
if args.add and args.remove:
3340
raise ValueError("Cannot set both add and remove args")
3441
if args.add and not args.value:
@@ -45,9 +52,9 @@
4552
upgrader = ConfigurationUpgrader(logger=upg_logger)
4653
upgrader.upgrade_all(
4754
pattern = args.pattern,
48-
relative_to = PROJECT_PATH,
49-
action=(UpgradeAction.ADD_KEY if args.add is not None else UpgradeAction.REMOVE_KEY),
50-
key=(args.add if args.add is not None else args.remove),
55+
relative_to=PROJECT_PATH,
56+
action=ACTION,
57+
key=KEY,
5158
value=args.value,
5259
value_type=args.type
5360
)

somefile

-1
This file was deleted.

src/lbaf/Applications/JSON_data_files_validator_loader.py

+9-5
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@
55
from urllib.request import urlretrieve
66
from urllib.error import HTTPError, URLError
77

8-
from .. import PROJECT_PATH
9-
from ..Utils.logging import get_logger
10-
from ..Utils.exception_handler import exc_handler
8+
from lbaf import PROJECT_PATH
9+
from lbaf.Utils.logger import get_logger
10+
from lbaf.Utils.exception_handler import exc_handler
1111

1212
TARGET_DIR = os.path.join(PROJECT_PATH, "src", "lbaf", "imported")
1313
TARGET_SCRIPT_NAME = "JSON_data_files_validator.py"
1414
SOURCE_SCRIPT_URL=f"https://raw.githubusercontent.com/DARMA-tasking/vt/develop/scripts/{TARGET_SCRIPT_NAME}"
15+
IMPORT_DIR = os.path.join(PROJECT_PATH, "src", "lbaf", "imported")
16+
1517

1618
def _save_schema_validator_and_init_file():
1719
"""Downloads the JSON data files validator module to the lbaf/imported directory.
@@ -80,5 +82,7 @@ def is_loaded():
8082
:return: True if the script exists in the target location otherwise False
8183
:rtype: bool
8284
"""
83-
import_dir = os.path.join(PROJECT_PATH, "src", "lbaf", "imported")
84-
return os.path.isfile(os.path.join(import_dir, TARGET_SCRIPT_NAME))
85+
return os.path.isfile(os.path.join(IMPORT_DIR, TARGET_SCRIPT_NAME))
86+
87+
if __name__ == "__main__":
88+
load()

src/lbaf/Applications/LBAF_app.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
from lbaf.Applications import JSON_data_files_validator_loader
1414
from lbaf.Utils.exception_handler import exc_handler
1515
from lbaf.Utils.path import abspath
16-
from lbaf.Utils.logging import get_logger, Logger
16+
from lbaf.Utils.logger import get_logger, Logger
1717
import lbaf.IO.lbsStatistics as lbstats
1818
from lbaf.IO.lbsConfigurationValidator import ConfigurationValidator
1919
from lbaf.IO.lbsVTDataReader import LoadReader

src/lbaf/Applications/MoveCountsViewer.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
from lbaf import PROJECT_PATH
99
from lbaf.Utils.exception_handler import exc_handler
10-
from lbaf.Utils.logging import get_logger, Logger
10+
from lbaf.Utils.logger import get_logger, Logger
1111

1212

1313
class MoveCountsViewerParameters:

src/lbaf/Applications/rank_object_enumerator.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from lbaf import PROJECT_PATH
99
from lbaf.IO.lbsVTDataReader import LoadReader
1010
from lbaf.Utils.exception_handler import exc_handler
11-
from lbaf.Utils.logging import get_logger
11+
from lbaf.Utils.logger import get_logger
1212
from lbaf.Utils.path import abspath
1313
from lbaf.Model.lbsPhase import Phase
1414
from lbaf.IO.lbsStatistics import (

src/lbaf/Execution/lbsAlgorithmBase.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from ..Model.lbsPhase import Phase
77
from ..Model.lbsWorkModelBase import WorkModelBase
88
from ..Utils.exception_handler import exc_handler
9-
from ..Utils.logging import get_logger, Logger
9+
from ..Utils.logger import get_logger, Logger
1010

1111

1212
class AlgorithmBase:

src/lbaf/Execution/lbsCriterionBase.py

-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
from ..Model.lbsWorkModelBase import WorkModelBase
77
from ..Model.lbsPhase import Phase
88
from ..Utils.exception_handler import exc_handler
9-
from ..Utils.logging import get_logger
109

1110

1211
class CriterionBase:

src/lbaf/IO/lbsConfigurationUpgrader.py

+57-44
Original file line numberDiff line numberDiff line change
@@ -31,28 +31,31 @@ def bool_representer(dumper, value):
3131
text = "False"
3232
return dumper.represent_scalar('tag:yaml.org,2002:bool', text)
3333

34+
3435
class UpgradeAction(Enum):
3536
"""Upgrade action"""
3637

3738
ADD_KEY = "add"
3839
REMOVE_KEY = "remove"
40+
FORMAT_ONLY = "format_only"
3941

4042
class ConfigurationDumper(yaml.Dumper):
4143
"""Custom dumper to add indent before list items hyphens."""
4244

4345
def increase_indent(self, flow=False, indentless=False):
4446
return super(ConfigurationDumper, self).increase_indent(flow, False)
4547

48+
49+
ConfigurationDumper.add_representer(bool, bool_representer)
50+
51+
4652
class ConfigurationUpgrader:
4753
"""This class enables to bulk upgrade configuration files by adding or removing keys."""
4854

49-
__dumper: ConfigurationDumper
5055
__logger: Logger
5156
__sections: dict
5257

5358
def __init__(self, logger: Logger):
54-
self.__dumper = ConfigurationDumper
55-
self.__dumper.add_representer(bool, bool_representer)
5659
self.__logger = logger
5760
self.__sections = cast(dict, ConfigurationValidator.allowed_keys(group=True))
5861

@@ -68,42 +71,52 @@ def write_node(self, k: str, value: Any, yaml_file: IO, indent_size: int = 2):
6871
indent=indent_size,
6972
line_break='\n',
7073
sort_keys=False,
71-
Dumper=self.__dumper
74+
Dumper=ConfigurationDumper
7275
).replace(
7376
'\n',
7477
'\n' + indent_str
7578
)
7679
if yaml_node.endswith('\n' + indent_str):
7780
yaml_node = yaml_node[:-(indent_size + 1)]
7881
else:
79-
yaml_node = " " + yaml.representer.BaseRepresenter().represent_data(value).value
82+
yaml_node = yaml.dump(
83+
value,
84+
indent=0,
85+
Dumper=ConfigurationDumper,
86+
explicit_start=None,
87+
explicit_end=None
88+
)
89+
if yaml_node.endswith('...\n'):
90+
yaml_node = yaml_node[:-4]
91+
yaml_node = ' ' + yaml_node.strip()
8092
yaml_file.write(yaml_node)
8193
yaml_file.write('\n')
8294

8395
def upgrade(
8496
self,
8597
file_path: Path,
8698
action: UpgradeAction,
87-
key: str,
99+
key: str = None,
88100
value: str = None,
89101
value_type: str = "str"
90102
) -> None:
91103
"""Apply an upgrade to the given configuration file."""
92104
self.__logger.debug("Upgrading file %s ...", file_path)
93105
key_path = None
94-
if action == UpgradeAction.ADD_KEY:
95-
self.__logger.debug("Add key `%s` with value `%s`", key, value)
96-
elif action == UpgradeAction.REMOVE_KEY:
97-
print(f"Remove key `{key}`")
98-
key_path = key.split('.')
99-
parsed_value = value
100-
if value_type is not None:
101-
type_v = locate(value_type)
102-
if callable(type_v):
103-
parsed_value = type_v(value)
104-
105-
if key_path is None:
106-
raise ValueError("The `key` must be a valid string")
106+
if action != UpgradeAction.FORMAT_ONLY:
107+
if action == UpgradeAction.ADD_KEY:
108+
self.__logger.debug("Add key `%s` with value `%s`", key, value)
109+
elif action == UpgradeAction.REMOVE_KEY:
110+
print(f"Remove key `{key}`")
111+
key_path = key.split('.')
112+
parsed_value = value
113+
if value_type is not None:
114+
type_v = locate(value_type)
115+
if callable(type_v):
116+
parsed_value = type_v(value)
117+
118+
if key_path is None and action != UpgradeAction.FORMAT_ONLY:
119+
raise ValueError("The `key` must be a valid string")
107120

108121
conf = None
109122
file_comment = None
@@ -126,36 +139,36 @@ def upgrade(
126139
file_comment = file_comment.strip() # removes potential eol at the end
127140

128141
yaml_file.seek(0)
129-
130142
yaml_content = yaml_file.read()
131143
conf = yaml.safe_load(yaml_content)
132144
node = conf
133-
for i, key in enumerate(key_path):
134-
is_leaf = i == len(key_path)-1
135-
# if node does not exist create it
136-
if not key in node.keys():
137-
if action == UpgradeAction.ADD_KEY:
138-
if is_leaf:
145+
if action != UpgradeAction.FORMAT_ONLY:
146+
for i, key in enumerate(key_path):
147+
is_leaf = i == len(key_path)-1
148+
# if node does not exist create it
149+
if not key in node.keys():
150+
if action == UpgradeAction.ADD_KEY:
151+
if is_leaf:
152+
node[key] = parsed_value
153+
else:
154+
new_branch = {}
155+
new_node = new_branch
156+
new_key_path = key_path[i+1:]
157+
for j, new_key in enumerate(new_key_path):
158+
is_leaf = j == len(new_key_path) - 1
159+
new_node[new_key] = parsed_value if is_leaf else {}
160+
new_node = new_node[new_key]
161+
node[key] = new_branch
162+
elif is_leaf:
163+
if action == UpgradeAction.REMOVE_KEY:
164+
del node[key]
165+
elif action == UpgradeAction.ADD_KEY:
139166
node[key] = parsed_value
140-
else:
141-
new_branch = {}
142-
new_node = new_branch
143-
new_key_path = key_path[i+1:]
144-
for j, new_key in enumerate(new_key_path):
145-
is_leaf = j == len(new_key_path) - 1
146-
new_node[new_key] = parsed_value if is_leaf else {}
147-
new_node = new_node[new_key]
148-
node[key] = new_branch
149-
elif is_leaf:
150-
if action == UpgradeAction.REMOVE_KEY:
151-
del node[key]
152-
else:
153-
node[key] = parsed_value
154-
# go next node in child tree
155-
if is_leaf:
156-
break
167+
# go next node in child tree
168+
if is_leaf:
169+
break
157170

158-
node=node[key]
171+
node=node[key]
159172

160173
with open(file_path, 'w', encoding="utf-8") as yaml_file:
161174
if file_comment is not None:

src/lbaf/IO/lbsConfigurationValidator.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -186,9 +186,9 @@ def allowed_keys(group: bool = False) -> Union[List[str], Dict[str, List[str]]]
186186
"work model": ["work_model"],
187187
"algorithm": ["brute_force_optimization", "algorithm"],
188188
"output": [
189-
"logging_level", "log_to_file", "overwrite_validator", "check_schema", "terminal_background",
189+
"logging_level", "log_to_file", "overwrite_validator", "terminal_background",
190190
"generate_multimedia", "output_dir", "output_file_stem",
191-
"LBAF_Viz"
191+
"LBAF_Viz", "write_JSON"
192192
]
193193
}
194194

src/lbaf/IO/lbsGridStreamer.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import vtk
44

5-
from ..Utils.logging import get_logger, Logger
5+
from ..Utils.logger import get_logger, Logger
66

77

88
class GridStreamer:

src/lbaf/Model/lbsPhase.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from ..IO.lbsStatistics import print_subset_statistics, print_function_statistics, sampler
1212
from ..IO.lbsVTDataReader import LoadReader
1313
from ..Utils.exception_handler import exc_handler
14-
from ..Utils.logging import get_logger
14+
from ..Utils.logger import get_logger
1515

1616

1717
class Phase:

src/lbaf/Model/lbsWorkModelBase.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import sys
44

55
from ..Utils.exception_handler import exc_handler
6-
from ..Utils.logging import get_logger
6+
from ..Utils.logger import get_logger
77

88
class WorkModelBase:
99
"""An abstract base class of per-rank work model."""

0 commit comments

Comments
 (0)