Skip to content

Commit 7c06550

Browse files
committed
Removed the prerelease flag from schema loading
1 parent 0ee2b38 commit 7c06550

14 files changed

Lines changed: 124 additions & 327 deletions

File tree

CHANGELOG.md

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,17 @@
22

33
## Enhancements
44

5-
### Prerelease library schemas can now partner with prerelease standard schemas
5+
### Prerelease schemas are now always included in version lookups
66

7-
Loading a library schema with `withStandard` pointing to a prerelease version of the standard schema (e.g. `withStandard="8.5.0"`) would fail with a `BAD_WITH_STANDARD` error because the `withStandard` partner lookup was always restricted to released schemas, with no way to opt in to prerelease partner resolution.
7+
Previously, loading a schema whose version existed only in the prerelease cache required passing `check_prerelease=True` through every layer of the loading API. This flag has been **removed** from all public functions (`load_schema_version`, `load_schema`, `from_string`, `from_dataframes`), all schema loader classes, and all internal helpers. Prerelease schemas are now found automatically whenever they are present in the cache.
88

99
**Changes:**
1010

11-
- `load_schema()` and `from_string()` in `hed_schema_io.py` now accept a `check_prerelease=False` parameter. When `True`, the `withStandard` partner schema is also searched in the prerelease cache.
12-
- `SchemaLoader` (base class) and all subclasses (`SchemaLoaderXML`, `SchemaLoaderWiki`, `SchemaLoaderJSON`, `SchemaLoaderDF`) accept and forward `check_prerelease`.
13-
- `check_schema_loading.py` (`hed_check_schema_loading` script and `run_loading_check()`) now automatically passes `check_prerelease=True` when loading schemas from a prerelease directory, so `test_all_prerelease_schemas` in `spec_tests` works correctly for library prereleases partnered with a prerelease standard.
11+
- Removed the `check_prerelease` parameter from `load_schema_version()`, `load_schema()`, `from_string()`, and `from_dataframes()` in `hed_schema_io.py`.
12+
- Removed the parameter from `SchemaLoader` (base class) and all subclasses (`SchemaLoaderXML`, `SchemaLoaderWiki`, `SchemaLoaderJSON`, `SchemaLoaderDF`).
13+
- `get_hed_version_path()` in `hed_cache.py` now always searches both regular and prerelease directories (regular first).
14+
- `get_hed_versions()` in `hed_cache.py` now defaults to `check_prerelease=True`; the compliance checker explicitly passes `False` to compare against released versions only.
15+
- `check_schema_loading.py` simplified — removed `_is_prerelease_partner()` helper.
1416
- `run_loading_check()` now raises `ValueError` immediately for mutually exclusive flag combinations (`prerelease_only` + `exclude_prereleases`, or `library_filter` + `standard_only`), consistent with the existing CLI-level validation.
1517

1618
# Release 0.9.0 January 22, 2026

hed/schema/hed_cache.py

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -79,15 +79,16 @@ def get_cache_directory(cache_folder=None) -> str:
7979
return HED_CACHE_DIRECTORY
8080

8181

82-
def get_hed_versions(local_hed_directory=None, library_name=None, check_prerelease=False) -> Union[list, dict]:
82+
def get_hed_versions(local_hed_directory=None, library_name=None, check_prerelease=True) -> Union[list, dict]:
8383
"""Get the HED versions in the HED directory.
8484
8585
Parameters:
8686
local_hed_directory (str): Directory to check for versions which defaults to hed_cache.
8787
library_name (str or None): An optional schema library name.
8888
None retrieves the standard schema only.
8989
Pass "all" to retrieve all standard and library schemas as a dict.
90-
check_prerelease (bool): If True, results can include prerelease schemas
90+
check_prerelease (bool): If True, results can include prerelease schemas.
91+
Pass False to get only released versions (used by compliance checks).
9192
9293
Returns:
9394
Union[list, dict]: List of version numbers or dictionary {library_name: [versions]}.
@@ -135,15 +136,14 @@ def get_hed_versions(local_hed_directory=None, library_name=None, check_prerelea
135136

136137

137138
def get_hed_version_path(
138-
xml_version, library_name=None, local_hed_directory=None, check_prerelease=False
139+
xml_version, library_name=None, local_hed_directory=None
139140
) -> Union[str, None]:
140141
"""Get HED XML file path in a directory. Only returns filenames that exist.
141142
142143
Parameters:
143-
library_name (str or None): Optional the schema library name.
144144
xml_version (str): Returns this version if it exists
145+
library_name (str or None): Optional the schema library name.
145146
local_hed_directory (str): Path to local HED directory. Defaults to HED_CACHE_DIRECTORY
146-
check_prerelease (bool): Also check for prerelease schemas
147147
148148
Returns:
149149
Union[str, None]: The path to the latest HED version the HED directory.
@@ -152,7 +152,7 @@ def get_hed_version_path(
152152
if not local_hed_directory:
153153
local_hed_directory = HED_CACHE_DIRECTORY
154154

155-
hed_versions = get_hed_versions(local_hed_directory, library_name, check_prerelease)
155+
hed_versions = get_hed_versions(local_hed_directory, library_name)
156156
if not hed_versions or not xml_version:
157157
return None
158158
if xml_version in hed_versions:
@@ -161,11 +161,10 @@ def get_hed_version_path(
161161
if os.path.exists(regular_path):
162162
return regular_path
163163

164-
# If check_prerelease is True, also check prerelease directory
165-
if check_prerelease:
166-
prerelease_path = _create_xml_filename(xml_version, library_name, local_hed_directory, True)
167-
if os.path.exists(prerelease_path):
168-
return prerelease_path
164+
# Also check prerelease directory
165+
prerelease_path = _create_xml_filename(xml_version, library_name, local_hed_directory, True)
166+
if os.path.exists(prerelease_path):
167+
return prerelease_path
169168
return None
170169

171170

hed/schema/hed_schema_io.py

Lines changed: 18 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323

2424

2525
def load_schema_version(
26-
xml_version=None, xml_folder=None, check_prerelease=False
26+
xml_version=None, xml_folder=None
2727
) -> Union["HedSchema", "HedSchemaGroup"]:
2828
"""Return a HedSchema or HedSchemaGroup extracted from xml_version
2929
@@ -33,7 +33,6 @@ def load_schema_version(
3333
based on the output of HedSchema.get_formatted_version
3434
Basic format: `[schema_namespace:][library_name_]X.Y.Z`.
3535
xml_folder (str): Path to a folder containing schema.
36-
check_prerelease (bool): If True, check the prerelease directory for schemas.
3736
3837
Returns:
3938
Union[HedSchema, HedSchemaGroup]: The schema or schema group extracted.
@@ -53,7 +52,7 @@ def load_schema_version(
5352
if xml_version and isinstance(xml_version, list):
5453
xml_versions = parse_version_list(xml_version)
5554
schemas = [
56-
_load_schema_version(xml_version=version, xml_folder=xml_folder, check_prerelease=check_prerelease)
55+
_load_schema_version(xml_version=version, xml_folder=xml_folder)
5756
for version in xml_versions.values()
5857
]
5958
if len(schemas) == 1:
@@ -62,10 +61,10 @@ def load_schema_version(
6261
name = ",".join([schema.version for schema in schemas])
6362
return HedSchemaGroup(schemas, name=name)
6463
else:
65-
return _load_schema_version(xml_version=xml_version, xml_folder=xml_folder, check_prerelease=check_prerelease)
64+
return _load_schema_version(xml_version=xml_version, xml_folder=xml_folder)
6665

6766

68-
def load_schema(hed_path, schema_namespace=None, schema=None, name=None, check_prerelease=False) -> "HedSchema":
67+
def load_schema(hed_path, schema_namespace=None, schema=None, name=None) -> "HedSchema":
6968
"""Load a schema from the given file or URL path.
7069
7170
Parameters:
@@ -77,7 +76,6 @@ def load_schema(hed_path, schema_namespace=None, schema=None, name=None, check_p
7776
schema (HedSchema or None): A HED schema to merge this new file into
7877
It must be a with-standard schema with the same value.
7978
name (str or None): User supplied identifier for this schema
80-
check_prerelease (bool): If True, allow the partnered standard schema (withStandard) to be a prerelease version.
8179
8280
Returns:
8381
HedSchema: The loaded schema.
@@ -103,22 +101,21 @@ def load_schema(hed_path, schema_namespace=None, schema=None, name=None, check_p
103101
file_as_string,
104102
schema_format=os.path.splitext(hed_path.lower())[1],
105103
name=name,
106-
check_prerelease=check_prerelease,
107104
)
108105
elif hed_path.lower().endswith(".xml"):
109-
hed_schema = SchemaLoaderXML.load(hed_path, schema=schema, name=name, check_prerelease=check_prerelease)
106+
hed_schema = SchemaLoaderXML.load(hed_path, schema=schema, name=name)
110107
elif hed_path.lower().endswith(".mediawiki"):
111-
hed_schema = SchemaLoaderWiki.load(hed_path, schema=schema, name=name, check_prerelease=check_prerelease)
108+
hed_schema = SchemaLoaderWiki.load(hed_path, schema=schema, name=name)
112109
elif hed_path.lower().endswith(".json"):
113-
hed_schema = SchemaLoaderJSON.load(hed_path, schema=schema, name=name, check_prerelease=check_prerelease)
110+
hed_schema = SchemaLoaderJSON.load(hed_path, schema=schema, name=name)
114111
elif hed_path.lower().endswith(".tsv") or os.path.isdir(hed_path):
115112
if schema is not None:
116113
raise HedFileError(
117114
HedExceptions.INVALID_HED_FORMAT,
118115
"Cannot pass a schema to merge into spreadsheet loading currently.",
119116
filename=name,
120117
)
121-
hed_schema = SchemaLoaderDF.load_spreadsheet(filenames=hed_path, name=name, check_prerelease=check_prerelease)
118+
hed_schema = SchemaLoaderDF.load_spreadsheet(filenames=hed_path, name=name)
122119
else:
123120
raise HedFileError(HedExceptions.INVALID_EXTENSION, "Unknown schema extension", filename=hed_path)
124121

@@ -129,7 +126,7 @@ def load_schema(hed_path, schema_namespace=None, schema=None, name=None, check_p
129126

130127

131128
def from_string(
132-
schema_string, schema_format=".xml", schema_namespace=None, schema=None, name=None, check_prerelease=False
129+
schema_string, schema_format=".xml", schema_namespace=None, schema=None, name=None
133130
) -> "HedSchema":
134131
"""Create a schema from the given string.
135132
@@ -141,7 +138,6 @@ def from_string(
141138
schema (HedSchema or None): A HED schema to merge this new file into
142139
It must be a with-standard schema with the same value.
143140
name (str or None): User supplied identifier for this schema
144-
check_prerelease (bool): If True, allow the partnered standard schema (withStandard) to be a prerelease version.
145141
146142
Returns:
147143
HedSchema: The loaded schema.
@@ -163,15 +159,15 @@ def from_string(
163159

164160
if schema_format.endswith(".xml"):
165161
hed_schema = SchemaLoaderXML.load(
166-
schema_as_string=schema_string, schema=schema, name=name, check_prerelease=check_prerelease
162+
schema_as_string=schema_string, schema=schema, name=name
167163
)
168164
elif schema_format.endswith(".mediawiki"):
169165
hed_schema = SchemaLoaderWiki.load(
170-
schema_as_string=schema_string, schema=schema, name=name, check_prerelease=check_prerelease
166+
schema_as_string=schema_string, schema=schema, name=name
171167
)
172168
elif schema_format.endswith(".json"):
173169
hed_schema = SchemaLoaderJSON.load(
174-
schema_as_string=schema_string, schema=schema, name=name, check_prerelease=check_prerelease
170+
schema_as_string=schema_string, schema=schema, name=name
175171
)
176172
else:
177173
raise HedFileError(HedExceptions.INVALID_EXTENSION, f"Unknown schema extension {schema_format}", filename=name)
@@ -181,15 +177,14 @@ def from_string(
181177
return hed_schema
182178

183179

184-
def from_dataframes(schema_data, schema_namespace=None, name=None, check_prerelease=False) -> "HedSchema":
180+
def from_dataframes(schema_data, schema_namespace=None, name=None) -> "HedSchema":
185181
"""Create a schema from the given string.
186182
187183
Parameters:
188184
schema_data (dict of str or None): A dict of DF_SUFFIXES:file_as_string_or_df
189185
Should have an entry for all values of DF_SUFFIXES.
190186
schema_namespace (str, None): The name_prefix all tags in this schema will accept.
191187
name (str or None): User supplied identifier for this schema
192-
check_prerelease (bool): If True, allow the partnered standard schema (withStandard) to be a prerelease version.
193188
194189
Returns:
195190
HedSchema: The loaded schema.
@@ -208,7 +203,7 @@ def from_dataframes(schema_data, schema_namespace=None, name=None, check_prerele
208203
)
209204

210205
hed_schema = SchemaLoaderDF.load_spreadsheet(
211-
schema_as_strings_or_df=schema_data, name=name, check_prerelease=check_prerelease
206+
schema_as_strings_or_df=schema_data, name=name
212207
)
213208

214209
if schema_namespace:
@@ -274,7 +269,7 @@ def parse_version_list(xml_version_list) -> dict:
274269

275270

276271
@functools.lru_cache(maxsize=MAX_MEMORY_CACHE)
277-
def _load_schema_version(xml_version=None, xml_folder=None, check_prerelease=False):
272+
def _load_schema_version(xml_version=None, xml_folder=None):
278273
"""Return specified version
279274
280275
Parameters:
@@ -284,7 +279,6 @@ def _load_schema_version(xml_version=None, xml_folder=None, check_prerelease=Fal
284279
The schema namespace must be the same and not repeated if loading multiple merged schemas.
285280
286281
xml_folder (str): Path to a folder containing schema.
287-
check_prerelease (bool): If True, check the prerelease directory for schemas.
288282
289283
Returns:
290284
Union[HedSchema, HedSchemaGroup]: The requested HedSchema object.
@@ -309,7 +303,7 @@ def _load_schema_version(xml_version=None, xml_folder=None, check_prerelease=Fal
309303
xml_versions = [""]
310304

311305
first_schema = _load_schema_version_sub(
312-
xml_versions[0], schema_namespace, xml_folder=xml_folder, check_prerelease=check_prerelease, name=name
306+
xml_versions[0], schema_namespace, xml_folder=xml_folder, name=name
313307
)
314308
filenames = [os.path.basename(first_schema.filename)]
315309

@@ -321,7 +315,6 @@ def _load_schema_version(xml_version=None, xml_folder=None, check_prerelease=Fal
321315
version,
322316
schema_namespace,
323317
xml_folder=xml_folder,
324-
check_prerelease=check_prerelease,
325318
schema=first_schema,
326319
name=name,
327320
)
@@ -358,15 +351,14 @@ def _load_schema_version(xml_version=None, xml_folder=None, check_prerelease=Fal
358351

359352

360353
def _load_schema_version_sub(
361-
xml_version, schema_namespace="", xml_folder=None, check_prerelease=False, schema=None, name=""
354+
xml_version, schema_namespace="", xml_folder=None, schema=None, name=""
362355
):
363356
"""Return specified version(single version only for this one)
364357
365358
Parameters:
366359
xml_version (str): HED version format string. Expected format: '[library_name_]X.Y.Z'
367360
schema_namespace (str): The prefix this will have
368361
xml_folder (str): Path to a folder containing schema
369-
check_prerelease (bool): If True, check the prerelease directory for schemas
370362
schema (HedSchema or None): A HED schema to merge this new file into.
371363
name (str): User supplied identifier for this schema
372364
@@ -402,15 +394,14 @@ def _load_schema_version_sub(
402394
version_to_validate,
403395
library_name=library_name,
404396
local_hed_directory=xml_folder,
405-
check_prerelease=check_prerelease,
406397
)
407398

408399
if hed_file_path:
409400
hed_schema = load_schema(hed_file_path, schema_namespace=schema_namespace, schema=schema, name=name)
410401
else:
411402
library_string = f"for library '{library_name}'" if library_name else ""
412403
known_versions = hed_cache.get_hed_versions(
413-
xml_folder, library_name=library_name if library_name else "all", check_prerelease=check_prerelease
404+
xml_folder, library_name=library_name if library_name else "all"
414405
)
415406
raise HedFileError(
416407
HedExceptions.FILE_NOT_FOUND,

hed/schema/schema_io/base2schema.py

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class SchemaLoader(ABC):
2020
SchemaLoaderXML(filename) will load just the header_attributes
2121
"""
2222

23-
def __init__(self, filename, schema_as_string=None, schema=None, file_format=None, name="", check_prerelease=False):
23+
def __init__(self, filename, schema_as_string=None, schema=None, file_format=None, name=""):
2424
"""Loads the given schema from one of the two parameters.
2525
2626
Parameters:
@@ -30,7 +30,6 @@ def __init__(self, filename, schema_as_string=None, schema=None, file_format=Non
3030
It must be a with-standard schema with the same value.
3131
file_format(str or None): The format of this file if needed(only for owl currently)
3232
name(str or None): Optional user supplied identifier, by default uses filename
33-
check_prerelease(bool): If True, allow the partnered standard schema to be a prerelease version.
3433
"""
3534
if schema_as_string and filename:
3635
raise HedFileError(HedExceptions.BAD_PARAMETERS, "Invalid parameters to schema creation.", filename)
@@ -39,7 +38,6 @@ def __init__(self, filename, schema_as_string=None, schema=None, file_format=Non
3938
self.name = name if name else filename
4039
self.schema_as_string = schema_as_string
4140
self.appending_to_schema = False
42-
self.check_prerelease = check_prerelease
4341
try:
4442
self.input_data = self._open_file()
4543
except OSError as e:
@@ -89,7 +87,7 @@ def schema(self):
8987
return self._schema
9088

9189
@classmethod
92-
def load(cls, filename=None, schema_as_string=None, schema=None, file_format=None, name="", check_prerelease=False):
90+
def load(cls, filename=None, schema_as_string=None, schema=None, file_format=None, name=""):
9391
"""Loads and returns the schema, including partnered schema if applicable.
9492
9593
Parameters:
@@ -100,12 +98,11 @@ def load(cls, filename=None, schema_as_string=None, schema=None, file_format=Non
10098
file_format(str or None): If this is an owl file being loaded, this is the format.
10199
Allowed values include: turtle, json-ld, and owl(xml)
102100
name(str or None): Optional user supplied identifier, by default uses filename
103-
check_prerelease(bool): If True, allow the partnered standard schema to be a prerelease version.
104101
105102
Returns:
106103
HedSchema: The new schema
107104
"""
108-
loader = cls(filename, schema_as_string, schema, file_format, name, check_prerelease)
105+
loader = cls(filename, schema_as_string, schema, file_format, name)
109106
return loader._load()
110107

111108
def _load(self):
@@ -122,7 +119,7 @@ def _load(self):
122119
saved_attr = self._schema.header_attributes
123120
saved_format = self._schema.source_format
124121
try:
125-
base_version = load_schema_version(self._schema.with_standard, check_prerelease=self.check_prerelease)
122+
base_version = load_schema_version(self._schema.with_standard)
126123
except HedFileError as e:
127124
raise HedFileError(
128125
HedExceptions.SCHEMA_LIBRARY_INVALID,

0 commit comments

Comments
 (0)