Skip to content

Commit 7fcec8a

Browse files
committed
py: refactoring: remove helper, use TypeSchemaIndex instead.
1 parent ee17677 commit 7fcec8a

4 files changed

Lines changed: 82 additions & 131 deletions

File tree

examples/python/fhir_types/hl7_fhir_r4_core/resource_families.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,14 +98,14 @@ def validate_and_downcast(
9898

9999
packages = ['fhir_types.hl7_fhir_r4_core']
100100

101-
DomainResourceFamily_resources = ['Account', 'ActivityDefinition', 'AdverseEvent', 'AllergyIntolerance', 'Appointment', 'AppointmentResponse', 'AuditEvent', 'Basic', 'BiologicallyDerivedProduct', 'BodyStructure', 'CapabilityStatement', 'CarePlan', 'CareTeam', 'CatalogEntry', 'ChargeItem', 'ChargeItemDefinition', 'Claim', 'ClaimResponse', 'ClinicalImpression', 'CodeSystem', 'Communication', 'CommunicationRequest', 'CompartmentDefinition', 'Composition', 'ConceptMap', 'Condition', 'Consent', 'Contract', 'Coverage', 'CoverageEligibilityRequest', 'CoverageEligibilityResponse', 'DetectedIssue', 'Device', 'DeviceDefinition', 'DeviceMetric', 'DeviceRequest', 'DeviceUseStatement', 'DiagnosticReport', 'DocumentManifest', 'DocumentReference', 'EffectEvidenceSynthesis', 'Encounter', 'Endpoint', 'EnrollmentRequest', 'EnrollmentResponse', 'EpisodeOfCare', 'EventDefinition', 'Evidence', 'EvidenceVariable', 'ExampleScenario', 'ExplanationOfBenefit', 'FamilyMemberHistory', 'Flag', 'Goal', 'GraphDefinition', 'Group', 'GuidanceResponse', 'HealthcareService', 'ImagingStudy', 'Immunization', 'ImmunizationEvaluation', 'ImmunizationRecommendation', 'ImplementationGuide', 'InsurancePlan', 'Invoice', 'Library', 'Linkage', 'List', 'Location', 'Measure', 'MeasureReport', 'Media', 'Medication', 'MedicationAdministration', 'MedicationDispense', 'MedicationKnowledge', 'MedicationRequest', 'MedicationStatement', 'MedicinalProduct', 'MedicinalProductAuthorization', 'MedicinalProductContraindication', 'MedicinalProductIndication', 'MedicinalProductIngredient', 'MedicinalProductInteraction', 'MedicinalProductManufactured', 'MedicinalProductPackaged', 'MedicinalProductPharmaceutical', 'MedicinalProductUndesirableEffect', 'MessageDefinition', 'MessageHeader', 'MolecularSequence', 'NamingSystem', 'NutritionOrder', 'Observation', 'ObservationDefinition', 'OperationDefinition', 'OperationOutcome', 'Organization', 'OrganizationAffiliation', 'Patient', 'PaymentNotice', 'PaymentReconciliation', 'Person', 'PlanDefinition', 'Practitioner', 'PractitionerRole', 'Procedure', 'Provenance', 'Questionnaire', 'QuestionnaireResponse', 'RelatedPerson', 'RequestGroup', 'ResearchDefinition', 'ResearchElementDefinition', 'ResearchStudy', 'ResearchSubject', 'RiskAssessment', 'RiskEvidenceSynthesis', 'Schedule', 'SearchParameter', 'ServiceRequest', 'Slot', 'Specimen', 'SpecimenDefinition', 'StructureDefinition', 'StructureMap', 'Subscription', 'Substance', 'SubstanceNucleicAcid', 'SubstancePolymer', 'SubstanceProtein', 'SubstanceReferenceInformation', 'SubstanceSourceMaterial', 'SubstanceSpecification', 'SupplyDelivery', 'SupplyRequest', 'Task', 'TerminologyCapabilities', 'TestReport', 'TestScript', 'ValueSet', 'VerificationResult', 'VisionPrescription']
101+
DomainResourceFamily_resources = ['Account', 'ActivityDefinition', 'AdverseEvent', 'AllergyIntolerance', 'Appointment', 'AppointmentResponse', 'AuditEvent', 'Basic', 'BiologicallyDerivedProduct', 'BodyStructure', 'CapabilityStatement', 'CarePlan', 'CareTeam', 'CatalogEntry', 'ChargeItem', 'ChargeItemDefinition', 'Claim', 'ClaimResponse', 'ClinicalImpression', 'CodeSystem', 'Communication', 'CommunicationRequest', 'CompartmentDefinition', 'Composition', 'ConceptMap', 'Condition', 'Consent', 'Contract', 'Coverage', 'CoverageEligibilityRequest', 'CoverageEligibilityResponse', 'DetectedIssue', 'Device', 'DeviceDefinition', 'DeviceMetric', 'DeviceRequest', 'DeviceUseStatement', 'DiagnosticReport', 'DocumentManifest', 'DocumentReference', 'EffectEvidenceSynthesis', 'Encounter', 'Endpoint', 'EnrollmentRequest', 'EnrollmentResponse', 'EpisodeOfCare', 'EventDefinition', 'Evidence', 'EvidenceVariable', 'ExampleScenario', 'ExplanationOfBenefit', 'FamilyMemberHistory', 'Flag', 'Goal', 'GraphDefinition', 'Group', 'GuidanceResponse', 'HealthcareService', 'ImagingStudy', 'Immunization', 'ImmunizationEvaluation', 'ImmunizationRecommendation', 'ImplementationGuide', 'InsurancePlan', 'Invoice', 'Library', 'Linkage', 'List', 'Location', 'Measure', 'MeasureReport', 'Media', 'Medication', 'MedicationAdministration', 'MedicationDispense', 'MedicationKnowledge', 'MedicationRequest', 'MedicationStatement', 'MedicinalProduct', 'MedicinalProductAuthorization', 'MedicinalProductContraindication', 'MedicinalProductIndication', 'MedicinalProductIngredient', 'MedicinalProductInteraction', 'MedicinalProductManufactured', 'MedicinalProductPackaged', 'MedicinalProductPharmaceutical', 'MedicinalProductUndesirableEffect', 'MessageDefinition', 'MessageHeader', 'MetadataResource', 'MolecularSequence', 'NamingSystem', 'NutritionOrder', 'Observation', 'ObservationDefinition', 'OperationDefinition', 'OperationOutcome', 'Organization', 'OrganizationAffiliation', 'Patient', 'PaymentNotice', 'PaymentReconciliation', 'Person', 'PlanDefinition', 'Practitioner', 'PractitionerRole', 'Procedure', 'Provenance', 'Questionnaire', 'QuestionnaireResponse', 'RelatedPerson', 'RequestGroup', 'ResearchDefinition', 'ResearchElementDefinition', 'ResearchStudy', 'ResearchSubject', 'RiskAssessment', 'RiskEvidenceSynthesis', 'Schedule', 'SearchParameter', 'ServiceRequest', 'Slot', 'Specimen', 'SpecimenDefinition', 'StructureDefinition', 'StructureMap', 'Subscription', 'Substance', 'SubstanceNucleicAcid', 'SubstancePolymer', 'SubstanceProtein', 'SubstanceReferenceInformation', 'SubstanceSourceMaterial', 'SubstanceSpecification', 'SupplyDelivery', 'SupplyRequest', 'Task', 'TerminologyCapabilities', 'TestReport', 'TestScript', 'ValueSet', 'VerificationResult', 'VisionPrescription']
102102

103103
def validate_and_downcast_DomainResourceFamily(v: Any) -> Any:
104104
return validate_and_downcast(v, packages, DomainResourceFamily_resources)
105105

106106
type DomainResourceFamily = Annotated[Any, BeforeValidator(validate_and_downcast_DomainResourceFamily)]
107107

108-
ResourceFamily_resources = ['Binary', 'Bundle', 'DomainResource', 'Parameters', 'Account', 'ActivityDefinition', 'AdverseEvent', 'AllergyIntolerance', 'Appointment', 'AppointmentResponse', 'AuditEvent', 'Basic', 'BiologicallyDerivedProduct', 'BodyStructure', 'CapabilityStatement', 'CarePlan', 'CareTeam', 'CatalogEntry', 'ChargeItem', 'ChargeItemDefinition', 'Claim', 'ClaimResponse', 'ClinicalImpression', 'CodeSystem', 'Communication', 'CommunicationRequest', 'CompartmentDefinition', 'Composition', 'ConceptMap', 'Condition', 'Consent', 'Contract', 'Coverage', 'CoverageEligibilityRequest', 'CoverageEligibilityResponse', 'DetectedIssue', 'Device', 'DeviceDefinition', 'DeviceMetric', 'DeviceRequest', 'DeviceUseStatement', 'DiagnosticReport', 'DocumentManifest', 'DocumentReference', 'EffectEvidenceSynthesis', 'Encounter', 'Endpoint', 'EnrollmentRequest', 'EnrollmentResponse', 'EpisodeOfCare', 'EventDefinition', 'Evidence', 'EvidenceVariable', 'ExampleScenario', 'ExplanationOfBenefit', 'FamilyMemberHistory', 'Flag', 'Goal', 'GraphDefinition', 'Group', 'GuidanceResponse', 'HealthcareService', 'ImagingStudy', 'Immunization', 'ImmunizationEvaluation', 'ImmunizationRecommendation', 'ImplementationGuide', 'InsurancePlan', 'Invoice', 'Library', 'Linkage', 'List', 'Location', 'Measure', 'MeasureReport', 'Media', 'Medication', 'MedicationAdministration', 'MedicationDispense', 'MedicationKnowledge', 'MedicationRequest', 'MedicationStatement', 'MedicinalProduct', 'MedicinalProductAuthorization', 'MedicinalProductContraindication', 'MedicinalProductIndication', 'MedicinalProductIngredient', 'MedicinalProductInteraction', 'MedicinalProductManufactured', 'MedicinalProductPackaged', 'MedicinalProductPharmaceutical', 'MedicinalProductUndesirableEffect', 'MessageDefinition', 'MessageHeader', 'MolecularSequence', 'NamingSystem', 'NutritionOrder', 'Observation', 'ObservationDefinition', 'OperationDefinition', 'OperationOutcome', 'Organization', 'OrganizationAffiliation', 'Patient', 'PaymentNotice', 'PaymentReconciliation', 'Person', 'PlanDefinition', 'Practitioner', 'PractitionerRole', 'Procedure', 'Provenance', 'Questionnaire', 'QuestionnaireResponse', 'RelatedPerson', 'RequestGroup', 'ResearchDefinition', 'ResearchElementDefinition', 'ResearchStudy', 'ResearchSubject', 'RiskAssessment', 'RiskEvidenceSynthesis', 'Schedule', 'SearchParameter', 'ServiceRequest', 'Slot', 'Specimen', 'SpecimenDefinition', 'StructureDefinition', 'StructureMap', 'Subscription', 'Substance', 'SubstanceNucleicAcid', 'SubstancePolymer', 'SubstanceProtein', 'SubstanceReferenceInformation', 'SubstanceSourceMaterial', 'SubstanceSpecification', 'SupplyDelivery', 'SupplyRequest', 'Task', 'TerminologyCapabilities', 'TestReport', 'TestScript', 'ValueSet', 'VerificationResult', 'VisionPrescription']
108+
ResourceFamily_resources = ['Binary', 'Bundle', 'DomainResource', 'Parameters', 'Account', 'ActivityDefinition', 'AdverseEvent', 'AllergyIntolerance', 'Appointment', 'AppointmentResponse', 'AuditEvent', 'Basic', 'BiologicallyDerivedProduct', 'BodyStructure', 'CapabilityStatement', 'CarePlan', 'CareTeam', 'CatalogEntry', 'ChargeItem', 'ChargeItemDefinition', 'Claim', 'ClaimResponse', 'ClinicalImpression', 'CodeSystem', 'Communication', 'CommunicationRequest', 'CompartmentDefinition', 'Composition', 'ConceptMap', 'Condition', 'Consent', 'Contract', 'Coverage', 'CoverageEligibilityRequest', 'CoverageEligibilityResponse', 'DetectedIssue', 'Device', 'DeviceDefinition', 'DeviceMetric', 'DeviceRequest', 'DeviceUseStatement', 'DiagnosticReport', 'DocumentManifest', 'DocumentReference', 'EffectEvidenceSynthesis', 'Encounter', 'Endpoint', 'EnrollmentRequest', 'EnrollmentResponse', 'EpisodeOfCare', 'EventDefinition', 'Evidence', 'EvidenceVariable', 'ExampleScenario', 'ExplanationOfBenefit', 'FamilyMemberHistory', 'Flag', 'Goal', 'GraphDefinition', 'Group', 'GuidanceResponse', 'HealthcareService', 'ImagingStudy', 'Immunization', 'ImmunizationEvaluation', 'ImmunizationRecommendation', 'ImplementationGuide', 'InsurancePlan', 'Invoice', 'Library', 'Linkage', 'List', 'Location', 'Measure', 'MeasureReport', 'Media', 'Medication', 'MedicationAdministration', 'MedicationDispense', 'MedicationKnowledge', 'MedicationRequest', 'MedicationStatement', 'MedicinalProduct', 'MedicinalProductAuthorization', 'MedicinalProductContraindication', 'MedicinalProductIndication', 'MedicinalProductIngredient', 'MedicinalProductInteraction', 'MedicinalProductManufactured', 'MedicinalProductPackaged', 'MedicinalProductPharmaceutical', 'MedicinalProductUndesirableEffect', 'MessageDefinition', 'MessageHeader', 'MetadataResource', 'MolecularSequence', 'NamingSystem', 'NutritionOrder', 'Observation', 'ObservationDefinition', 'OperationDefinition', 'OperationOutcome', 'Organization', 'OrganizationAffiliation', 'Patient', 'PaymentNotice', 'PaymentReconciliation', 'Person', 'PlanDefinition', 'Practitioner', 'PractitionerRole', 'Procedure', 'Provenance', 'Questionnaire', 'QuestionnaireResponse', 'RelatedPerson', 'RequestGroup', 'ResearchDefinition', 'ResearchElementDefinition', 'ResearchStudy', 'ResearchSubject', 'RiskAssessment', 'RiskEvidenceSynthesis', 'Schedule', 'SearchParameter', 'ServiceRequest', 'Slot', 'Specimen', 'SpecimenDefinition', 'StructureDefinition', 'StructureMap', 'Subscription', 'Substance', 'SubstanceNucleicAcid', 'SubstancePolymer', 'SubstanceProtein', 'SubstanceReferenceInformation', 'SubstanceSourceMaterial', 'SubstanceSpecification', 'SupplyDelivery', 'SupplyRequest', 'Task', 'TerminologyCapabilities', 'TestReport', 'TestScript', 'ValueSet', 'VerificationResult', 'VisionPrescription']
109109

110110
def validate_and_downcast_ResourceFamily(v: Any) -> Any:
111111
return validate_and_downcast(v, packages, ResourceFamily_resources)

src/api/writer-generator/python/python.ts

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import assert from "node:assert";
12
import fs from "node:fs";
23
import * as Path from "node:path";
34
import {
@@ -9,9 +10,8 @@ import {
910
uppercaseFirstLetterOfEach,
1011
} from "@root/api/writer-generator/utils";
1112
import { Writer, type WriterOptions } from "@root/api/writer-generator/writer.ts";
12-
import { groupByPackages, type TypeSchemaIndex } from "@root/typeschema/utils";
13+
import { groupByPackages, sortAsDeclarationSequence, type TypeSchemaIndex } from "@root/typeschema/utils";
1314
import type { Field, Identifier, RegularTypeSchema } from "@typeschema/types.ts";
14-
import { PythonUtils } from "./utils.ts";
1515

1616
const PRIMITIVE_TYPE_MAP: Record<string, string> = {
1717
boolean: "bool",
@@ -146,19 +146,19 @@ type TypeSchemaPackageGroups = {
146146

147147
export class Python extends Writer<PythonGeneratorOptions> {
148148
private readonly staticDir: string | undefined;
149-
private readonly helper: PythonUtils;
150149
private readonly nameFormatFunction: (name: string) => string;
150+
private tsIndex: TypeSchemaIndex | undefined;
151151

152152
constructor(options: PythonGeneratorOptions) {
153153
super({
154154
...options,
155155
});
156-
this.helper = new PythonUtils();
157156
this.staticDir = options.staticDir || undefined;
158157
this.nameFormatFunction = this.getFieldFormatFunction(options.fieldFormat);
159158
}
160159

161160
override async generate(tsIndex: TypeSchemaIndex): Promise<void> {
161+
this.tsIndex = tsIndex;
162162
const groups: TypeSchemaPackageGroups = {
163163
groupedComplexTypes: groupByPackages(tsIndex.collectComplexTypes()),
164164
groupedResources: groupByPackages(tsIndex.collectResources()),
@@ -252,7 +252,7 @@ export class Python extends Writer<PythonGeneratorOptions> {
252252
}
253253

254254
private generateComplexTypes(complexTypes: RegularTypeSchema[]): void {
255-
for (const schema of this.helper.sortSchemasByDeps(complexTypes)) {
255+
for (const schema of sortAsDeclarationSequence(complexTypes)) {
256256
this.generateNestedTypes(schema);
257257
this.line();
258258
this.generateType(schema);
@@ -310,27 +310,23 @@ export class Python extends Writer<PythonGeneratorOptions> {
310310
const allResourceNames: string[] = [];
311311

312312
for (const resource of packageResources) {
313-
const names = this.importOneResource(resource, fullPyPackageName, packageResources);
313+
const names = this.importOneResource(resource, fullPyPackageName);
314314
if (!importEmptyResources && !resource.fields) continue;
315315
allResourceNames.push(...names);
316316
}
317317

318318
return allResourceNames;
319319
}
320320

321-
private importOneResource(
322-
resource: RegularTypeSchema,
323-
fullPyPackageName: string,
324-
packageResources: RegularTypeSchema[],
325-
): string[] {
321+
private importOneResource(resource: RegularTypeSchema, fullPyPackageName: string): string[] {
326322
const moduleName = `${fullPyPackageName}.${snakeCase(resource.identifier.name)}`;
327323
const importNames = this.collectResourceImportNames(resource);
328324

329325
this.pyImportFrom(moduleName, ...importNames);
330326

331327
const names = [...importNames];
332328

333-
if (this.shouldImportResourceFamily(resource, packageResources)) {
329+
if (this.shouldImportResourceFamily(resource)) {
334330
const familyName = `${resource.identifier.name}Family`;
335331
this.pyImportFrom(`${fullPyPackageName}.resource_families`, familyName);
336332
}
@@ -349,11 +345,9 @@ export class Python extends Writer<PythonGeneratorOptions> {
349345
return names;
350346
}
351347

352-
private shouldImportResourceFamily(resource: RegularTypeSchema, packageResources: RegularTypeSchema[]): boolean {
353-
return (
354-
resource.identifier.kind === "resource" &&
355-
this.helper.childrenOf(resource.identifier, packageResources).length > 0
356-
);
348+
private shouldImportResourceFamily(resource: RegularTypeSchema): boolean {
349+
assert(this.tsIndex !== undefined);
350+
return resource.identifier.kind === "resource" && this.tsIndex.resourceChildren(resource.identifier).length > 0;
357351
}
358352

359353
private generateExportsDeclaration(
@@ -599,8 +593,19 @@ export class Python extends Writer<PythonGeneratorOptions> {
599593
}
600594

601595
private generateResourceFamilies(packageResources: RegularTypeSchema[]): void {
602-
const packages = this.helper.getPackages(packageResources, this.opts.rootPackageName);
603-
const families = this.helper.getFamilies(packageResources);
596+
assert(this.tsIndex !== undefined);
597+
const packages = //this.helper.getPackages(packageResources, this.opts.rootPackageName);
598+
Object.keys(groupByPackages(packageResources)).map(
599+
(pkgName) => `${this.opts.rootPackageName}.${pkgName.replaceAll(".", "_")}`,
600+
);
601+
const families: Record<string, string[]> = {};
602+
for (const resource of this.tsIndex.collectResources()) {
603+
const children: string[] = this.tsIndex.resourceChildren(resource.identifier).map((c) => c.name);
604+
if (children.length > 0) {
605+
const familyName = `${resource.identifier.name}Family`;
606+
families[familyName] = children;
607+
}
608+
}
604609
const exportList = Object.keys(families);
605610

606611
if (exportList.length === 0) return;

0 commit comments

Comments
 (0)