Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 3 additions & 4 deletions fhircraft/fhir/packages/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -263,8 +263,8 @@ def _process_package_tar(
Args:
tar_file: Opened tar file containing the package
"""
results_count = 0
errors = []
results = []

# First, look for package.json to find dependencies
if install_dependencies:
Expand All @@ -287,12 +287,13 @@ def _process_package_tar(
if f"{dependency}@{version}" in self.history:
continue
try:
self.load_resources_from_package(
dependency_results = self.load_resources_from_package(
target_resource,
dependency,
version,
fail_if_exists=False,
)
results.extend(dependency_results)
except Exception as e:
errors.append(
f"Failed to download and load dependency {dependency}: {e}"
Expand All @@ -301,7 +302,6 @@ def _process_package_tar(
errors.append(
f"Error processing package.json looking for dependencies: {e}"
)
results = []
for member in tar_file.getmembers():
if not member.isfile():
continue
Expand All @@ -324,7 +324,6 @@ def _process_package_tar(
# Check if it's a StructureDefinition resource
if json_data.get("resourceType") == target_resource:
results.append(json_data)
results_count += 1

except Exception as e:
errors.append(f"Error processing {member.name}: {e}")
Expand Down
26 changes: 22 additions & 4 deletions fhircraft/fhir/resources/definitions/registry.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from dataclasses import asdict, dataclass, field
from pathlib import Path
from typing import Any, Dict, List, Optional, Tuple, Union
import warnings

import requests
from pydantic import BaseModel
Expand Down Expand Up @@ -293,13 +294,30 @@ def download_url(url: str) -> Dict[str, Any]:
response.raise_for_status()
return response.json()

def download_package(self, package_name: str, version: str) -> None:
def download_package(
self,
package_name: str,
version: str,
skip_invalid: bool = False,
include_dependencies: bool = True,
) -> None:
"""Download a package from the registry and add its structure definitions to the registry."""
for sd in self._package_client.load_resources_from_package(
"StructureDefinition", package_name, version
"StructureDefinition",
package_name,
version,
install_dependencies=include_dependencies,
):
structure_definition = self._validate_structure_definition(sd)
self.add(structure_definition)
try:
structure_definition = self._validate_structure_definition(sd)
self.add(structure_definition)
except ValueError as e:
if not skip_invalid:
raise e
else:
warnings.warn(
f"Skipping invalid structure definition {sd.get('url', 'unknown')} in package {package_name} version {version}:\n{e}"
)

def set_registry_base_url(self, base_url: str) -> None:
"""Change the package registry base URL."""
Expand Down
14 changes: 12 additions & 2 deletions fhircraft/fhir/resources/factory/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -108,15 +108,25 @@ def build(

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

def register_package(self, package_name: str, version: str) -> None:
def register_package(
self,
package_name: str,
version: str,
skip_invalid: bool = False,
include_dependencies: bool = True,
) -> None:
"""
Download and register all StructureDefinitions from a FHIR npm package.

Args:
package_name: Package identifier (e.g. ``"hl7.fhir.us.mcode"``).
version: Package version string (e.g. ``"1.0.0"``).
skip_invalid: Whether to skip invalid StructureDefinitions.
include_dependencies: Whether to include dependencies when downloading the package.
"""
self.definition_registry.download_package(package_name, version)
self.definition_registry.download_package(
package_name, version, skip_invalid, include_dependencies
)

def register(
self,
Expand Down
Loading
Loading