Skip to content

Commit 8d060a6

Browse files
authored
Fix register_package not registering dependency packages & add finer public API control over package processing (#327)
1 parent 8ae248d commit 8d060a6

6 files changed

Lines changed: 424 additions & 12 deletions

File tree

fhircraft/fhir/packages/client.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -263,8 +263,8 @@ def _process_package_tar(
263263
Args:
264264
tar_file: Opened tar file containing the package
265265
"""
266-
results_count = 0
267266
errors = []
267+
results = []
268268

269269
# First, look for package.json to find dependencies
270270
if install_dependencies:
@@ -287,12 +287,13 @@ def _process_package_tar(
287287
if f"{dependency}@{version}" in self.history:
288288
continue
289289
try:
290-
self.load_resources_from_package(
290+
dependency_results = self.load_resources_from_package(
291291
target_resource,
292292
dependency,
293293
version,
294294
fail_if_exists=False,
295295
)
296+
results.extend(dependency_results)
296297
except Exception as e:
297298
errors.append(
298299
f"Failed to download and load dependency {dependency}: {e}"
@@ -301,7 +302,6 @@ def _process_package_tar(
301302
errors.append(
302303
f"Error processing package.json looking for dependencies: {e}"
303304
)
304-
results = []
305305
for member in tar_file.getmembers():
306306
if not member.isfile():
307307
continue
@@ -324,7 +324,6 @@ def _process_package_tar(
324324
# Check if it's a StructureDefinition resource
325325
if json_data.get("resourceType") == target_resource:
326326
results.append(json_data)
327-
results_count += 1
328327

329328
except Exception as e:
330329
errors.append(f"Error processing {member.name}: {e}")

fhircraft/fhir/resources/definitions/registry.py

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from dataclasses import asdict, dataclass, field
1010
from pathlib import Path
1111
from typing import Any, Dict, List, Optional, Tuple, Union
12+
import warnings
1213

1314
import requests
1415
from pydantic import BaseModel
@@ -293,13 +294,30 @@ def download_url(url: str) -> Dict[str, Any]:
293294
response.raise_for_status()
294295
return response.json()
295296

296-
def download_package(self, package_name: str, version: str) -> None:
297+
def download_package(
298+
self,
299+
package_name: str,
300+
version: str,
301+
skip_invalid: bool = False,
302+
include_dependencies: bool = True,
303+
) -> None:
297304
"""Download a package from the registry and add its structure definitions to the registry."""
298305
for sd in self._package_client.load_resources_from_package(
299-
"StructureDefinition", package_name, version
306+
"StructureDefinition",
307+
package_name,
308+
version,
309+
install_dependencies=include_dependencies,
300310
):
301-
structure_definition = self._validate_structure_definition(sd)
302-
self.add(structure_definition)
311+
try:
312+
structure_definition = self._validate_structure_definition(sd)
313+
self.add(structure_definition)
314+
except ValueError as e:
315+
if not skip_invalid:
316+
raise e
317+
else:
318+
warnings.warn(
319+
f"Skipping invalid structure definition {sd.get('url', 'unknown')} in package {package_name} version {version}:\n{e}"
320+
)
303321

304322
def set_registry_base_url(self, base_url: str) -> None:
305323
"""Change the package registry base URL."""

fhircraft/fhir/resources/factory/core.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,15 +108,25 @@ def build(
108108

109109
return self._build(structure_definition, mixins=mixins, mode=mode)
110110

111-
def register_package(self, package_name: str, version: str) -> None:
111+
def register_package(
112+
self,
113+
package_name: str,
114+
version: str,
115+
skip_invalid: bool = False,
116+
include_dependencies: bool = True,
117+
) -> None:
112118
"""
113119
Download and register all StructureDefinitions from a FHIR npm package.
114120
115121
Args:
116122
package_name: Package identifier (e.g. ``"hl7.fhir.us.mcode"``).
117123
version: Package version string (e.g. ``"1.0.0"``).
124+
skip_invalid: Whether to skip invalid StructureDefinitions.
125+
include_dependencies: Whether to include dependencies when downloading the package.
118126
"""
119-
self.definition_registry.download_package(package_name, version)
127+
self.definition_registry.download_package(
128+
package_name, version, skip_invalid, include_dependencies
129+
)
120130

121131
def register(
122132
self,

0 commit comments

Comments
 (0)