Skip to content

Commit f3594d2

Browse files
committed
Format
1 parent b8069e7 commit f3594d2

29 files changed

+1265
-829
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,4 @@ build/*
77
dist/*
88
pyQuARC.egg-info/*
99
env/*
10+
.venv/*

pyQuARC/__init__.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
with open(f"{ABS_PATH}/version.txt") as version_file:
1818
__version__ = version_file.read().strip()
1919

20+
2021
def version():
21-
"""Returns the current version of pyQuARC.
22-
"""
22+
"""Returns the current version of pyQuARC."""
2323
return __version__

pyQuARC/code/base_validator.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ def contains(list_of_values, value):
4040

4141
@staticmethod
4242
def compare(first, second, relation):
43-
if relation.startswith('not_'):
43+
if relation.startswith("not_"):
4444
return not (BaseValidator.compare(first, second, relation[4:]))
4545
func = getattr(BaseValidator, relation)
4646
return func(first, second)

pyQuARC/code/checker.py

+33-39
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def __init__(
2626
metadata_format=ECHO10_C,
2727
messages_override=None,
2828
checks_override=None,
29-
rules_override=None
29+
rules_override=None,
3030
):
3131
"""
3232
Args:
@@ -53,13 +53,13 @@ def __init__(
5353
self.rules_override,
5454
self.checks,
5555
self.checks_override,
56-
metadata_format=metadata_format
56+
metadata_format=metadata_format,
57+
)
58+
self.schema_validator = SchemaValidator(
59+
self.messages_override or self.messages, metadata_format
5760
)
58-
self.schema_validator = SchemaValidator(self.messages_override or self.messages, metadata_format)
5961
self.tracker = Tracker(
60-
self.rule_mapping,
61-
self.rules_override,
62-
metadata_format=metadata_format
62+
self.rule_mapping, self.rules_override, metadata_format=metadata_format
6363
)
6464

6565
@staticmethod
@@ -76,15 +76,9 @@ def load_schemas(self):
7676
self.checks = Checker._json_load_schema("checks")
7777
self.rule_mapping = Checker._json_load_schema("rule_mapping")
7878
self.messages = Checker._json_load_schema("check_messages")
79-
self.messages_override = Checker._json_load_schema(
80-
self.msgs_override_file
81-
)
82-
self.rules_override = Checker._json_load_schema(
83-
self.rules_override_file
84-
)
85-
self.checks_override = Checker._json_load_schema(
86-
self.checks_override_file
87-
)
79+
self.messages_override = Checker._json_load_schema(self.msgs_override_file)
80+
self.rules_override = Checker._json_load_schema(self.rules_override_file)
81+
self.checks_override = Checker._json_load_schema(self.checks_override_file)
8882

8983
@staticmethod
9084
def map_to_function(data_type, function):
@@ -112,19 +106,19 @@ def message(self, rule_id, msg_type):
112106
msg_type can be any one of 'failure', 'remediation'
113107
"""
114108
messages = self.messages_override.get(rule_id) or self.messages.get(rule_id)
115-
return messages[msg_type] if messages else ''
109+
return messages[msg_type] if messages else ""
116110

117111
def build_message(self, result, rule_id):
118112
"""
119113
Formats the message for `rule_id` based on the result
120114
"""
121115
failure_message = self.message(rule_id, "failure")
122-
rule_mapping = self.rules_override.get(
116+
rule_mapping = self.rules_override.get(rule_id) or self.rule_mapping.get(
123117
rule_id
124-
) or self.rule_mapping.get(rule_id)
118+
)
125119
severity = rule_mapping.get("severity", "error")
126120
messages = []
127-
if not(result["valid"]) and result.get("value"):
121+
if not (result["valid"]) and result.get("value"):
128122
for value in result["value"]:
129123
formatted_message = failure_message
130124
value = value if isinstance(value, tuple) else (value,)
@@ -143,7 +137,9 @@ def _check_dependency_validity(self, dependency, field_dict):
143137
"""
144138
Checks if the dependent check called `dependency` is valid
145139
"""
146-
dependency_fields = field_dict["fields"] if len(dependency) == 1 else [dependency[1]]
140+
dependency_fields = (
141+
field_dict["fields"] if len(dependency) == 1 else [dependency[1]]
142+
)
147143
for field in dependency_fields:
148144
if not self.tracker.read_data(dependency[0], field).get("valid"):
149145
return False
@@ -162,27 +158,26 @@ def _run_func(self, func, check, rule_id, metadata_content, result_dict):
162158
"""
163159
Run the check function for `rule_id` and update `result_dict`
164160
"""
165-
rule_mapping = self.rules_override.get(
161+
rule_mapping = self.rules_override.get(rule_id) or self.rule_mapping.get(
166162
rule_id
167-
) or self.rule_mapping.get(rule_id)
163+
)
168164
external_data = rule_mapping.get("data", [])
169165
relation = rule_mapping.get("relation")
170-
list_of_fields_to_apply = \
171-
rule_mapping.get("fields_to_apply").get(self.metadata_format, {})
172-
166+
list_of_fields_to_apply = rule_mapping.get("fields_to_apply").get(
167+
self.metadata_format, {}
168+
)
169+
173170
for field_dict in list_of_fields_to_apply:
174-
dependencies = self.scheduler.get_all_dependencies(rule_mapping, check, field_dict)
171+
dependencies = self.scheduler.get_all_dependencies(
172+
rule_mapping, check, field_dict
173+
)
175174
main_field = field_dict["fields"][0]
176175
external_data = field_dict.get("data", external_data)
177176
result_dict.setdefault(main_field, {})
178177
if not self._check_dependencies_validity(dependencies, field_dict):
179178
continue
180179
result = self.custom_checker.run(
181-
func,
182-
metadata_content,
183-
field_dict,
184-
external_data,
185-
relation
180+
func, metadata_content, field_dict, external_data, relation
186181
)
187182

188183
self.tracker.update_data(rule_id, main_field, result["valid"])
@@ -211,14 +206,16 @@ def perform_custom_checks(self, metadata_content):
211206
) or self.rule_mapping.get(rule_id)
212207
check_id = rule_mapping.get("check_id", rule_id)
213208
check = self.checks_override.get(check_id) or self.checks.get(check_id)
214-
func = Checker.map_to_function(check["data_type"], check["check_function"])
209+
func = Checker.map_to_function(
210+
check["data_type"], check["check_function"]
211+
)
215212
if func:
216213
self._run_func(func, check, rule_id, metadata_content, result_dict)
217214
except Exception as e:
218215
pyquarc_errors.append(
219216
{
220217
"message": f"Running check for the rule: '{rule_id}' failed.",
221-
"details": str(e)
218+
"details": str(e),
222219
}
223220
)
224221
return result_dict, pyquarc_errors
@@ -233,6 +230,7 @@ def run(self, metadata_content):
233230
Returns:
234231
(dict): The results of the jsonschema check and all custom checks
235232
"""
233+
236234
def _xml_postprocessor(_, key, value):
237235
"""
238236
Sometimes the XML values contain attributes.
@@ -259,11 +257,7 @@ def _xml_postprocessor(_, key, value):
259257
parser = parse
260258
kwargs = {"postprocessor": _xml_postprocessor}
261259
json_metadata = parser(metadata_content, **kwargs)
262-
result_schema = self.perform_schema_check(
263-
metadata_content
264-
)
260+
result_schema = self.perform_schema_check(metadata_content)
265261
result_custom, pyquarc_errors = self.perform_custom_checks(json_metadata)
266-
result = {
267-
**result_schema, **result_custom
268-
}
262+
result = {**result_schema, **result_custom}
269263
return result, pyquarc_errors

pyQuARC/code/constants.py

+8-8
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
ROOT_DIR = (
1616
# go up one directory
17-
os.path.abspath(os.path.join(__file__, '../..'))
17+
os.path.abspath(os.path.join(__file__, "../.."))
1818
)
1919

2020
SCHEMAS_BASE_PATH = f"{ROOT_DIR}/schemas"
@@ -46,17 +46,17 @@
4646
"rules_override",
4747
f"{UMM_C}-json-schema",
4848
"umm-cmn-json-schema",
49-
f"{UMM_G}-json-schema"
49+
f"{UMM_G}-json-schema",
5050
],
5151
"csv": GCMD_KEYWORDS,
52-
"xsd": [ f"{DIF}_schema", f"{ECHO10_C}_schema", f"{ECHO10_G}_schema" ],
53-
"xml": [ "catalog" ]
52+
"xsd": [f"{DIF}_schema", f"{ECHO10_C}_schema", f"{ECHO10_G}_schema"],
53+
"xml": ["catalog"],
5454
}
5555

5656
SCHEMA_PATHS = {
57-
schema: f"{SCHEMAS_BASE_PATH}/{schema}.{filetype}"
58-
for filetype, schemas in SCHEMAS.items()
59-
for schema in schemas
57+
schema: f"{SCHEMAS_BASE_PATH}/{schema}.{filetype}"
58+
for filetype, schemas in SCHEMAS.items()
59+
for schema in schemas
6060
}
6161

6262
VERSION_FILE = f"{SCHEMAS_BASE_PATH}/version.txt"
@@ -67,7 +67,7 @@
6767
"error": Fore.RED,
6868
"warning": Fore.YELLOW,
6969
"reset": Style.RESET_ALL,
70-
"bright": Style.BRIGHT
70+
"bright": Style.BRIGHT,
7171
}
7272

7373
GCMD_BASIC_URL = "https://gcmd.earthdata.nasa.gov/kms/concepts/concept_scheme/"

pyQuARC/code/custom_checker.py

+36-16
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ def __init__(self):
1010
pass
1111

1212
@staticmethod
13-
def _get_path_value_recursively(subset_of_metadata_content, path_list, container, query_params=None):
13+
def _get_path_value_recursively(
14+
subset_of_metadata_content, path_list, container, query_params=None
15+
):
1416
"""
1517
Gets the path values recursively while handling list or dictionary in `subset_of_metadata_content`
1618
Adds the values to `container`
@@ -37,7 +39,11 @@ def _get_path_value_recursively(subset_of_metadata_content, path_list, container
3739
container.append(subset_of_metadata_content)
3840
return
3941
new_path = path_list[1:]
40-
if isinstance(root_content, str) or isinstance(root_content, int) or isinstance(root_content, float):
42+
if (
43+
isinstance(root_content, str)
44+
or isinstance(root_content, int)
45+
or isinstance(root_content, float)
46+
):
4147
container.append(root_content)
4248
return
4349
elif isinstance(root_content, list):
@@ -46,7 +52,13 @@ def _get_path_value_recursively(subset_of_metadata_content, path_list, container
4652
return
4753
if len(new_path) == 1 and query_params:
4854
try:
49-
root_content = next((x for x in root_content if x[query_params[0]] == query_params[1]))
55+
root_content = next(
56+
(
57+
x
58+
for x in root_content
59+
if x[query_params[0]] == query_params[1]
60+
)
61+
)
5062
root_content = root_content[new_path[0]]
5163
container.append(root_content)
5264
except:
@@ -55,13 +67,15 @@ def _get_path_value_recursively(subset_of_metadata_content, path_list, container
5567
for each in root_content:
5668
try:
5769
CustomChecker._get_path_value_recursively(
58-
each, new_path, container, query_params)
70+
each, new_path, container, query_params
71+
)
5972
except KeyError:
6073
container.append(None)
6174
continue
6275
elif isinstance(root_content, dict):
6376
CustomChecker._get_path_value_recursively(
64-
root_content, new_path, container, query_params)
77+
root_content, new_path, container, query_params
78+
)
6579

6680
@staticmethod
6781
def _get_path_value(content_to_validate, path_string):
@@ -80,15 +94,18 @@ def _get_path_value(content_to_validate, path_string):
8094
query_params = None
8195

8296
parsed = urlparse(path_string)
83-
path = parsed.path.split('/')
97+
path = parsed.path.split("/")
8498
if key_value := parsed.query:
85-
query_params = key_value.split('=')
99+
query_params = key_value.split("=")
86100

87101
CustomChecker._get_path_value_recursively(
88-
content_to_validate, path, container, query_params)
102+
content_to_validate, path, container, query_params
103+
)
89104
return container
90105

91-
def run(self, func, content_to_validate, field_dict, external_data, external_relation):
106+
def run(
107+
self, func, content_to_validate, field_dict, external_data, external_relation
108+
):
92109
"""
93110
Runs the custom check based on `func` to the `content_to_validate`'s `field_dict` path
94111
@@ -112,22 +129,25 @@ def run(self, func, content_to_validate, field_dict, external_data, external_rel
112129
fields = field_dict["fields"]
113130
field_values = []
114131
relation = field_dict.get("relation")
115-
result = {
116-
"valid": None
117-
}
132+
result = {"valid": None}
118133
for _field in fields:
119-
value = CustomChecker._get_path_value(
120-
content_to_validate, _field)
134+
value = CustomChecker._get_path_value(content_to_validate, _field)
121135
field_values.append(value)
122136
args = zip(*field_values)
123137

124138
invalid_values = []
125139
validity = None
126140
for arg in args:
127141
function_args = [*arg]
128-
function_args.extend([extra_arg for extra_arg in [relation, *external_data, external_relation] if extra_arg])
142+
function_args.extend(
143+
[
144+
extra_arg
145+
for extra_arg in [relation, *external_data, external_relation]
146+
if extra_arg
147+
]
148+
)
129149
func_return = func(*function_args)
130-
valid = func_return["valid"] # can be True, False or None
150+
valid = func_return["valid"] # can be True, False or None
131151
if valid is not None:
132152
if valid:
133153
validity = validity or (validity is None)

0 commit comments

Comments
 (0)