@@ -1065,6 +1065,7 @@ def get_v3_code_systems(data_dir: Path) -> List[FhirValueSet]:
1065
1065
result : OrderedDict [str , Any ] = parse (contents )
1066
1066
entries : List [OrderedDict [str , Any ]] = result ["Bundle" ]["entry" ]
1067
1067
1068
+ # Have to do 2 passes since the compose includes may be later in the file
1068
1069
value_set_entry : Dict [str , Any ]
1069
1070
for value_set_entry in entries :
1070
1071
value_set_entry_resource : OrderedDict [str , Any ] = value_set_entry [
@@ -1082,14 +1083,18 @@ def get_v3_code_systems(data_dir: Path) -> List[FhirValueSet]:
1082
1083
id_ : str = value_set ["id" ]["@value" ]
1083
1084
fhir_name : str = value_set ["name" ]["@value" ]
1084
1085
name : str = fhir_name .replace ("v3." , "" )
1086
+ clean_name = FhirXmlSchemaParser .clean_name (name )
1085
1087
description : Union [List [str ], str ] = value_set ["description" ]["@value" ]
1086
1088
if not isinstance (description , list ):
1087
1089
description = [description ]
1088
1090
url = value_set ["url" ]["@value" ]
1089
1091
fhir_concepts : List [FhirValueSetConcept ] = []
1092
+ value_set_url_list : List [str ] = []
1090
1093
# value_set_url = None # value_set["valueSet"]
1091
1094
if "concept" in value_set :
1092
1095
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 )
1093
1098
if isinstance (concepts_list , OrderedDict ):
1094
1099
concepts_list = [concepts_list ]
1095
1100
concept : OrderedDict [str , Any ]
@@ -1100,21 +1105,7 @@ def get_v3_code_systems(data_dir: Path) -> List[FhirValueSet]:
1100
1105
if "display" in concept
1101
1106
else concept ["code" ]["@value" ]
1102
1107
)
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 )
1118
1109
definition : Optional [str ] = (
1119
1110
concept ["definition" ]["@value" ]
1120
1111
if "definition" in concept
@@ -1136,15 +1127,81 @@ def get_v3_code_systems(data_dir: Path) -> List[FhirValueSet]:
1136
1127
name = name ,
1137
1128
fhir_name = fhir_name ,
1138
1129
name_snake_case = FhirXmlSchemaParser .camel_to_snake (name ),
1139
- cleaned_name = FhirXmlSchemaParser . clean_name ( name ) ,
1130
+ cleaned_name = clean_name ,
1140
1131
concepts = fhir_concepts ,
1141
1132
url = url ,
1142
1133
value_set_url = "" ,
1143
- value_set_url_list = [url ],
1134
+ value_set_url_list = value_set_url_list or [url ],
1144
1135
documentation = description ,
1145
1136
source = "v3-codesystems.xml" ,
1146
1137
)
1147
1138
)
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
+
1148
1205
return fhir_value_sets
1149
1206
1150
1207
@staticmethod
@@ -1196,22 +1253,7 @@ def get_v2_code_systems(data_dir: Path) -> List[FhirValueSet]:
1196
1253
if "display" in concept
1197
1254
else concept ["code" ]["@value" ]
1198
1255
)
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 )
1215
1257
definition : Optional [str ] = (
1216
1258
concept ["definition" ]["@value" ]
1217
1259
if "definition" in concept
0 commit comments