2121from ogc .bblocks .sandbox import ensure_venv , venv_needs_recreate
2222
2323from ogc .bblocks import mimetypes
24- from ogc .bblocks .models import BuildingBlock , BuildingBlockRegister , ImportedBBlockProxy , TransformMetadata , TransformResult , BuildingBlockError
24+ from ogc .bblocks .models import BuildingBlock , BuildingBlockRegister , ImportedBBlockProxy , TransformContext , TransformMetadata , TransformResult , BuildingBlockError
2525from ogc .bblocks .transformers import transformers
2626from ogc .bblocks .util import sanitize_filename
2727from ogc .bblocks .validate import validate_transform_output , report_to_dict
2828
2929_SUBPROCESS_TRANSFORM_TYPES = ('python' , 'node' )
3030
3131
32+ def _rel (path : Path | str | None , cwd : Path ) -> str | None :
33+ if path is None :
34+ return None
35+ p = Path (path )
36+ try :
37+ return str (p .relative_to (cwd ))
38+ except ValueError :
39+ return str (p )
40+
41+
3242def _pip_to_url (pip_spec : str ) -> str | None :
3343 """Derive a human-facing URL from a pip install specifier, or None if not applicable."""
3444 if not pip_spec :
@@ -230,7 +240,12 @@ def apply_transforms(bblock: BuildingBlock,
230240 output_subpath = 'transforms' ,
231241 base_url : str | None = None ,
232242 sandbox_dir : Path | None = None ,
233- bblocks_register : BuildingBlockRegister | None = None ):
243+ bblocks_register : BuildingBlockRegister | None = None ,
244+ github_base_url : str | None = None ,
245+ git_repository : str | None = None ,
246+ id_prefix : str = '' ,
247+ imported_register_urls : list [str ] | None = None ,
248+ transform_plugins : list [dict ] | None = None ):
234249
235250 if not bblock .transforms :
236251 return
@@ -330,6 +345,38 @@ def apply_transforms(bblock: BuildingBlock,
330345 if example_prefixes :
331346 metadata ['_prefixes' ] = example_prefixes
332347
348+ ctx = TransformContext (
349+ bblock_id = bblock .identifier ,
350+ bblock_name = bblock .name ,
351+ bblock_version = bblock .version ,
352+ bblock_tags = list (bblock .metadata .get ('tags' ) or []),
353+ bblock_files_path = _rel (bblock .files_path , cwd ),
354+ bblock_annotated_path = _rel (bblock .annotated_path , cwd ),
355+ bblock_metadata = bblock .metadata ,
356+ example_index = example_id ,
357+ example = {k : v for k , v in example .items () if k != 'snippets' },
358+ snippet_index = snippet_id ,
359+ snippet = {k : v for k , v in snippet .items () if k != 'code' },
360+ output_file = _rel (output_fn , cwd ),
361+ output_dir = _rel (output_dir , cwd ),
362+ working_dir = str (cwd ),
363+ source_schema_path = (
364+ _rel (bblock .schema .path , cwd ) if bblock .schema .is_path else bblock .schema .url
365+ ) if bblock .schema else None ,
366+ annotated_schema_path = _rel (bblock .annotated_schema , cwd ) if bblock .annotated_schema .is_file () else None ,
367+ jsonld_context_path = _rel (bblock .jsonld_context , cwd ) if bblock .jsonld_context .is_file () else None ,
368+ shacl_shapes_paths = [
369+ s if isinstance (s , str ) else _rel (s , cwd )
370+ for s in (bblock .shacl_shapes or [])
371+ ],
372+ base_url = base_url ,
373+ github_base_url = github_base_url ,
374+ git_repository = git_repository ,
375+ id_prefix = id_prefix ,
376+ imported_register_urls = list (imported_register_urls or []),
377+ transform_plugins = list (transform_plugins or []),
378+ )
379+
333380 transform_metadata = TransformMetadata (type = transform ['type' ],
334381 id = transform ['id' ],
335382 source_mime_type = snippet_mime_type ,
@@ -338,7 +385,8 @@ def apply_transforms(bblock: BuildingBlock,
338385 metadata = metadata ,
339386 input_data = snippet ['code' ],
340387 sandbox_dir = transform_sandboxes .get (
341- transform ['id' ], sandbox_dir ))
388+ transform ['id' ], sandbox_dir ),
389+ ctx = ctx )
342390
343391 try :
344392 result = transformer .transform (transform_metadata )
0 commit comments