Skip to content

Commit e187b9a

Browse files
committed
do a 2nd pass to get all v3 codesets
1 parent 91d7d68 commit e187b9a

File tree

236 files changed

+22176
-544
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

236 files changed

+22176
-544
lines changed

pre-commit.Dockerfile

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
FROM python:3.7-slim
22

3-
COPY ${project_root}/Pipfile* ./
43
RUN apt-get update && \
54
apt-get install -y git && \
6-
pip install pipenv && \
7-
pipenv sync --dev --system
5+
pip install pipenv
6+
COPY ${project_root}/Pipfile* ./
7+
RUN pipenv sync --dev --system
88
WORKDIR /sourcecode
99
CMD pre-commit run --all-files

spark_auto_mapper_fhir/generator/fhir_xml_schema_parser.py

Lines changed: 75 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1065,6 +1065,7 @@ def get_v3_code_systems(data_dir: Path) -> List[FhirValueSet]:
10651065
result: OrderedDict[str, Any] = parse(contents)
10661066
entries: List[OrderedDict[str, Any]] = result["Bundle"]["entry"]
10671067

1068+
# Have to do 2 passes since the compose includes may be later in the file
10681069
value_set_entry: Dict[str, Any]
10691070
for value_set_entry in entries:
10701071
value_set_entry_resource: OrderedDict[str, Any] = value_set_entry[
@@ -1082,14 +1083,18 @@ def get_v3_code_systems(data_dir: Path) -> List[FhirValueSet]:
10821083
id_: str = value_set["id"]["@value"]
10831084
fhir_name: str = value_set["name"]["@value"]
10841085
name: str = fhir_name.replace("v3.", "")
1086+
clean_name = FhirXmlSchemaParser.clean_name(name)
10851087
description: Union[List[str], str] = value_set["description"]["@value"]
10861088
if not isinstance(description, list):
10871089
description = [description]
10881090
url = value_set["url"]["@value"]
10891091
fhir_concepts: List[FhirValueSetConcept] = []
1092+
value_set_url_list: List[str] = []
10901093
# value_set_url = None # value_set["valueSet"]
10911094
if "concept" in value_set:
10921095
concepts_list: List[OrderedDict[str, Any]] = value_set["concept"]
1096+
if url not in value_set_url_list:
1097+
value_set_url_list.append(url)
10931098
if isinstance(concepts_list, OrderedDict):
10941099
concepts_list = [concepts_list]
10951100
concept: OrderedDict[str, Any]
@@ -1100,21 +1105,7 @@ def get_v3_code_systems(data_dir: Path) -> List[FhirValueSet]:
11001105
if "display" in concept
11011106
else concept["code"]["@value"]
11021107
)
1103-
cleaned_display: str = (
1104-
"".join([c.capitalize() for c in display.split(" ")])
1105-
.replace("-", "")
1106-
.replace(".", "")
1107-
.replace("&", "")
1108-
.replace("'", "")
1109-
.replace("(", "")
1110-
.replace(",", "")
1111-
.replace(")", "")
1112-
.replace("/", "")
1113-
.replace("+", "")
1114-
)
1115-
cleaned_display = FhirXmlSchemaParser.fix_python_keywords(
1116-
cleaned_display
1117-
)
1108+
cleaned_display = FhirXmlSchemaParser.clean_name(display)
11181109
definition: Optional[str] = (
11191110
concept["definition"]["@value"]
11201111
if "definition" in concept
@@ -1136,15 +1127,81 @@ def get_v3_code_systems(data_dir: Path) -> List[FhirValueSet]:
11361127
name=name,
11371128
fhir_name=fhir_name,
11381129
name_snake_case=FhirXmlSchemaParser.camel_to_snake(name),
1139-
cleaned_name=FhirXmlSchemaParser.clean_name(name),
1130+
cleaned_name=clean_name,
11401131
concepts=fhir_concepts,
11411132
url=url,
11421133
value_set_url="",
1143-
value_set_url_list=[url],
1134+
value_set_url_list=value_set_url_list or [url],
11441135
documentation=description,
11451136
source="v3-codesystems.xml",
11461137
)
11471138
)
1139+
1140+
# Do second pass just for filling out compose.include entries
1141+
for value_set_entry in entries:
1142+
value_set_entry_resource = value_set_entry["resource"]
1143+
is_code_system = "CodeSystem" in value_set_entry_resource
1144+
is_value_set = "ValueSet" in value_set_entry_resource
1145+
value_set = (
1146+
value_set_entry_resource["ValueSet"]
1147+
if is_value_set
1148+
else value_set_entry_resource["CodeSystem"]
1149+
if is_code_system
1150+
else value_set_entry["resource"]
1151+
)
1152+
id_ = value_set["id"]["@value"]
1153+
fhir_concepts = []
1154+
value_set_url_list = []
1155+
if "compose" in value_set:
1156+
compose_includes: List[OrderedDict[str, Any]] = value_set["compose"][
1157+
"include"
1158+
]
1159+
if isinstance(compose_includes, OrderedDict):
1160+
compose_includes = [compose_includes]
1161+
compose_include: OrderedDict[str, Any]
1162+
for compose_include in compose_includes:
1163+
is_code_system = "system" in compose_include
1164+
# is_value_set = "valueSet" in compose_include
1165+
if is_code_system:
1166+
compose_include_code_system: str = compose_include["system"][
1167+
"@value"
1168+
]
1169+
# find the corresponding item in code systems
1170+
v3_code_systems: List[FhirValueSet] = [
1171+
c
1172+
for c in fhir_value_sets
1173+
if c.url == compose_include_code_system
1174+
]
1175+
if v3_code_systems:
1176+
for code_system in v3_code_systems:
1177+
fhir_concepts.extend(code_system.concepts)
1178+
value_set_url_list.append(code_system.url)
1179+
# v2_code_systems: List[FhirValueSet] = [
1180+
# c
1181+
# for c in fhir_v2_code_systems
1182+
# if c.url == compose_include_code_system
1183+
# ]
1184+
# if v2_code_systems:
1185+
# for code_system in v2_code_systems:
1186+
# fhir_concepts.extend(code_system.concepts)
1187+
# value_set_url_list.append(code_system.url)
1188+
1189+
# find the appropriate value set and add it there
1190+
found_value_sets = [c for c in fhir_value_sets if c.id_ == id_]
1191+
for found_value_set in found_value_sets:
1192+
# add concepts from compose.includes
1193+
missing_concepts = [
1194+
c
1195+
for c in fhir_concepts
1196+
if c.code not in [b.code for b in found_value_set.concepts]
1197+
]
1198+
if missing_concepts:
1199+
found_value_set.concepts.extend(missing_concepts)
1200+
# add any missing value set urls
1201+
for value_set_url in value_set_url_list:
1202+
if value_set_url not in found_value_set.value_set_url_list:
1203+
found_value_set.value_set_url_list.append(value_set_url)
1204+
11481205
return fhir_value_sets
11491206

11501207
@staticmethod
@@ -1196,22 +1253,7 @@ def get_v2_code_systems(data_dir: Path) -> List[FhirValueSet]:
11961253
if "display" in concept
11971254
else concept["code"]["@value"]
11981255
)
1199-
cleaned_display: str = (
1200-
"".join([c.capitalize() for c in display.split(" ")])
1201-
.replace("-", "")
1202-
.replace(".", "")
1203-
.replace("&", "")
1204-
.replace("'", "")
1205-
.replace("(", "")
1206-
.replace(",", "")
1207-
.replace(")", "")
1208-
.replace("/", "")
1209-
.replace("+", "")
1210-
.replace("?", "")
1211-
)
1212-
cleaned_display = FhirXmlSchemaParser.fix_python_keywords(
1213-
cleaned_display
1214-
)
1256+
cleaned_display = FhirXmlSchemaParser.clean_name(display)
12151257
definition: Optional[str] = (
12161258
concept["definition"]["@value"]
12171259
if "definition" in concept

spark_auto_mapper_fhir/generator/template.value_set.jinja2

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,10 @@ class {{fhir_entity.cleaned_name}}Values:
8282
From: {{ value_set_concept.value_set_url }} in {{ value_set_concept.source }}
8383
"""
8484
{% endif %}
85+
{% if value_set_concept.cleaned_display == fhir_entity.cleaned_name %}
86+
{{ value_set_concept.cleaned_display }}_ = {{ fhir_entity.cleaned_name }}("{{ value_set_concept.code }}")
87+
{% else %}
8588
{{ value_set_concept.cleaned_display }} = {{ fhir_entity.cleaned_name }}("{{ value_set_concept.code }}")
89+
{% endif %}
8690
{% endfor %}
8791
{% endif %}

0 commit comments

Comments
 (0)