Skip to content

Commit 3d439a6

Browse files
committed
Write validator plugins to register.json as validatorPlugins
1 parent a10c15c commit 3d439a6

2 files changed

Lines changed: 38 additions & 6 deletions

File tree

ogc/bblocks/postprocess.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ def postprocess(registered_items_path: str | Path = 'registereditems',
8181
)
8282

8383
transform_plugins = load_transform_plugins(sandbox_dir, allowed_modules=allowed_plugin_modules)
84-
plugin_validators = load_validation_plugins(sandbox_dir, allowed_modules=allowed_validator_modules)
84+
plugin_validators, validator_plugins = load_validation_plugins(sandbox_dir, allowed_modules=allowed_validator_modules)
8585

8686
if not isinstance(test_outputs_path, Path):
8787
test_outputs_path = Path(test_outputs_path)
@@ -585,6 +585,9 @@ def do_postprocess(bblock: BuildingBlock, light: bool = False) -> bool:
585585
if transform_plugins:
586586
output_register_json['transformPlugins'] = transform_plugins
587587

588+
if validator_plugins:
589+
output_register_json['validatorPlugins'] = validator_plugins
590+
588591
remote_cache_dir_url = f"{base_url}{os.path.relpath(Path(remote_cache_dir).resolve(), cwd)}"
589592
output_register_json['remoteCacheDir'] = remote_cache_dir_url
590593

ogc/bblocks/validate.py

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,19 +37,24 @@
3737

3838

3939
def load_validation_plugins(sandbox_dir: Path,
40-
allowed_modules: set[str] | None = None) -> list[PluginValidator]:
40+
allowed_modules: set[str] | None = None,
41+
) -> tuple[list[PluginValidator], list[dict]]:
4142
"""Read validator plugin config, create per-plugin venvs, and return PluginValidator instances.
4243
4344
Reads from ``plugins.validators`` in bblocks-config.yaml.
4445
allowed_modules: if provided, only install/register modules in this set. Pass None to allow all.
46+
47+
Returns a tuple of (plugin_validators, register_entries) where register_entries is the enriched
48+
plugin list suitable for inclusion in register.json under 'validatorPlugins'.
4549
"""
46-
from ogc.bblocks.transform import read_plugin_entries
50+
from ogc.bblocks.transform import read_plugin_entries, _pip_to_url
4751

4852
plugin_entries = read_plugin_entries('validators')
4953
if not plugin_entries:
50-
return []
54+
return [], []
5155

5256
result: list[PluginValidator] = []
57+
output_plugins: list[dict] = []
5358

5459
for plugin in plugin_entries:
5560
pip_deps = plugin.get('pip', [])
@@ -60,6 +65,8 @@ def load_validation_plugins(sandbox_dir: Path,
6065
if isinstance(modules, str):
6166
modules = [modules]
6267

68+
output_modules = []
69+
6370
for module_path in modules:
6471
if allowed_modules is not None and module_path not in allowed_modules:
6572
logger.info("Skipping validator plugin '%s': not permitted by user", module_path)
@@ -82,6 +89,7 @@ def load_validation_plugins(sandbox_dir: Path,
8289
logger.warning("No validator classes found in plugin '%s'", module_path)
8390
continue
8491

92+
output_validators = []
8593
for entry in discovered:
8694
mime_types = entry.get('mime_types', [])
8795
file_extensions = entry.get('file_extensions', [])
@@ -98,8 +106,29 @@ def load_validation_plugins(sandbox_dir: Path,
98106
logger.info("Registered validator plugin '%s' (%s) for mime_types=%s extensions=%s",
99107
module_path, entry['class'], mime_types, file_extensions)
100108
result.append(pv)
101-
102-
return result
109+
output_validators.append({
110+
'class': entry['class'],
111+
'mimeTypes': mime_types,
112+
'fileExtensions': file_extensions,
113+
})
114+
115+
if output_validators:
116+
output_modules.append({'module': module_path, 'validators': output_validators})
117+
118+
if output_modules:
119+
output_entry: dict = {'modules': output_modules}
120+
original_pip = plugin.get('pip')
121+
if original_pip:
122+
output_entry['pip'] = original_pip
123+
if explicit_url := plugin.get('url'):
124+
output_entry['urls'] = [explicit_url]
125+
else:
126+
urls = [u for s in pip_deps for u in [_pip_to_url(s)] if u]
127+
if urls:
128+
output_entry['urls'] = urls
129+
output_plugins.append(output_entry)
130+
131+
return result, output_plugins
103132

104133

105134
def report_to_dict(bblock: BuildingBlock,

0 commit comments

Comments
 (0)