cancer_registry_reporting_test_kit 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/LICENSE +201 -0
- data/config/presets/hdea_report_preset.json +14 -0
- data/config/presets/inferno_reference_server_preset.json.erb +84 -0
- data/lib/cancer_registry_reporting_test_kit/bundle_parse.rb +161 -0
- data/lib/cancer_registry_reporting_test_kit/docs/ehr_suite_description.md +134 -0
- data/lib/cancer_registry_reporting_test_kit/docs/hdea_suite_description.md +108 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite/ehr_capability_statement/mcode_capability_statement_profile_support.rb +40 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite/ehr_data_access_group.rb +131 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/medication_administration/medication_administration_must_support_test.rb +43 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/medication_administration/medication_administration_search_test.rb +51 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/medication_administration/medication_administration_validation_test.rb +41 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/medication_administration/metadata.yml +72 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/medication_administration_group.rb +72 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/medication_request/medication_request_must_support_test.rb +55 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/medication_request/medication_request_search_test.rb +55 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/medication_request/medication_request_validation_test.rb +38 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/medication_request/metadata.yml +94 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/medication_request_group.rb +73 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/primary_cancer_condition_group.rb +73 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/primary_condition/metadata.yml +100 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/primary_condition/primary_cancer_condition_must_support_test.rb +50 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/primary_condition/primary_cancer_condition_search_test.rb +70 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/primary_condition/primary_cancer_condition_validation_test.rb +39 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/radiotherapy_procedure/metadata.yml +99 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/radiotherapy_procedure/radiotherapy_procedure_must_support_test.rb +46 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/radiotherapy_procedure/radiotherapy_procedure_search_test.rb +51 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/radiotherapy_procedure/radiotherapy_procedure_validation_test.rb +37 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/radiotherapy_procedure_group.rb +83 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/secondary_cancer_condition_group.rb +68 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/secondary_condition/metadata.yml +102 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/secondary_condition/secondary_cancer_condition_must_support_test.rb +50 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/secondary_condition/secondary_cancer_condition_search_test.rb +70 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/secondary_condition/secondary_cancer_condition_validation_test.rb +39 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/tnm_distant_metastases_category/metadata.yml +65 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/tnm_distant_metastases_category/tnm_distant_metastases_category_must_support_test.rb +44 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/tnm_distant_metastases_category/tnm_distant_metastases_category_search_test.rb +69 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/tnm_distant_metastases_category/tnm_distant_metastases_category_validation_test.rb +39 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/tnm_distant_metastases_category_group.rb +74 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/tnm_primary_tumor_category/metadata.yml +64 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/tnm_primary_tumor_category/tnm_primary_tumor_category_must_support_test.rb +44 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/tnm_primary_tumor_category/tnm_primary_tumor_category_search_test.rb +69 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/tnm_primary_tumor_category/tnm_primary_tumor_category_validation_test.rb +39 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/tnm_primary_tumor_category_group.rb +73 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/tnm_regional_nodes_category/metadata.yml +64 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/tnm_regional_nodes_category/tnm_regional_nodes_category_must_support_test.rb +44 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/tnm_regional_nodes_category/tnm_regional_nodes_category_search_test.rb +69 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/tnm_regional_nodes_category/tnm_regional_nodes_category_validation_test.rb +39 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/tnm_regional_nodes_category_group.rb +73 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/tnm_stage_group/metadata.yml +68 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/tnm_stage_group/tnm_stage_group_must_support_test.rb +45 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/tnm_stage_group/tnm_stage_group_search_test.rb +69 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/tnm_stage_group/tnm_stage_group_validation_test.rb +39 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/tnm_stage_group_group.rb +72 -0
- data/lib/cancer_registry_reporting_test_kit/ehr_suite.rb +69 -0
- data/lib/cancer_registry_reporting_test_kit/fhir_resource_navigation.rb +174 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_generator/group_generator.rb +47 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_generator/group_metadata.rb +86 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_generator/group_metadata_extractor.rb +205 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_generator/ig_loader.rb +78 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_generator/ig_metadata.rb +26 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_generator/ig_metadata_extractor.rb +78 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_generator/ig_resources.rb +56 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_generator/must_support_metadata_extractor.rb +399 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_generator/must_support_test_generator.rb +134 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_generator/naming.rb +168 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_generator/special_cases.rb +43 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_generator/templates/must_support.rb.erb +41 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_generator/templates/validation.rb.erb +35 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_generator/terminology_binding_metadata_extractor.rb +118 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_generator/validation_test_generator.rb +125 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_generator/value_extractor.rb +134 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_generator.rb +66 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/author/author_validation_test.rb +61 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/author/organization_metadata.yml +47 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/author/organization_must_support_test.rb +73 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/author/practitioner_metadata.yml +51 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/author/practitioner_must_support_test.rb +73 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/author/practitioner_role_metadata.yml +48 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/author/practitioner_role_must_support_test.rb +66 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/bundle_resources_group.rb +213 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/ccrr_content_bundle_parse_and_validation_test.rb +67 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/allergy_intolerance/allergy_intolerance_must_support_test.rb +46 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/allergy_intolerance/allergy_intolerance_validation_test.rb +35 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/allergy_intolerance/metadata.yml +36 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/care_plan/care_plan_must_support_test.rb +48 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/care_plan/care_plan_validation_test.rb +35 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/care_plan/metadata.yml +50 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/ccrr_content_bundle/ccrr_content_bundle_must_support_test.rb +43 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/ccrr_content_bundle/metadata.yml +36 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/central_cancer_registry_primary_cancer_condition/central_cancer_registry_primary_cancer_condition_must_support_test.rb +59 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/central_cancer_registry_primary_cancer_condition/central_cancer_registry_primary_cancer_condition_validation_test.rb +35 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/central_cancer_registry_primary_cancer_condition/metadata.yml +86 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/composition/composition_must_support_test.rb +109 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/composition/composition_validation_test.rb +35 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/composition/metadata.yml +272 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/condition/condition_must_support_test.rb +45 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/condition/condition_validation_test.rb +35 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/condition/metadata.yml +33 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/diagnostic_report_lab/diagnostic_report_lab_must_support_test.rb +49 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/diagnostic_report_lab/diagnostic_report_lab_validation_test.rb +35 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/diagnostic_report_lab/metadata.yml +57 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/diagnostic_report_note/diagnostic_report_note_must_support_test.rb +53 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/diagnostic_report_note/diagnostic_report_note_validation_test.rb +35 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/diagnostic_report_note/metadata.yml +75 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/document_reference/document_reference_must_support_test.rb +57 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/document_reference/document_reference_validation_test.rb +35 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/document_reference/metadata.yml +68 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/encounter/encounter_must_support_test.rb +59 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/encounter/encounter_validation_test.rb +35 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/encounter/metadata.yml +73 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/mcode_radiotherapy_course_summary/mcode_radiotherapy_course_summary_must_support_test.rb +52 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/mcode_radiotherapy_course_summary/mcode_radiotherapy_course_summary_validation_test.rb +35 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/mcode_radiotherapy_course_summary/metadata.yml +59 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/mcode_secondary_cancer_condition/mcode_secondary_cancer_condition_must_support_test.rb +56 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/mcode_secondary_cancer_condition/mcode_secondary_cancer_condition_validation_test.rb +35 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/mcode_secondary_cancer_condition/metadata.yml +77 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/mcode_tnm_stage_group/mcode_tnm_stage_group_must_support_test.rb +48 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/mcode_tnm_stage_group/mcode_tnm_stage_group_validation_test.rb +35 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/mcode_tnm_stage_group/metadata.yml +46 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/medication/medication_must_support_test.rb +41 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/medication/medication_validation_test.rb +35 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/medication/metadata.yml +26 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/medication_administration/medication_administration_must_support_test.rb +48 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/medication_administration/medication_administration_validation_test.rb +35 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/medication_administration/metadata.yml +48 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/medication_request/medication_request_must_support_test.rb +57 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/medication_request/medication_request_validation_test.rb +35 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/medication_request/metadata.yml +86 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/medication_statement/medication_statement_must_support_test.rb +41 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/medication_statement/medication_statement_validation_test.rb +35 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/medication_statement/metadata.yml +26 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/observation/metadata.yml +26 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/observation/observation_must_support_test.rb +41 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/observation/observation_validation_test.rb +35 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/observation_lab/metadata.yml +53 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/observation_lab/observation_lab_must_support_test.rb +50 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/observation_lab/observation_lab_validation_test.rb +35 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/odh_usual_work/metadata.yml +81 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/odh_usual_work/odh_usual_work_must_support_test.rb +49 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/odh_usual_work/odh_usual_work_validation_test.rb +35 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/organization/metadata.yml +46 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/organization/organization_must_support_test.rb +55 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/organization/organization_validation_test.rb +35 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/patient/metadata.yml +51 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/patient/patient_must_support_test.rb +58 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/patient/patient_validation_test.rb +35 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/practitioner/metadata.yml +50 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/practitioner/practitioner_must_support_test.rb +55 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/practitioner/practitioner_validation_test.rb +35 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/practitioner_role/metadata.yml +47 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/practitioner_role/practitioner_role_must_support_test.rb +49 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/practitioner_role/practitioner_role_validation_test.rb +35 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/procedure/metadata.yml +37 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/procedure/procedure_must_support_test.rb +44 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/procedure/procedure_validation_test.rb +35 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/service_request/metadata.yml +26 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/service_request/service_request_must_support_test.rb +41 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/service_request/service_request_validation_test.rb +35 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/smokingstatus/metadata.yml +58 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/smokingstatus/smokingstatus_must_support_test.rb +47 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/smokingstatus/smokingstatus_validation_test.rb +35 -0
- data/lib/cancer_registry_reporting_test_kit/hdea_suite.rb +80 -0
- data/lib/cancer_registry_reporting_test_kit/igs/README.md +21 -0
- data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-mcode-cancer-related-medication-administration.json +1905 -0
- data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-mcode-cancer-related-medication-request.json +3611 -0
- data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-mcode-primary-cancer-condition.json +2246 -0
- data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-mcode-radiotherapy-course-summary.json +2700 -0
- data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-mcode-secondary-cancer-condition.json +2419 -0
- data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-mcode-tnm-distant-metastases-category.json +2320 -0
- data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-mcode-tnm-primary-tumor-category.json +2320 -0
- data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-mcode-tnm-regional-nodes-category.json +2320 -0
- data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-mcode-tnm-stage-group.json +2414 -0
- data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-medicationstatement.profile.json +1578 -0
- data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-observation.profile.json +3510 -0
- data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-odh-UsualWork.json +7248 -0
- data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-servicerequest.profile.json +3048 -0
- data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-us-core-allergyintolerance.json +1842 -0
- data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-us-core-careplan.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-us-core-condition.json +2154 -0
- data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-us-core-diagnosticreport-lab.json +2002 -0
- data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-us-core-diagnosticreport-note.json +2049 -0
- data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-us-core-documentreference.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-us-core-encounter.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-us-core-medication.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-us-core-observation-lab.json +3153 -0
- data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-us-core-organization.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-us-core-patient.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-us-core-practitioner.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-us-core-practitionerrole.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-us-core-procedure.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-us-core-smokingstatus.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100.tgz +0 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/.index.db +0 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/.index.json +4 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/CapabilityStatement-central-cancer-registry-reporting-ehr.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/ImplementationGuide-hl7.fhir.us.central-cancer-registry-reporting.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/StructureDefinition-cancer-encounter.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/StructureDefinition-cancer-patient.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/StructureDefinition-ccrr-composition.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/StructureDefinition-ccrr-content-bundle.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/StructureDefinition-ccrr-plandefinition.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/StructureDefinition-ccrr-reporting-bundle.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/StructureDefinition-central-cancer-registry-primary-cancer-condition.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/StructureDefinition-central-cancer-registry-reporting-messageheader.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/StructureDefinition-us-ph-patient.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/StructureDefinition-us-ph-tribal-affiliation-extension.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/ValueSet-cancer-core-reportability-codes.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/example/AllergyIntolerance-example.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/example/BodyStructure-jenny-m-chest-wall-lymph-nodes-treatment-volume.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/example/BodyStructure-jenny-m-chest-wall-treatment-volume.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/example/Bundle-ccrr-content-bundle-example.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/example/Bundle-central-cancer-registry-reporting-specification-bundle-example.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/example/Bundle-reporting-bundle-example.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/example/Composition-ccrr-composition-example.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/example/Condition-primary-cancer-condition-breast.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/example/Encounter-encounter-cancer-example.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/example/Endpoint-example-healthcare-endpoint.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/example/Endpoint-example-ph-endpoint.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/example/MedicationAdministration-cancer-related-medication-administration-example.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/example/MessageHeader-messageheader-example-reportheader.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/example/Observation-cancer-stage-group-example.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/example/Observation-tnm-clinical-distant-metastases-category-cM0.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/example/Observation-tnm-clinical-primary-tumor-category-cT3.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/example/Observation-tnm-clinical-regional-nodes-category-cN3.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/example/Organization-example-healthcare-org.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/example/Organization-example-pha-org.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/example/Patient-example.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/example/PlanDefinition-plandefinition-central-cancer-registry-reporting-example.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/example/Practitioner-1.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/example/Procedure-radiotherapy-example.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/openapi/central-cancer-registry-reporting-ehr.openapi.json +364 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/other/ig-r4.jsonX +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/other/spec.internals +293 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/other/validation-oo.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/other/validation-summary.json +1 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/package.json +30 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/xml/StructureDefinition-cancer-encounter.sch +19 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/xml/StructureDefinition-cancer-patient.sch +175 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/xml/StructureDefinition-ccrr-composition.sch +61 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/xml/StructureDefinition-ccrr-content-bundle.sch +12 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/xml/StructureDefinition-ccrr-plandefinition.sch +331 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/xml/StructureDefinition-ccrr-reporting-bundle.sch +12 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/xml/StructureDefinition-central-cancer-registry-primary-cancer-condition.sch +31 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/xml/StructureDefinition-central-cancer-registry-reporting-messageheader.sch +27 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/xml/StructureDefinition-us-ph-patient.sch +217 -0
- data/lib/cancer_registry_reporting_test_kit/igs/package/xml/StructureDefinition-us-ph-tribal-affiliation-extension.sch +36 -0
- data/lib/cancer_registry_reporting_test_kit/metadata.rb +71 -0
- data/lib/cancer_registry_reporting_test_kit/must_support_test.rb +263 -0
- data/lib/cancer_registry_reporting_test_kit/primitive_type.rb +7 -0
- data/lib/cancer_registry_reporting_test_kit/requirements/cancer-registry-reporting-test-kit_out_of_scope_requirements.csv +77 -0
- data/lib/cancer_registry_reporting_test_kit/requirements/cancer-registry-reporting-test-kit_requirements.csv +162 -0
- data/lib/cancer_registry_reporting_test_kit/requirements/generated/cancer-registry-reporting-test-kit_requirements_coverage.csv +161 -0
- data/lib/cancer_registry_reporting_test_kit/search_test.rb +897 -0
- data/lib/cancer_registry_reporting_test_kit/search_test_properties.rb +58 -0
- data/lib/cancer_registry_reporting_test_kit/validation_test.rb +68 -0
- data/lib/cancer_registry_reporting_test_kit/version.rb +6 -0
- data/lib/cancer_registry_reporting_test_kit.rb +6 -0
- data/lib/inferno_requirements_tools/ext/inferno_core/runnable.rb +22 -0
- data/lib/inferno_requirements_tools/tasks/requirements_coverage.rb +284 -0
- data/lib/requirements_config.yaml +22 -0
- metadata +341 -0
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../../../validation_test'
|
4
|
+
|
5
|
+
module CancerRegistryReportingTestKit
|
6
|
+
class TNMStageGroupValidationTest < Inferno::Test
|
7
|
+
include CancerRegistryReportingTestKit::ValidationTest
|
8
|
+
|
9
|
+
id :ccrr_tnm_stage_group_validation_test
|
10
|
+
title 'Observation resources returned during previous tests conform to the mCODE TNM Stage Group profile'
|
11
|
+
description %(
|
12
|
+
This test verifies resources returned from the first search conform to
|
13
|
+
the [mCODE TNM Stage Group Profile](https://hl7.org/fhir/us/mcode/STU3/StructureDefinition-mcode-tnm-stage-group.html).
|
14
|
+
Systems must demonstrate at least one valid example in order to pass this test.
|
15
|
+
|
16
|
+
It verifies the presence of mandatory elements and that elements with
|
17
|
+
required bindings contain appropriate values. CodeableConcept element
|
18
|
+
bindings will fail if none of their codings have a code/system belonging
|
19
|
+
to the bound ValueSet. Quantity, Coding, and code element bindings will
|
20
|
+
fail if their code/system are not found in the valueset.
|
21
|
+
|
22
|
+
)
|
23
|
+
|
24
|
+
def resource_type
|
25
|
+
'Observation'
|
26
|
+
end
|
27
|
+
|
28
|
+
def scratch_resources
|
29
|
+
scratch[:tnm_stage_group_resources] ||= {}
|
30
|
+
end
|
31
|
+
|
32
|
+
run do
|
33
|
+
perform_validation_test(scratch_resources[:all] || [],
|
34
|
+
'http://hl7.org/fhir/us/mcode/StructureDefinition/mcode-tnm-stage-group',
|
35
|
+
'3.0.0',
|
36
|
+
skip_if_empty: true)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'tnm_stage_group/tnm_stage_group_search_test'
|
4
|
+
require_relative 'tnm_stage_group/tnm_stage_group_must_support_test'
|
5
|
+
require_relative 'tnm_stage_group/tnm_stage_group_validation_test'
|
6
|
+
|
7
|
+
module CancerRegistryReportingTestKit
|
8
|
+
class EHRTNMStageGroupTests < Inferno::TestGroup
|
9
|
+
title 'mCODE TNM Stage Group'
|
10
|
+
description %(
|
11
|
+
# Background
|
12
|
+
The mCODE TNM Stage Group Profile group verifies that the system under test is
|
13
|
+
able to provide correct responses for TNM Stage Group Observation queries. These queries
|
14
|
+
return resources conforming to the [mCODE TNM Stage Group Profile](https://hl7.org/fhir/us/mcode/STU3/StructureDefinition-mcode-tnm-stage-group.html)
|
15
|
+
as specified in the mCODE v3.0.0 Implementation Guide.
|
16
|
+
|
17
|
+
# Testing Methodology
|
18
|
+
## Searching
|
19
|
+
This test sequence will first perform each required search associated
|
20
|
+
with this resource. This sequence will perform searches with the
|
21
|
+
following parameters:
|
22
|
+
|
23
|
+
* patient + code
|
24
|
+
|
25
|
+
### Search Parameters
|
26
|
+
The first search uses values from the **Patient IDs** and
|
27
|
+
**TNM Stage Group code** inputs as provided by the tester.
|
28
|
+
Any subsequent searches will look for its parameter values
|
29
|
+
from the results of the first search. For example, the `identifier`
|
30
|
+
search in the patient sequence is performed by looking for an existing
|
31
|
+
`Patient.identifier` from any of the resources returned in the first
|
32
|
+
search. If a value cannot be found this way, the search is skipped.
|
33
|
+
|
34
|
+
### Search Validation
|
35
|
+
Inferno will retrieve up to the first 20 bundle pages of the reply for
|
36
|
+
Observation resources and save them for subsequent tests. Each of
|
37
|
+
these resources is then checked to see if it matches the searched
|
38
|
+
parameters in accordance with [FHIR search
|
39
|
+
guidelines](https://www.hl7.org/fhir/search.html). The test will fail,
|
40
|
+
for example, if a Patient search for `gender=male` returns a `female`
|
41
|
+
patient.
|
42
|
+
|
43
|
+
|
44
|
+
## Must Support
|
45
|
+
Each profile contains elements marked as "must support". This test
|
46
|
+
sequence expects to see each of these elements at least once. If at
|
47
|
+
least one cannot be found, the test will fail. The test will look
|
48
|
+
through the Observation resources found in the first test for these
|
49
|
+
elements.
|
50
|
+
|
51
|
+
## Profile Validation
|
52
|
+
Each resource returned from the first search is expected to conform to
|
53
|
+
the [mCODE TNM Stage Group Profile](https://hl7.org/fhir/us/mcode/STU3/StructureDefinition-mcode-tnm-stage-group.html).
|
54
|
+
Each element is checked against terminology binding and cardinality requirements.
|
55
|
+
|
56
|
+
Elements with a required binding are validated against their bound
|
57
|
+
ValueSet. If the code/system in the element is not part of the ValueSet,
|
58
|
+
then the test will fail.
|
59
|
+
)
|
60
|
+
id :ccrr_ehr_tnm_stage_group
|
61
|
+
run_as_group
|
62
|
+
|
63
|
+
def self.metadata
|
64
|
+
@metadata ||= HdeaGenerator::GroupMetadata.new(YAML.load_file(
|
65
|
+
File.join(__dir__, 'tnm_stage_group', 'metadata.yml'), aliases: true
|
66
|
+
))
|
67
|
+
end
|
68
|
+
test from: :ccrr_tnm_stage_group_search_test
|
69
|
+
test from: :ccrr_tnm_stage_group_validation_test
|
70
|
+
test from: :ccrr_tnm_stage_group_must_support_test
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'ehr_suite/ehr_data_access_group'
|
4
|
+
module CancerRegistryReportingTestKit
|
5
|
+
class EHRSuite < Inferno::TestSuite
|
6
|
+
id :ccrr_ehr
|
7
|
+
title 'Cancer Registry Reporting Electronic Health Record (EHR) Test Suite'
|
8
|
+
short_title 'EHR Cancer Registry Reporting'
|
9
|
+
description File.read(File.join(__dir__, 'docs', 'ehr_suite_description.md'))
|
10
|
+
links [
|
11
|
+
{
|
12
|
+
label: 'Report Issue',
|
13
|
+
url: 'https://github.com/inferno-framework/cancer-registry-reporting-test-kit/issues/'
|
14
|
+
},
|
15
|
+
{
|
16
|
+
label: 'Open Source',
|
17
|
+
url: 'https://github.com/inferno-framework/cancer-registry-reporting-test-kit/'
|
18
|
+
},
|
19
|
+
{
|
20
|
+
label: 'Download',
|
21
|
+
url: 'https://github.com/inferno-framework/cancer-registry-reporting-test-kit/releases'
|
22
|
+
},
|
23
|
+
{
|
24
|
+
label: 'Implementation Guide',
|
25
|
+
url: 'https://hl7.org/fhir/us/central-cancer-registry-reporting/STU1/'
|
26
|
+
}
|
27
|
+
]
|
28
|
+
|
29
|
+
GENERAL_MESSAGE_FILTERS = [
|
30
|
+
%r{Sub-extension url 'introspect' is not defined by the Extension http://fhir-registry\.smarthealthit\.org/StructureDefinition/oauth-uris},
|
31
|
+
%r{Sub-extension url 'revoke' is not defined by the Extension http://fhir-registry\.smarthealthit\.org/StructureDefinition/oauth-uris},
|
32
|
+
/Observation\.effective\.ofType\(Period\): .*vs-1:/, # Invalid invariant in FHIR v4.0.1
|
33
|
+
/Observation\.effective\.ofType\(Period\): .*us-core-1:/, # Invalid invariant in US Core v3.1.1
|
34
|
+
/Provenance.agent\[\d*\]: Constraint failed: provenance-1/, # Invalid invariant in US Core v5.0.1
|
35
|
+
%r{Unknown Code System 'http://hl7.org/fhir/us/core/CodeSystem/us-core-tags'}, # Validator has an issue
|
36
|
+
# with this US Core 5 code system in US Core 6 resource
|
37
|
+
%r{URL value 'http://hl7.org/fhir/us/core/CodeSystem/us-core-tags' does not resolve}, # Validator has an issue with
|
38
|
+
# this US Core 5 code system in US Core 6 resource
|
39
|
+
/\A\S+: \S+: URL value '.*' does not resolve/,
|
40
|
+
%r{Observation.component\[\d+\].value.ofType\(Quantity\): The code provided \(http://unitsofmeasure.org#L/min\) was not found in the value set
|
41
|
+
'Vital Signs Units'} # Known issue with the Pulse Oximetry Profile
|
42
|
+
].freeze
|
43
|
+
|
44
|
+
VERSION_SPECIFIC_MESSAGE_FILTERS = [].freeze
|
45
|
+
|
46
|
+
VALIDATION_MESSAGE_FILTERS = GENERAL_MESSAGE_FILTERS + VERSION_SPECIFIC_MESSAGE_FILTERS
|
47
|
+
|
48
|
+
def self.metadata
|
49
|
+
@metadata ||= YAML.load_file(File.join(__dir__, 'metadata.yml'), aliases: true)[:groups].map do |raw_metadata|
|
50
|
+
HdeaGenerator::GroupMetadata.new(raw_metadata)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
fhir_resource_validator do
|
55
|
+
igs 'hl7.fhir.us.central-cancer-registry-reporting#1.0.0'
|
56
|
+
message_filters = VALIDATION_MESSAGE_FILTERS
|
57
|
+
|
58
|
+
exclude_message do |message|
|
59
|
+
message_filters.any? { |filter| filter.match? message.message }
|
60
|
+
end
|
61
|
+
|
62
|
+
perform_additional_validation do |resource, _profile_url|
|
63
|
+
USCoreTestKit::ProvenanceValidator.validate(resource) if resource.instance_of?(FHIR::Provenance)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
group from: :ccrr_ehr_data_access
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,174 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'primitive_type'
|
4
|
+
|
5
|
+
module CancerRegistryReportingTestKit
|
6
|
+
module FHIRResourceNavigation
|
7
|
+
DAR_EXTENSION_URL = 'http://hl7.org/fhir/StructureDefinition/data-absent-reason'
|
8
|
+
PRIMITIVE_DATA_TYPES = FHIR::PRIMITIVES.keys
|
9
|
+
|
10
|
+
def resolve_path(elements, path)
|
11
|
+
elements = Array.wrap(elements)
|
12
|
+
return elements if path.blank?
|
13
|
+
|
14
|
+
paths = path.split(/(?<!hl7)\./)
|
15
|
+
segment = paths.first
|
16
|
+
remaining_path = paths.drop(1).join('.')
|
17
|
+
|
18
|
+
elements.flat_map do |element|
|
19
|
+
child = get_next_value(element, segment)
|
20
|
+
resolve_path(child, remaining_path)
|
21
|
+
end.compact
|
22
|
+
end
|
23
|
+
|
24
|
+
def find_a_value_at(element, path, include_dar: false, &block)
|
25
|
+
return nil if element.nil?
|
26
|
+
|
27
|
+
elements = Array.wrap(element)
|
28
|
+
if path.empty?
|
29
|
+
unless include_dar
|
30
|
+
elements = elements.reject do |el|
|
31
|
+
el.respond_to?(:extension) && el.extension.any? { |ext| ext.url == DAR_EXTENSION_URL }
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
return elements.find(&block) if block_given?
|
36
|
+
|
37
|
+
return elements.first
|
38
|
+
end
|
39
|
+
|
40
|
+
path_segments = path.split(/(?<!hl7)\./)
|
41
|
+
|
42
|
+
## special case: .gsub(':odh-UsualIndustry', '')
|
43
|
+
# accounts for path traversal for Usual Work ODH profile
|
44
|
+
segment = path_segments.shift.delete_suffix('[x]').gsub(/^class$/, 'local_class').gsub(/^method$/, 'local_method').gsub(
|
45
|
+
'[x]:', ':').gsub(':odh-UsualIndustry', '').to_sym
|
46
|
+
no_elements_present =
|
47
|
+
elements.none? do |element|
|
48
|
+
child = get_next_value(element, segment)
|
49
|
+
child.present? || child == false
|
50
|
+
end
|
51
|
+
return nil if no_elements_present
|
52
|
+
|
53
|
+
remaining_path = path_segments.join('.')
|
54
|
+
elements.each do |element|
|
55
|
+
child = get_next_value(element, segment)
|
56
|
+
element_found =
|
57
|
+
if block_given?
|
58
|
+
find_a_value_at(child, remaining_path, include_dar: include_dar, &block)
|
59
|
+
else
|
60
|
+
find_a_value_at(child, remaining_path, include_dar: include_dar)
|
61
|
+
end
|
62
|
+
return element_found if element_found.present? || element_found == false
|
63
|
+
end
|
64
|
+
|
65
|
+
nil
|
66
|
+
end
|
67
|
+
|
68
|
+
def get_next_value(element, property)
|
69
|
+
extension_url = property[/(?<=where\(url=').*(?='\))/]
|
70
|
+
if extension_url.present?
|
71
|
+
element.url == extension_url ? element : nil
|
72
|
+
elsif property.to_s.include?(':') && !property.to_s.include?('url')
|
73
|
+
find_slice_via_discriminator(element, property)
|
74
|
+
|
75
|
+
else
|
76
|
+
value = element.send(property)
|
77
|
+
primitive_value = get_primitive_type_value(element, property, value)
|
78
|
+
primitive_value.present? ? primitive_value : value
|
79
|
+
end
|
80
|
+
rescue NoMethodError
|
81
|
+
nil
|
82
|
+
end
|
83
|
+
|
84
|
+
def get_primitive_type_value(element, property, value)
|
85
|
+
source_value = element.source_hash["_#{property}"]
|
86
|
+
|
87
|
+
return nil unless source_value.present?
|
88
|
+
|
89
|
+
primitive_value = CancerRegistryReportingTestKit::PrimitiveType.new(source_value)
|
90
|
+
primitive_value.value = value
|
91
|
+
primitive_value
|
92
|
+
end
|
93
|
+
|
94
|
+
def find_slice_via_discriminator(element, property)
|
95
|
+
element_name = property.to_s.split(':')[0].gsub(/^class$/, 'local_class').gsub(/^method$/, 'local_method')
|
96
|
+
slice_name = property.to_s.split(':')[1].gsub(/^class$/, 'local_class').gsub(/^method$/, 'local_method')
|
97
|
+
if metadata.present?
|
98
|
+
slice_by_name = metadata.must_supports[:slices].find { |slice| slice[:slice_name] == slice_name }
|
99
|
+
discriminator = slice_by_name[:discriminator]
|
100
|
+
slices = Array.wrap(element.send(element_name))
|
101
|
+
slices.find do |slice|
|
102
|
+
case discriminator[:type]
|
103
|
+
when 'patternCodeableConcept'
|
104
|
+
slice_value = discriminator[:path].present? ? slice.send(discriminator[:path].to_s)&.coding : slice.coding
|
105
|
+
slice_value&.any? do |coding|
|
106
|
+
coding.code == discriminator[:code] && coding.system == discriminator[:system]
|
107
|
+
end
|
108
|
+
when 'patternCoding'
|
109
|
+
slice_value = discriminator[:path].present? ? slice.send(discriminator[:path]) : slice
|
110
|
+
slice_value&.code == discriminator[:code] && slice_value&.system == discriminator[:system]
|
111
|
+
when 'patternIdentifier'
|
112
|
+
slice.identifier.system == discriminator[:system]
|
113
|
+
when 'value'
|
114
|
+
values = discriminator[:values].map { |value| value.merge(path: value[:path].split('.')) }
|
115
|
+
verify_slice_by_values(slice, values)
|
116
|
+
when 'type'
|
117
|
+
case discriminator[:code]
|
118
|
+
when 'Date'
|
119
|
+
begin
|
120
|
+
Date.parse(slice)
|
121
|
+
rescue ArgumentError
|
122
|
+
false
|
123
|
+
end
|
124
|
+
when 'DateTime'
|
125
|
+
begin
|
126
|
+
DateTime.parse(slice)
|
127
|
+
rescue ArgumentError
|
128
|
+
false
|
129
|
+
end
|
130
|
+
when 'String'
|
131
|
+
slice.is_a? String
|
132
|
+
else
|
133
|
+
if slice.is_a? FHIR::Bundle::Entry
|
134
|
+
slice.resource.is_a? FHIR.const_get(discriminator[:code])
|
135
|
+
else
|
136
|
+
slice.is_a? FHIR.const_get(discriminator[:code])
|
137
|
+
end
|
138
|
+
end
|
139
|
+
when 'requiredBinding'
|
140
|
+
discriminator[:path].present? ? slice.send(discriminator[:path].to_s).coding : slice.coding
|
141
|
+
slice_value { |coding| discriminator[:values].include?(coding.code) }
|
142
|
+
end
|
143
|
+
end
|
144
|
+
else
|
145
|
+
# TODO: Error handling for if this file doesn't have access to metadata for some reason (begin/rescue with StandardError?)
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
def verify_slice_by_values(element, value_definitions)
|
150
|
+
path_prefixes = value_definitions.map { |value_definition| value_definition[:path].first }.uniq
|
151
|
+
path_prefixes.all? do |path_prefix|
|
152
|
+
value_definitions_for_path =
|
153
|
+
value_definitions
|
154
|
+
.select { |value_definition| value_definition[:path].first == path_prefix }
|
155
|
+
.each { |value_definition| value_definition[:path].shift }
|
156
|
+
find_a_value_at(element, path_prefix) do |el_found|
|
157
|
+
child_element_value_definitions, current_element_value_definitions =
|
158
|
+
value_definitions_for_path.partition { |value_definition| value_definition[:path].present? }
|
159
|
+
current_element_values_match =
|
160
|
+
current_element_value_definitions
|
161
|
+
.all? { |value_definition| value_definition[:value].to_s == el_found.to_s }
|
162
|
+
|
163
|
+
child_element_values_match =
|
164
|
+
if child_element_value_definitions.present?
|
165
|
+
verify_slice_by_values(el_found, child_element_value_definitions)
|
166
|
+
else
|
167
|
+
true
|
168
|
+
end
|
169
|
+
current_element_values_match && child_element_values_match
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'naming'
|
4
|
+
require_relative 'special_cases'
|
5
|
+
|
6
|
+
module CancerRegistryReportingTestKit
|
7
|
+
class HdeaGenerator
|
8
|
+
class GroupGenerator
|
9
|
+
class << self
|
10
|
+
def generate(ig_metadata, base_output_dir)
|
11
|
+
ig_metadata.ordered_groups
|
12
|
+
.reject { |group| SpecialCases::IGNORE_FOR_GENERATION.include?(group.profile_url) }
|
13
|
+
.each { |group| new(group, base_output_dir).generate }
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
attr_accessor :group_metadata, :base_output_dir
|
18
|
+
|
19
|
+
def initialize(group_metadata, base_output_dir)
|
20
|
+
self.group_metadata = group_metadata
|
21
|
+
self.base_output_dir = base_output_dir
|
22
|
+
end
|
23
|
+
|
24
|
+
def base_metadata_file_name
|
25
|
+
'metadata.yml'
|
26
|
+
end
|
27
|
+
|
28
|
+
def metadata_file_name
|
29
|
+
File.join(base_output_dir, profile_identifier, base_metadata_file_name)
|
30
|
+
end
|
31
|
+
|
32
|
+
def profile_identifier
|
33
|
+
Naming.snake_case_for_profile(group_metadata)
|
34
|
+
end
|
35
|
+
|
36
|
+
def group_id
|
37
|
+
"ccrr_#{group_metadata.reformatted_version}_#{profile_identifier}"
|
38
|
+
end
|
39
|
+
|
40
|
+
def generate
|
41
|
+
FileUtils.mkdir_p(File.join(base_output_dir, profile_identifier))
|
42
|
+
group_metadata.id = group_id
|
43
|
+
File.write(metadata_file_name, YAML.dump(group_metadata.to_hash))
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module CancerRegistryReportingTestKit
|
4
|
+
class HdeaGenerator
|
5
|
+
class GroupMetadata
|
6
|
+
ATTRIBUTES = %i[
|
7
|
+
name
|
8
|
+
class_name
|
9
|
+
version
|
10
|
+
reformatted_version
|
11
|
+
resource
|
12
|
+
profile_url
|
13
|
+
profile_name
|
14
|
+
profile_version
|
15
|
+
title
|
16
|
+
short_description
|
17
|
+
is_delayed
|
18
|
+
interactions
|
19
|
+
operations
|
20
|
+
searches
|
21
|
+
search_definitions
|
22
|
+
include_params
|
23
|
+
revincludes
|
24
|
+
required_concepts
|
25
|
+
must_supports
|
26
|
+
mandatory_elements
|
27
|
+
bindings
|
28
|
+
references
|
29
|
+
tests
|
30
|
+
id
|
31
|
+
file_name
|
32
|
+
delayed_references
|
33
|
+
].freeze
|
34
|
+
|
35
|
+
ATTRIBUTES.each { |name| attr_accessor name }
|
36
|
+
|
37
|
+
def initialize(metadata)
|
38
|
+
metadata.each do |key, value|
|
39
|
+
raise "Unknown attribute #{key}" unless ATTRIBUTES.include? key
|
40
|
+
|
41
|
+
instance_variable_set(:"@#{key}", value)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def exclude_search_tests?
|
46
|
+
delayed? && !searchable_delayed_resource?
|
47
|
+
end
|
48
|
+
|
49
|
+
def add_test(id:, file_name:)
|
50
|
+
self.tests ||= []
|
51
|
+
test_metadata = {
|
52
|
+
id: id,
|
53
|
+
file_name: file_name
|
54
|
+
}
|
55
|
+
self.tests << test_metadata
|
56
|
+
end
|
57
|
+
|
58
|
+
def add_granular_scope_test(id:, file_name:)
|
59
|
+
self.granular_scope_tests ||= []
|
60
|
+
|
61
|
+
self.granular_scope_tests << {
|
62
|
+
id:,
|
63
|
+
file_name:
|
64
|
+
}
|
65
|
+
end
|
66
|
+
|
67
|
+
def to_hash
|
68
|
+
ATTRIBUTES.each_with_object({}) { |key, hash| hash[key] = send(key) unless send(key).nil? }
|
69
|
+
end
|
70
|
+
|
71
|
+
def add_delayed_references(delayed_profiles, ig_resources)
|
72
|
+
self.delayed_references =
|
73
|
+
references
|
74
|
+
.select { |reference| (reference[:profiles] & delayed_profiles).present? }
|
75
|
+
.map do |reference|
|
76
|
+
profile_urls = (reference[:profiles] & delayed_profiles)
|
77
|
+
delayed_resources = profile_urls.map { |url| ig_resources.resource_for_profile(url) }
|
78
|
+
{
|
79
|
+
path: reference[:path].gsub("#{resource}.", ''),
|
80
|
+
resources: delayed_resources
|
81
|
+
}
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,205 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'group_metadata'
|
4
|
+
require_relative 'ig_metadata'
|
5
|
+
require_relative 'must_support_metadata_extractor'
|
6
|
+
require_relative 'terminology_binding_metadata_extractor'
|
7
|
+
|
8
|
+
module CancerRegistryReportingTestKit
|
9
|
+
class HdeaGenerator
|
10
|
+
class GroupMetadataExtractor
|
11
|
+
attr_accessor :resource_capabilities, :profile_url, :ig_metadata, :ig_resources
|
12
|
+
|
13
|
+
def initialize(resource_capabilities, profile_url, ig_metadata, ig_resources)
|
14
|
+
self.resource_capabilities = resource_capabilities
|
15
|
+
self.profile_url = profile_url
|
16
|
+
self.ig_metadata = ig_metadata
|
17
|
+
self.ig_resources = ig_resources
|
18
|
+
end
|
19
|
+
|
20
|
+
def group_metadata
|
21
|
+
@group_metadata ||=
|
22
|
+
GroupMetadata.new(group_metadata_hash)
|
23
|
+
end
|
24
|
+
|
25
|
+
def group_metadata_hash
|
26
|
+
@group_metadata_hash ||=
|
27
|
+
{
|
28
|
+
name: name,
|
29
|
+
class_name: class_name,
|
30
|
+
version: version,
|
31
|
+
reformatted_version: reformatted_version,
|
32
|
+
resource: resource,
|
33
|
+
profile_url: profile_url,
|
34
|
+
profile_name: profile_name,
|
35
|
+
profile_version: profile_version,
|
36
|
+
title: title,
|
37
|
+
short_description: short_description,
|
38
|
+
must_supports: must_supports,
|
39
|
+
mandatory_elements: mandatory_elements
|
40
|
+
}
|
41
|
+
|
42
|
+
@group_metadata_hash
|
43
|
+
end
|
44
|
+
|
45
|
+
# def mark_mandatory_and_must_support_searches
|
46
|
+
# searches.each do |search|
|
47
|
+
# search[:names_not_must_support_or_mandatory] = search[:names].reject do |name|
|
48
|
+
# full_paths = search_definitions[name.to_sym][:full_paths]
|
49
|
+
# any_must_support_elements = (must_supports[:elements]).any? do |element|
|
50
|
+
# full_must_support_paths = ["#{resource}.#{element[:original_path]}", "#{resource}.#{element[:path]}"]
|
51
|
+
|
52
|
+
# full_paths.any? do |path|
|
53
|
+
# # allow for non-choice, choice types, and _id
|
54
|
+
# name == '_id' || full_must_support_paths.include?(path) || full_must_support_paths.include?("#{path}[x]")
|
55
|
+
# end
|
56
|
+
# end
|
57
|
+
|
58
|
+
# any_must_support_slices = must_supports[:slices].any? do |slice|
|
59
|
+
# # only handle type slices because that is all we need for now
|
60
|
+
# # for a slice like Observation.effective[x]:effectiveDateTime, the search parameter's expression could be
|
61
|
+
# # either Observation.effective or Observation.effectiveDateTime.
|
62
|
+
# if slice[:discriminator] && slice[:discriminator][:type] == 'type'
|
63
|
+
# full_must_support_path = "#{resource}.#{slice[:path].sub('[x]', slice[:discriminator][:code])}"
|
64
|
+
# base_must_support_path = "#{resource}.#{slice[:path].sub('[x]', '')}"
|
65
|
+
|
66
|
+
# full_paths.intersection([full_must_support_path,base_must_support_path]).present?
|
67
|
+
# else
|
68
|
+
# false
|
69
|
+
# end
|
70
|
+
# end
|
71
|
+
|
72
|
+
# any_mandatory_elements = mandatory_elements.any? do |element|
|
73
|
+
# full_paths.include?(element)
|
74
|
+
# end
|
75
|
+
|
76
|
+
# any_must_support_elements || any_must_support_slices || any_mandatory_elements
|
77
|
+
# end
|
78
|
+
|
79
|
+
# search[:must_support_or_mandatory] = search[:names_not_must_support_or_mandatory].empty?
|
80
|
+
# end
|
81
|
+
# end
|
82
|
+
|
83
|
+
### BEGIN SPECIAL CASES ###
|
84
|
+
|
85
|
+
### END SPECIAL CASES ###
|
86
|
+
|
87
|
+
def profile
|
88
|
+
if resource_capabilities.title == 'Must Support'
|
89
|
+
SpecialCases.MUST_SUPPORT_GROUP_PROFILE
|
90
|
+
elsif resource_capabilities.title == 'Validation'
|
91
|
+
SpecialCases.VALIDATION_GROUP_PROFILE
|
92
|
+
else
|
93
|
+
@profile ||= ig_resources.profile_by_url(profile_url)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def profile_elements
|
98
|
+
@profile_elements ||= profile.snapshot.element
|
99
|
+
end
|
100
|
+
|
101
|
+
def base_name
|
102
|
+
profile_url.split('StructureDefinition/').last
|
103
|
+
end
|
104
|
+
|
105
|
+
def name
|
106
|
+
base_name.tr('-', '_')
|
107
|
+
end
|
108
|
+
|
109
|
+
def class_name
|
110
|
+
base_name
|
111
|
+
.split('-')
|
112
|
+
.map(&:capitalize)
|
113
|
+
.join
|
114
|
+
# .gsub('UsCore', "USCore#{ig_metadata.reformatted_version}")
|
115
|
+
.concat('Sequence')
|
116
|
+
end
|
117
|
+
|
118
|
+
def version
|
119
|
+
ig_metadata.ig_version
|
120
|
+
end
|
121
|
+
|
122
|
+
def reformatted_version
|
123
|
+
ig_metadata.reformatted_version
|
124
|
+
end
|
125
|
+
|
126
|
+
def resource
|
127
|
+
resource_capabilities.type
|
128
|
+
end
|
129
|
+
|
130
|
+
def profile_name
|
131
|
+
profile.title.gsub(' ', ' ')
|
132
|
+
end
|
133
|
+
|
134
|
+
def profile_version
|
135
|
+
profile.version
|
136
|
+
end
|
137
|
+
|
138
|
+
def title
|
139
|
+
title = profile.title.gsub(/\s*Profile/, '').strip
|
140
|
+
|
141
|
+
if Naming.resources_with_multiple_profiles.include?(resource) && !title.start_with?(resource) && version != 'v3.1.1'
|
142
|
+
title = "#{resource} #{title.split(resource).map(&:strip).join(' ')}"
|
143
|
+
end
|
144
|
+
|
145
|
+
title
|
146
|
+
end
|
147
|
+
|
148
|
+
def short_description
|
149
|
+
"Verify support for the server capabilities required by the #{profile_name}."
|
150
|
+
end
|
151
|
+
|
152
|
+
def required_concepts
|
153
|
+
# The base FHIR vital signs profile has a required binding that isn't
|
154
|
+
# relevant for any of its child profiles
|
155
|
+
return [] if resource == 'Observation'
|
156
|
+
|
157
|
+
profile_elements
|
158
|
+
.select { |element| element.type&.any? { |type| type.code == 'CodeableConcept' } }
|
159
|
+
.select { |element| element.binding&.strength == 'required' }
|
160
|
+
.map { |element| element.path.gsub("#{resource}.", '').gsub('[x]', 'CodeableConcept') }
|
161
|
+
.uniq
|
162
|
+
end
|
163
|
+
|
164
|
+
def terminology_binding_metadata_extractor
|
165
|
+
@terminology_binding_metadata_extractor ||=
|
166
|
+
TerminologyBindingMetadataExtractor.new(profile_elements, ig_resources, resource)
|
167
|
+
end
|
168
|
+
|
169
|
+
def bindings
|
170
|
+
@bindings ||=
|
171
|
+
terminology_binding_metadata_extractor.terminology_bindings
|
172
|
+
end
|
173
|
+
|
174
|
+
def must_support_metadata_extractor
|
175
|
+
@must_support_metadata_extractor ||=
|
176
|
+
MustSupportMetadataExtractor.new(profile_elements, profile, resource, ig_resources)
|
177
|
+
end
|
178
|
+
|
179
|
+
def must_supports
|
180
|
+
@must_supports ||=
|
181
|
+
must_support_metadata_extractor.must_supports
|
182
|
+
end
|
183
|
+
|
184
|
+
def mandatory_elements
|
185
|
+
@mandatory_elements ||=
|
186
|
+
profile_elements
|
187
|
+
.select { |element| element.min.positive? }
|
188
|
+
.map(&:path)
|
189
|
+
.uniq
|
190
|
+
end
|
191
|
+
|
192
|
+
def references
|
193
|
+
@references ||=
|
194
|
+
profile_elements
|
195
|
+
.select { |element| element.type&.first&.code == 'Reference' }
|
196
|
+
.map do |reference_definition|
|
197
|
+
{
|
198
|
+
path: reference_definition.path,
|
199
|
+
profiles: reference_definition.type.first.targetProfile
|
200
|
+
}
|
201
|
+
end
|
202
|
+
end
|
203
|
+
end
|
204
|
+
end
|
205
|
+
end
|