Skip to content

Commit 68167ba

Browse files
committed
Search for build-local/register.json when using local url mappings
1 parent 07a1a91 commit 68167ba

File tree

3 files changed

+47
-9
lines changed

3 files changed

+47
-9
lines changed

ogc/bblocks/entrypoint.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,8 @@
285285
git_repo_path=git_repo_path,
286286
viewer_path=(args.viewer_path or '.') if deploy_viewer else None,
287287
additional_metadata=register_additional_metadata,
288-
schemas_oas30_downcompile=schema_oas30_downcompile)
288+
schemas_oas30_downcompile=schema_oas30_downcompile,
289+
local_url_mappings=local_url_mappings)
289290
finally:
290291
http_interceptor.disable()
291292

ogc/bblocks/models.py

Lines changed: 41 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from __future__ import annotations
33

44
import dataclasses
5+
from datetime import datetime
56
import json
67
import os
78
import sys
@@ -25,6 +26,8 @@
2526

2627
BBLOCK_METADATA_FILE = 'bblock.json'
2728

29+
EPOCH_STR = '1970-01-01T00:00:00'
30+
2831

2932
def get_bblock_subdirs(identifier: str) -> Path:
3033
return Path(*(identifier.split('.')[1:]))
@@ -346,12 +349,13 @@ def get_files_with_references(self) -> list[PathOrUrl]:
346349
class ImportedBuildingBlocks:
347350

348351
def __init__(self, metadata_urls: list[str] | None, ignore_git_repos: list[str] | None = None,
349-
remote_cache_dir: Path | None = None):
352+
remote_cache_dir: Path | None = None, is_local=False):
350353
self.bblocks: dict[str, dict] = {}
351354
self.imported_registers: dict[str, list[str]] = {}
352355
self.real_metadata_urls: dict[str, str] = {}
353356
self.ignore_git_repos: list[str] | None = ([x for x in ignore_git_repos if x]
354357
if ignore_git_repos else None)
358+
self.is_local = is_local
355359
self.remote_cache_dir = remote_cache_dir
356360
if remote_cache_dir:
357361
remote_cache_dir.mkdir(exist_ok=True, parents=True)
@@ -372,10 +376,31 @@ def load(self, metadata_url: str) -> tuple[list[str], str]:
372376

373377
metadata_url_trailing = metadata_url + ('' if metadata_url.endswith('/') else '/')
374378
collected_exceptions = {}
375-
for url in (metadata_url,
376-
metadata_url_trailing + 'build/register.json',
377-
metadata_url_trailing + 'register.json'):
379+
try_urls = [
380+
metadata_url,
381+
metadata_url_trailing + 'build/register.json',
382+
metadata_url_trailing + 'register.json'
383+
]
384+
for i, url in enumerate(try_urls):
378385
try:
386+
local_imported = None
387+
local_url = None
388+
if i == 1 and self.is_local:
389+
# test build-local/register.json
390+
local_url = metadata_url_trailing + 'build-local/register.json'
391+
tested_locations[local_url] = True
392+
try:
393+
r = requests.get(local_url)
394+
r.raise_for_status()
395+
local_imported = r.json()
396+
if not isinstance(local_imported, dict) or 'bblocks' not in local_imported:
397+
local_imported = None
398+
elif self.remote_cache_dir:
399+
cache_fn = self.remote_cache_dir.joinpath(sha256(url.encode('utf-8')).hexdigest())
400+
with open(cache_fn, 'wb') as f:
401+
f.write(r.content)
402+
except:
403+
pass
379404
tested_locations[url] = True
380405
r = requests.get(url)
381406
if r.ok:
@@ -388,8 +413,18 @@ def load(self, metadata_url: str) -> tuple[list[str], str]:
388413
print(f"[WARN] Error writing cache file {cache_fn} for {url}", file=sys.stderr)
389414
imported = r.json()
390415
if (isinstance(imported, dict) and 'bblocks' in imported) or isinstance(imported, list):
391-
metadata_url = url
416+
if (local_imported
417+
and datetime.fromisoformat(local_imported.get('modified'))
418+
> datetime.fromisoformat(imported.get('modified'))):
419+
imported = local_imported
420+
metadata_url = local_url
421+
else:
422+
metadata_url = url
392423
break
424+
elif local_imported:
425+
imported = local_imported
426+
metadata_url = local_url
427+
break
393428
except Exception as e:
394429
collected_exceptions[url] = e
395430
imported = None
@@ -589,7 +624,7 @@ def _resolve_bblock_deps(self, bblock: BuildingBlock) -> set[str]:
589624
# Check if target path in local bblock schemas
590625
rel_ref = str(os.path.relpath(source_fn.resolve_ref(ref).resolve()))
591626
if not Path(rel_ref).is_file():
592-
raise ValueError(f"Invalid reference to {rel_ref}"
627+
raise ValueError(f"Invalid reference to {ref} (resolved to {rel_ref})"
593628
f" from {bblock.identifier} ({source_fn}) - target file does not exist"
594629
f" - check that the file exists (maybe schema.yaml instead of schema.json?)")
595630
else:

ogc/bblocks/postprocess.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@ def postprocess(registered_items_path: str | Path = 'registereditems',
4343
git_repo_path: Path | None = None,
4444
viewer_path: str | Path | None = None,
4545
additional_metadata: dict | None = None,
46-
schemas_oas30_downcompile=False) -> list[dict]:
46+
schemas_oas30_downcompile=False,
47+
local_url_mappings: dict | None = None) -> list[dict]:
4748

4849
cwd = Path().resolve()
4950

@@ -70,7 +71,8 @@ def postprocess(registered_items_path: str | Path = 'registereditems',
7071
imported_bblocks = ImportedBuildingBlocks(imported_registers,
7172
ignore_git_repos=[get_git_repo_url(git_repo_url)]
7273
if git_repo_url else None,
73-
remote_cache_dir=remote_cache_dir)
74+
remote_cache_dir=remote_cache_dir,
75+
is_local=bool(local_url_mappings))
7476
bbr = BuildingBlockRegister(registered_items_path,
7577
fail_on_error=fail_on_error,
7678
prefix=id_prefix,

0 commit comments

Comments
 (0)