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.
Files changed (262) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +201 -0
  3. data/config/presets/hdea_report_preset.json +14 -0
  4. data/config/presets/inferno_reference_server_preset.json.erb +84 -0
  5. data/lib/cancer_registry_reporting_test_kit/bundle_parse.rb +161 -0
  6. data/lib/cancer_registry_reporting_test_kit/docs/ehr_suite_description.md +134 -0
  7. data/lib/cancer_registry_reporting_test_kit/docs/hdea_suite_description.md +108 -0
  8. data/lib/cancer_registry_reporting_test_kit/ehr_suite/ehr_capability_statement/mcode_capability_statement_profile_support.rb +40 -0
  9. data/lib/cancer_registry_reporting_test_kit/ehr_suite/ehr_data_access_group.rb +131 -0
  10. data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/medication_administration/medication_administration_must_support_test.rb +43 -0
  11. data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/medication_administration/medication_administration_search_test.rb +51 -0
  12. data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/medication_administration/medication_administration_validation_test.rb +41 -0
  13. data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/medication_administration/metadata.yml +72 -0
  14. data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/medication_administration_group.rb +72 -0
  15. data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/medication_request/medication_request_must_support_test.rb +55 -0
  16. data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/medication_request/medication_request_search_test.rb +55 -0
  17. data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/medication_request/medication_request_validation_test.rb +38 -0
  18. data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/medication_request/metadata.yml +94 -0
  19. data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/medication_request_group.rb +73 -0
  20. data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/primary_cancer_condition_group.rb +73 -0
  21. data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/primary_condition/metadata.yml +100 -0
  22. data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/primary_condition/primary_cancer_condition_must_support_test.rb +50 -0
  23. data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/primary_condition/primary_cancer_condition_search_test.rb +70 -0
  24. data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/primary_condition/primary_cancer_condition_validation_test.rb +39 -0
  25. data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/radiotherapy_procedure/metadata.yml +99 -0
  26. data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/radiotherapy_procedure/radiotherapy_procedure_must_support_test.rb +46 -0
  27. data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/radiotherapy_procedure/radiotherapy_procedure_search_test.rb +51 -0
  28. data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/radiotherapy_procedure/radiotherapy_procedure_validation_test.rb +37 -0
  29. data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/radiotherapy_procedure_group.rb +83 -0
  30. data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/secondary_cancer_condition_group.rb +68 -0
  31. data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/secondary_condition/metadata.yml +102 -0
  32. data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/secondary_condition/secondary_cancer_condition_must_support_test.rb +50 -0
  33. data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/secondary_condition/secondary_cancer_condition_search_test.rb +70 -0
  34. data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/secondary_condition/secondary_cancer_condition_validation_test.rb +39 -0
  35. data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/tnm_distant_metastases_category/metadata.yml +65 -0
  36. 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
  37. 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
  38. 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
  39. data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/tnm_distant_metastases_category_group.rb +74 -0
  40. data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/tnm_primary_tumor_category/metadata.yml +64 -0
  41. 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
  42. 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
  43. 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
  44. data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/tnm_primary_tumor_category_group.rb +73 -0
  45. data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/tnm_regional_nodes_category/metadata.yml +64 -0
  46. 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
  47. 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
  48. 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
  49. data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/tnm_regional_nodes_category_group.rb +73 -0
  50. data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/tnm_stage_group/metadata.yml +68 -0
  51. 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
  52. data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/tnm_stage_group/tnm_stage_group_search_test.rb +69 -0
  53. data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/tnm_stage_group/tnm_stage_group_validation_test.rb +39 -0
  54. data/lib/cancer_registry_reporting_test_kit/ehr_suite/mcode_data_access_resources/tnm_stage_group_group.rb +72 -0
  55. data/lib/cancer_registry_reporting_test_kit/ehr_suite.rb +69 -0
  56. data/lib/cancer_registry_reporting_test_kit/fhir_resource_navigation.rb +174 -0
  57. data/lib/cancer_registry_reporting_test_kit/hdea_generator/group_generator.rb +47 -0
  58. data/lib/cancer_registry_reporting_test_kit/hdea_generator/group_metadata.rb +86 -0
  59. data/lib/cancer_registry_reporting_test_kit/hdea_generator/group_metadata_extractor.rb +205 -0
  60. data/lib/cancer_registry_reporting_test_kit/hdea_generator/ig_loader.rb +78 -0
  61. data/lib/cancer_registry_reporting_test_kit/hdea_generator/ig_metadata.rb +26 -0
  62. data/lib/cancer_registry_reporting_test_kit/hdea_generator/ig_metadata_extractor.rb +78 -0
  63. data/lib/cancer_registry_reporting_test_kit/hdea_generator/ig_resources.rb +56 -0
  64. data/lib/cancer_registry_reporting_test_kit/hdea_generator/must_support_metadata_extractor.rb +399 -0
  65. data/lib/cancer_registry_reporting_test_kit/hdea_generator/must_support_test_generator.rb +134 -0
  66. data/lib/cancer_registry_reporting_test_kit/hdea_generator/naming.rb +168 -0
  67. data/lib/cancer_registry_reporting_test_kit/hdea_generator/special_cases.rb +43 -0
  68. data/lib/cancer_registry_reporting_test_kit/hdea_generator/templates/must_support.rb.erb +41 -0
  69. data/lib/cancer_registry_reporting_test_kit/hdea_generator/templates/validation.rb.erb +35 -0
  70. data/lib/cancer_registry_reporting_test_kit/hdea_generator/terminology_binding_metadata_extractor.rb +118 -0
  71. data/lib/cancer_registry_reporting_test_kit/hdea_generator/validation_test_generator.rb +125 -0
  72. data/lib/cancer_registry_reporting_test_kit/hdea_generator/value_extractor.rb +134 -0
  73. data/lib/cancer_registry_reporting_test_kit/hdea_generator.rb +66 -0
  74. data/lib/cancer_registry_reporting_test_kit/hdea_suite/author/author_validation_test.rb +61 -0
  75. data/lib/cancer_registry_reporting_test_kit/hdea_suite/author/organization_metadata.yml +47 -0
  76. data/lib/cancer_registry_reporting_test_kit/hdea_suite/author/organization_must_support_test.rb +73 -0
  77. data/lib/cancer_registry_reporting_test_kit/hdea_suite/author/practitioner_metadata.yml +51 -0
  78. data/lib/cancer_registry_reporting_test_kit/hdea_suite/author/practitioner_must_support_test.rb +73 -0
  79. data/lib/cancer_registry_reporting_test_kit/hdea_suite/author/practitioner_role_metadata.yml +48 -0
  80. data/lib/cancer_registry_reporting_test_kit/hdea_suite/author/practitioner_role_must_support_test.rb +66 -0
  81. data/lib/cancer_registry_reporting_test_kit/hdea_suite/bundle_resources_group.rb +213 -0
  82. data/lib/cancer_registry_reporting_test_kit/hdea_suite/ccrr_content_bundle_parse_and_validation_test.rb +67 -0
  83. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/allergy_intolerance/allergy_intolerance_must_support_test.rb +46 -0
  84. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/allergy_intolerance/allergy_intolerance_validation_test.rb +35 -0
  85. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/allergy_intolerance/metadata.yml +36 -0
  86. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/care_plan/care_plan_must_support_test.rb +48 -0
  87. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/care_plan/care_plan_validation_test.rb +35 -0
  88. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/care_plan/metadata.yml +50 -0
  89. 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
  90. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/ccrr_content_bundle/metadata.yml +36 -0
  91. 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
  92. 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
  93. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/central_cancer_registry_primary_cancer_condition/metadata.yml +86 -0
  94. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/composition/composition_must_support_test.rb +109 -0
  95. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/composition/composition_validation_test.rb +35 -0
  96. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/composition/metadata.yml +272 -0
  97. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/condition/condition_must_support_test.rb +45 -0
  98. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/condition/condition_validation_test.rb +35 -0
  99. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/condition/metadata.yml +33 -0
  100. 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
  101. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/diagnostic_report_lab/diagnostic_report_lab_validation_test.rb +35 -0
  102. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/diagnostic_report_lab/metadata.yml +57 -0
  103. 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
  104. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/diagnostic_report_note/diagnostic_report_note_validation_test.rb +35 -0
  105. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/diagnostic_report_note/metadata.yml +75 -0
  106. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/document_reference/document_reference_must_support_test.rb +57 -0
  107. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/document_reference/document_reference_validation_test.rb +35 -0
  108. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/document_reference/metadata.yml +68 -0
  109. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/encounter/encounter_must_support_test.rb +59 -0
  110. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/encounter/encounter_validation_test.rb +35 -0
  111. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/encounter/metadata.yml +73 -0
  112. 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
  113. 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
  114. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/mcode_radiotherapy_course_summary/metadata.yml +59 -0
  115. 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
  116. 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
  117. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/mcode_secondary_cancer_condition/metadata.yml +77 -0
  118. 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
  119. 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
  120. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/mcode_tnm_stage_group/metadata.yml +46 -0
  121. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/medication/medication_must_support_test.rb +41 -0
  122. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/medication/medication_validation_test.rb +35 -0
  123. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/medication/metadata.yml +26 -0
  124. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/medication_administration/medication_administration_must_support_test.rb +48 -0
  125. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/medication_administration/medication_administration_validation_test.rb +35 -0
  126. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/medication_administration/metadata.yml +48 -0
  127. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/medication_request/medication_request_must_support_test.rb +57 -0
  128. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/medication_request/medication_request_validation_test.rb +35 -0
  129. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/medication_request/metadata.yml +86 -0
  130. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/medication_statement/medication_statement_must_support_test.rb +41 -0
  131. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/medication_statement/medication_statement_validation_test.rb +35 -0
  132. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/medication_statement/metadata.yml +26 -0
  133. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/observation/metadata.yml +26 -0
  134. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/observation/observation_must_support_test.rb +41 -0
  135. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/observation/observation_validation_test.rb +35 -0
  136. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/observation_lab/metadata.yml +53 -0
  137. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/observation_lab/observation_lab_must_support_test.rb +50 -0
  138. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/observation_lab/observation_lab_validation_test.rb +35 -0
  139. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/odh_usual_work/metadata.yml +81 -0
  140. 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
  141. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/odh_usual_work/odh_usual_work_validation_test.rb +35 -0
  142. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/organization/metadata.yml +46 -0
  143. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/organization/organization_must_support_test.rb +55 -0
  144. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/organization/organization_validation_test.rb +35 -0
  145. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/patient/metadata.yml +51 -0
  146. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/patient/patient_must_support_test.rb +58 -0
  147. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/patient/patient_validation_test.rb +35 -0
  148. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/practitioner/metadata.yml +50 -0
  149. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/practitioner/practitioner_must_support_test.rb +55 -0
  150. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/practitioner/practitioner_validation_test.rb +35 -0
  151. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/practitioner_role/metadata.yml +47 -0
  152. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/practitioner_role/practitioner_role_must_support_test.rb +49 -0
  153. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/practitioner_role/practitioner_role_validation_test.rb +35 -0
  154. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/procedure/metadata.yml +37 -0
  155. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/procedure/procedure_must_support_test.rb +44 -0
  156. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/procedure/procedure_validation_test.rb +35 -0
  157. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/service_request/metadata.yml +26 -0
  158. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/service_request/service_request_must_support_test.rb +41 -0
  159. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/service_request/service_request_validation_test.rb +35 -0
  160. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/smokingstatus/metadata.yml +58 -0
  161. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/smokingstatus/smokingstatus_must_support_test.rb +47 -0
  162. data/lib/cancer_registry_reporting_test_kit/hdea_suite/generated/v1.0.0/smokingstatus/smokingstatus_validation_test.rb +35 -0
  163. data/lib/cancer_registry_reporting_test_kit/hdea_suite.rb +80 -0
  164. data/lib/cancer_registry_reporting_test_kit/igs/README.md +21 -0
  165. data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-mcode-cancer-related-medication-administration.json +1905 -0
  166. data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-mcode-cancer-related-medication-request.json +3611 -0
  167. data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-mcode-primary-cancer-condition.json +2246 -0
  168. data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-mcode-radiotherapy-course-summary.json +2700 -0
  169. data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-mcode-secondary-cancer-condition.json +2419 -0
  170. data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-mcode-tnm-distant-metastases-category.json +2320 -0
  171. data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-mcode-tnm-primary-tumor-category.json +2320 -0
  172. data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-mcode-tnm-regional-nodes-category.json +2320 -0
  173. data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-mcode-tnm-stage-group.json +2414 -0
  174. data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-medicationstatement.profile.json +1578 -0
  175. data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-observation.profile.json +3510 -0
  176. data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-odh-UsualWork.json +7248 -0
  177. data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-servicerequest.profile.json +3048 -0
  178. data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-us-core-allergyintolerance.json +1842 -0
  179. data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-us-core-careplan.json +1 -0
  180. data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-us-core-condition.json +2154 -0
  181. data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-us-core-diagnosticreport-lab.json +2002 -0
  182. data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-us-core-diagnosticreport-note.json +2049 -0
  183. data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-us-core-documentreference.json +1 -0
  184. data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-us-core-encounter.json +1 -0
  185. data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-us-core-medication.json +1 -0
  186. data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-us-core-observation-lab.json +3153 -0
  187. data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-us-core-organization.json +1 -0
  188. data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-us-core-patient.json +1 -0
  189. data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-us-core-practitioner.json +1 -0
  190. data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-us-core-practitionerrole.json +1 -0
  191. data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-us-core-procedure.json +1 -0
  192. data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100/StructureDefinition-us-core-smokingstatus.json +1 -0
  193. data/lib/cancer_registry_reporting_test_kit/igs/ccrr_v100.tgz +0 -0
  194. data/lib/cancer_registry_reporting_test_kit/igs/package/.index.db +0 -0
  195. data/lib/cancer_registry_reporting_test_kit/igs/package/.index.json +4 -0
  196. data/lib/cancer_registry_reporting_test_kit/igs/package/CapabilityStatement-central-cancer-registry-reporting-ehr.json +1 -0
  197. data/lib/cancer_registry_reporting_test_kit/igs/package/ImplementationGuide-hl7.fhir.us.central-cancer-registry-reporting.json +1 -0
  198. data/lib/cancer_registry_reporting_test_kit/igs/package/StructureDefinition-cancer-encounter.json +1 -0
  199. data/lib/cancer_registry_reporting_test_kit/igs/package/StructureDefinition-cancer-patient.json +1 -0
  200. data/lib/cancer_registry_reporting_test_kit/igs/package/StructureDefinition-ccrr-composition.json +1 -0
  201. data/lib/cancer_registry_reporting_test_kit/igs/package/StructureDefinition-ccrr-content-bundle.json +1 -0
  202. data/lib/cancer_registry_reporting_test_kit/igs/package/StructureDefinition-ccrr-plandefinition.json +1 -0
  203. data/lib/cancer_registry_reporting_test_kit/igs/package/StructureDefinition-ccrr-reporting-bundle.json +1 -0
  204. data/lib/cancer_registry_reporting_test_kit/igs/package/StructureDefinition-central-cancer-registry-primary-cancer-condition.json +1 -0
  205. data/lib/cancer_registry_reporting_test_kit/igs/package/StructureDefinition-central-cancer-registry-reporting-messageheader.json +1 -0
  206. data/lib/cancer_registry_reporting_test_kit/igs/package/StructureDefinition-us-ph-patient.json +1 -0
  207. data/lib/cancer_registry_reporting_test_kit/igs/package/StructureDefinition-us-ph-tribal-affiliation-extension.json +1 -0
  208. data/lib/cancer_registry_reporting_test_kit/igs/package/ValueSet-cancer-core-reportability-codes.json +1 -0
  209. data/lib/cancer_registry_reporting_test_kit/igs/package/example/AllergyIntolerance-example.json +1 -0
  210. data/lib/cancer_registry_reporting_test_kit/igs/package/example/BodyStructure-jenny-m-chest-wall-lymph-nodes-treatment-volume.json +1 -0
  211. data/lib/cancer_registry_reporting_test_kit/igs/package/example/BodyStructure-jenny-m-chest-wall-treatment-volume.json +1 -0
  212. data/lib/cancer_registry_reporting_test_kit/igs/package/example/Bundle-ccrr-content-bundle-example.json +1 -0
  213. data/lib/cancer_registry_reporting_test_kit/igs/package/example/Bundle-central-cancer-registry-reporting-specification-bundle-example.json +1 -0
  214. data/lib/cancer_registry_reporting_test_kit/igs/package/example/Bundle-reporting-bundle-example.json +1 -0
  215. data/lib/cancer_registry_reporting_test_kit/igs/package/example/Composition-ccrr-composition-example.json +1 -0
  216. data/lib/cancer_registry_reporting_test_kit/igs/package/example/Condition-primary-cancer-condition-breast.json +1 -0
  217. data/lib/cancer_registry_reporting_test_kit/igs/package/example/Encounter-encounter-cancer-example.json +1 -0
  218. data/lib/cancer_registry_reporting_test_kit/igs/package/example/Endpoint-example-healthcare-endpoint.json +1 -0
  219. data/lib/cancer_registry_reporting_test_kit/igs/package/example/Endpoint-example-ph-endpoint.json +1 -0
  220. data/lib/cancer_registry_reporting_test_kit/igs/package/example/MedicationAdministration-cancer-related-medication-administration-example.json +1 -0
  221. data/lib/cancer_registry_reporting_test_kit/igs/package/example/MessageHeader-messageheader-example-reportheader.json +1 -0
  222. data/lib/cancer_registry_reporting_test_kit/igs/package/example/Observation-cancer-stage-group-example.json +1 -0
  223. data/lib/cancer_registry_reporting_test_kit/igs/package/example/Observation-tnm-clinical-distant-metastases-category-cM0.json +1 -0
  224. data/lib/cancer_registry_reporting_test_kit/igs/package/example/Observation-tnm-clinical-primary-tumor-category-cT3.json +1 -0
  225. data/lib/cancer_registry_reporting_test_kit/igs/package/example/Observation-tnm-clinical-regional-nodes-category-cN3.json +1 -0
  226. data/lib/cancer_registry_reporting_test_kit/igs/package/example/Organization-example-healthcare-org.json +1 -0
  227. data/lib/cancer_registry_reporting_test_kit/igs/package/example/Organization-example-pha-org.json +1 -0
  228. data/lib/cancer_registry_reporting_test_kit/igs/package/example/Patient-example.json +1 -0
  229. data/lib/cancer_registry_reporting_test_kit/igs/package/example/PlanDefinition-plandefinition-central-cancer-registry-reporting-example.json +1 -0
  230. data/lib/cancer_registry_reporting_test_kit/igs/package/example/Practitioner-1.json +1 -0
  231. data/lib/cancer_registry_reporting_test_kit/igs/package/example/Procedure-radiotherapy-example.json +1 -0
  232. data/lib/cancer_registry_reporting_test_kit/igs/package/openapi/central-cancer-registry-reporting-ehr.openapi.json +364 -0
  233. data/lib/cancer_registry_reporting_test_kit/igs/package/other/ig-r4.jsonX +1 -0
  234. data/lib/cancer_registry_reporting_test_kit/igs/package/other/spec.internals +293 -0
  235. data/lib/cancer_registry_reporting_test_kit/igs/package/other/validation-oo.json +1 -0
  236. data/lib/cancer_registry_reporting_test_kit/igs/package/other/validation-summary.json +1 -0
  237. data/lib/cancer_registry_reporting_test_kit/igs/package/package.json +30 -0
  238. data/lib/cancer_registry_reporting_test_kit/igs/package/xml/StructureDefinition-cancer-encounter.sch +19 -0
  239. data/lib/cancer_registry_reporting_test_kit/igs/package/xml/StructureDefinition-cancer-patient.sch +175 -0
  240. data/lib/cancer_registry_reporting_test_kit/igs/package/xml/StructureDefinition-ccrr-composition.sch +61 -0
  241. data/lib/cancer_registry_reporting_test_kit/igs/package/xml/StructureDefinition-ccrr-content-bundle.sch +12 -0
  242. data/lib/cancer_registry_reporting_test_kit/igs/package/xml/StructureDefinition-ccrr-plandefinition.sch +331 -0
  243. data/lib/cancer_registry_reporting_test_kit/igs/package/xml/StructureDefinition-ccrr-reporting-bundle.sch +12 -0
  244. data/lib/cancer_registry_reporting_test_kit/igs/package/xml/StructureDefinition-central-cancer-registry-primary-cancer-condition.sch +31 -0
  245. data/lib/cancer_registry_reporting_test_kit/igs/package/xml/StructureDefinition-central-cancer-registry-reporting-messageheader.sch +27 -0
  246. data/lib/cancer_registry_reporting_test_kit/igs/package/xml/StructureDefinition-us-ph-patient.sch +217 -0
  247. data/lib/cancer_registry_reporting_test_kit/igs/package/xml/StructureDefinition-us-ph-tribal-affiliation-extension.sch +36 -0
  248. data/lib/cancer_registry_reporting_test_kit/metadata.rb +71 -0
  249. data/lib/cancer_registry_reporting_test_kit/must_support_test.rb +263 -0
  250. data/lib/cancer_registry_reporting_test_kit/primitive_type.rb +7 -0
  251. data/lib/cancer_registry_reporting_test_kit/requirements/cancer-registry-reporting-test-kit_out_of_scope_requirements.csv +77 -0
  252. data/lib/cancer_registry_reporting_test_kit/requirements/cancer-registry-reporting-test-kit_requirements.csv +162 -0
  253. data/lib/cancer_registry_reporting_test_kit/requirements/generated/cancer-registry-reporting-test-kit_requirements_coverage.csv +161 -0
  254. data/lib/cancer_registry_reporting_test_kit/search_test.rb +897 -0
  255. data/lib/cancer_registry_reporting_test_kit/search_test_properties.rb +58 -0
  256. data/lib/cancer_registry_reporting_test_kit/validation_test.rb +68 -0
  257. data/lib/cancer_registry_reporting_test_kit/version.rb +6 -0
  258. data/lib/cancer_registry_reporting_test_kit.rb +6 -0
  259. data/lib/inferno_requirements_tools/ext/inferno_core/runnable.rb +22 -0
  260. data/lib/inferno_requirements_tools/tasks/requirements_coverage.rb +284 -0
  261. data/lib/requirements_config.yaml +22 -0
  262. 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