ipa_test_kit 0.2.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 (270) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +201 -0
  3. data/lib/ipa_test_kit/custom_groups/capability_statement/conformance_support_test.rb +41 -0
  4. data/lib/ipa_test_kit/custom_groups/capability_statement/fhir_version_test.rb +15 -0
  5. data/lib/ipa_test_kit/custom_groups/capability_statement/json_support_test.rb +39 -0
  6. data/lib/ipa_test_kit/custom_groups/capability_statement/profile_support_test.rb +76 -0
  7. data/lib/ipa_test_kit/custom_groups/capability_statement_group.rb +64 -0
  8. data/lib/ipa_test_kit/date_search_validation.rb +101 -0
  9. data/lib/ipa_test_kit/ext/fhir_models.rb +59 -0
  10. data/lib/ipa_test_kit/fhir_resource_navigation.rb +63 -0
  11. data/lib/ipa_test_kit/generated/allergy_intolerance/allergy_intolerance_must_support_test.rb +40 -0
  12. data/lib/ipa_test_kit/generated/allergy_intolerance/allergy_intolerance_patient_clinical_status_search_test.rb +46 -0
  13. data/lib/ipa_test_kit/generated/allergy_intolerance/allergy_intolerance_patient_search_test.rb +60 -0
  14. data/lib/ipa_test_kit/generated/allergy_intolerance/allergy_intolerance_provenance_revinclude_search_test.rb +49 -0
  15. data/lib/ipa_test_kit/generated/allergy_intolerance/allergy_intolerance_read_test.rb +24 -0
  16. data/lib/ipa_test_kit/generated/allergy_intolerance/allergy_intolerance_reference_resolution_test.rb +28 -0
  17. data/lib/ipa_test_kit/generated/allergy_intolerance/allergy_intolerance_validation_test.rb +34 -0
  18. data/lib/ipa_test_kit/generated/allergy_intolerance/metadata.yml +165 -0
  19. data/lib/ipa_test_kit/generated/allergy_intolerance_group.rb +85 -0
  20. data/lib/ipa_test_kit/generated/bmi/bmi_must_support_test.rb +49 -0
  21. data/lib/ipa_test_kit/generated/bmi/bmi_patient_category_date_search_test.rb +46 -0
  22. data/lib/ipa_test_kit/generated/bmi/bmi_patient_category_search_test.rb +45 -0
  23. data/lib/ipa_test_kit/generated/bmi/bmi_patient_category_status_search_test.rb +47 -0
  24. data/lib/ipa_test_kit/generated/bmi/bmi_patient_code_date_search_test.rb +48 -0
  25. data/lib/ipa_test_kit/generated/bmi/bmi_patient_code_search_test.rb +62 -0
  26. data/lib/ipa_test_kit/generated/bmi/bmi_provenance_revinclude_search_test.rb +51 -0
  27. data/lib/ipa_test_kit/generated/bmi/bmi_read_test.rb +24 -0
  28. data/lib/ipa_test_kit/generated/bmi/bmi_reference_resolution_test.rb +28 -0
  29. data/lib/ipa_test_kit/generated/bmi/bmi_validation_test.rb +34 -0
  30. data/lib/ipa_test_kit/generated/bmi/metadata.yml +322 -0
  31. data/lib/ipa_test_kit/generated/bmi_group.rb +93 -0
  32. data/lib/ipa_test_kit/generated/bodyheight/bodyheight_must_support_test.rb +49 -0
  33. data/lib/ipa_test_kit/generated/bodyheight/bodyheight_patient_category_date_search_test.rb +46 -0
  34. data/lib/ipa_test_kit/generated/bodyheight/bodyheight_patient_category_search_test.rb +45 -0
  35. data/lib/ipa_test_kit/generated/bodyheight/bodyheight_patient_category_status_search_test.rb +47 -0
  36. data/lib/ipa_test_kit/generated/bodyheight/bodyheight_patient_code_date_search_test.rb +48 -0
  37. data/lib/ipa_test_kit/generated/bodyheight/bodyheight_patient_code_search_test.rb +62 -0
  38. data/lib/ipa_test_kit/generated/bodyheight/bodyheight_provenance_revinclude_search_test.rb +51 -0
  39. data/lib/ipa_test_kit/generated/bodyheight/bodyheight_read_test.rb +24 -0
  40. data/lib/ipa_test_kit/generated/bodyheight/bodyheight_reference_resolution_test.rb +28 -0
  41. data/lib/ipa_test_kit/generated/bodyheight/bodyheight_validation_test.rb +34 -0
  42. data/lib/ipa_test_kit/generated/bodyheight/metadata.yml +328 -0
  43. data/lib/ipa_test_kit/generated/bodyheight_group.rb +93 -0
  44. data/lib/ipa_test_kit/generated/bodytemp/bodytemp_must_support_test.rb +49 -0
  45. data/lib/ipa_test_kit/generated/bodytemp/bodytemp_patient_category_date_search_test.rb +46 -0
  46. data/lib/ipa_test_kit/generated/bodytemp/bodytemp_patient_category_search_test.rb +45 -0
  47. data/lib/ipa_test_kit/generated/bodytemp/bodytemp_patient_category_status_search_test.rb +47 -0
  48. data/lib/ipa_test_kit/generated/bodytemp/bodytemp_patient_code_date_search_test.rb +48 -0
  49. data/lib/ipa_test_kit/generated/bodytemp/bodytemp_patient_code_search_test.rb +62 -0
  50. data/lib/ipa_test_kit/generated/bodytemp/bodytemp_provenance_revinclude_search_test.rb +51 -0
  51. data/lib/ipa_test_kit/generated/bodytemp/bodytemp_read_test.rb +24 -0
  52. data/lib/ipa_test_kit/generated/bodytemp/bodytemp_reference_resolution_test.rb +28 -0
  53. data/lib/ipa_test_kit/generated/bodytemp/bodytemp_validation_test.rb +34 -0
  54. data/lib/ipa_test_kit/generated/bodytemp/metadata.yml +328 -0
  55. data/lib/ipa_test_kit/generated/bodytemp_group.rb +93 -0
  56. data/lib/ipa_test_kit/generated/bodyweight/bodyweight_must_support_test.rb +49 -0
  57. data/lib/ipa_test_kit/generated/bodyweight/bodyweight_patient_category_date_search_test.rb +46 -0
  58. data/lib/ipa_test_kit/generated/bodyweight/bodyweight_patient_category_search_test.rb +45 -0
  59. data/lib/ipa_test_kit/generated/bodyweight/bodyweight_patient_category_status_search_test.rb +47 -0
  60. data/lib/ipa_test_kit/generated/bodyweight/bodyweight_patient_code_date_search_test.rb +48 -0
  61. data/lib/ipa_test_kit/generated/bodyweight/bodyweight_patient_code_search_test.rb +62 -0
  62. data/lib/ipa_test_kit/generated/bodyweight/bodyweight_provenance_revinclude_search_test.rb +51 -0
  63. data/lib/ipa_test_kit/generated/bodyweight/bodyweight_read_test.rb +24 -0
  64. data/lib/ipa_test_kit/generated/bodyweight/bodyweight_reference_resolution_test.rb +28 -0
  65. data/lib/ipa_test_kit/generated/bodyweight/bodyweight_validation_test.rb +34 -0
  66. data/lib/ipa_test_kit/generated/bodyweight/metadata.yml +328 -0
  67. data/lib/ipa_test_kit/generated/bodyweight_group.rb +93 -0
  68. data/lib/ipa_test_kit/generated/bp/bp_must_support_test.rb +52 -0
  69. data/lib/ipa_test_kit/generated/bp/bp_patient_category_date_search_test.rb +46 -0
  70. data/lib/ipa_test_kit/generated/bp/bp_patient_category_search_test.rb +45 -0
  71. data/lib/ipa_test_kit/generated/bp/bp_patient_category_status_search_test.rb +47 -0
  72. data/lib/ipa_test_kit/generated/bp/bp_patient_code_date_search_test.rb +48 -0
  73. data/lib/ipa_test_kit/generated/bp/bp_patient_code_search_test.rb +62 -0
  74. data/lib/ipa_test_kit/generated/bp/bp_provenance_revinclude_search_test.rb +51 -0
  75. data/lib/ipa_test_kit/generated/bp/bp_read_test.rb +24 -0
  76. data/lib/ipa_test_kit/generated/bp/bp_reference_resolution_test.rb +28 -0
  77. data/lib/ipa_test_kit/generated/bp/bp_validation_test.rb +34 -0
  78. data/lib/ipa_test_kit/generated/bp/metadata.yml +379 -0
  79. data/lib/ipa_test_kit/generated/bp_group.rb +93 -0
  80. data/lib/ipa_test_kit/generated/condition/condition_must_support_test.rb +39 -0
  81. data/lib/ipa_test_kit/generated/condition/condition_patient_category_search_test.rb +47 -0
  82. data/lib/ipa_test_kit/generated/condition/condition_patient_clinical_status_search_test.rb +46 -0
  83. data/lib/ipa_test_kit/generated/condition/condition_patient_code_search_test.rb +47 -0
  84. data/lib/ipa_test_kit/generated/condition/condition_patient_onset_date_search_test.rb +47 -0
  85. data/lib/ipa_test_kit/generated/condition/condition_patient_search_test.rb +60 -0
  86. data/lib/ipa_test_kit/generated/condition/condition_provenance_revinclude_search_test.rb +49 -0
  87. data/lib/ipa_test_kit/generated/condition/condition_read_test.rb +24 -0
  88. data/lib/ipa_test_kit/generated/condition/condition_reference_resolution_test.rb +28 -0
  89. data/lib/ipa_test_kit/generated/condition/condition_validation_test.rb +34 -0
  90. data/lib/ipa_test_kit/generated/condition/metadata.yml +231 -0
  91. data/lib/ipa_test_kit/generated/condition_group.rb +91 -0
  92. data/lib/ipa_test_kit/generated/document_reference/document_reference_id_search_test.rb +40 -0
  93. data/lib/ipa_test_kit/generated/document_reference/document_reference_must_support_test.rb +49 -0
  94. data/lib/ipa_test_kit/generated/document_reference/document_reference_patient_category_date_search_test.rb +46 -0
  95. data/lib/ipa_test_kit/generated/document_reference/document_reference_patient_category_search_test.rb +45 -0
  96. data/lib/ipa_test_kit/generated/document_reference/document_reference_patient_search_test.rb +61 -0
  97. data/lib/ipa_test_kit/generated/document_reference/document_reference_patient_status_search_test.rb +46 -0
  98. data/lib/ipa_test_kit/generated/document_reference/document_reference_patient_type_period_search_test.rb +48 -0
  99. data/lib/ipa_test_kit/generated/document_reference/document_reference_patient_type_search_test.rb +45 -0
  100. data/lib/ipa_test_kit/generated/document_reference/document_reference_provenance_revinclude_search_test.rb +50 -0
  101. data/lib/ipa_test_kit/generated/document_reference/document_reference_read_test.rb +24 -0
  102. data/lib/ipa_test_kit/generated/document_reference/document_reference_reference_resolution_test.rb +28 -0
  103. data/lib/ipa_test_kit/generated/document_reference/document_reference_validation_test.rb +34 -0
  104. data/lib/ipa_test_kit/generated/document_reference/metadata.yml +356 -0
  105. data/lib/ipa_test_kit/generated/document_reference_group.rb +99 -0
  106. data/lib/ipa_test_kit/generated/head_circumference/head_circumference_must_support_test.rb +49 -0
  107. data/lib/ipa_test_kit/generated/head_circumference/head_circumference_patient_category_date_search_test.rb +46 -0
  108. data/lib/ipa_test_kit/generated/head_circumference/head_circumference_patient_category_search_test.rb +45 -0
  109. data/lib/ipa_test_kit/generated/head_circumference/head_circumference_patient_category_status_search_test.rb +47 -0
  110. data/lib/ipa_test_kit/generated/head_circumference/head_circumference_patient_code_date_search_test.rb +48 -0
  111. data/lib/ipa_test_kit/generated/head_circumference/head_circumference_patient_code_search_test.rb +62 -0
  112. data/lib/ipa_test_kit/generated/head_circumference/head_circumference_provenance_revinclude_search_test.rb +51 -0
  113. data/lib/ipa_test_kit/generated/head_circumference/head_circumference_read_test.rb +24 -0
  114. data/lib/ipa_test_kit/generated/head_circumference/head_circumference_reference_resolution_test.rb +28 -0
  115. data/lib/ipa_test_kit/generated/head_circumference/head_circumference_validation_test.rb +34 -0
  116. data/lib/ipa_test_kit/generated/head_circumference/metadata.yml +324 -0
  117. data/lib/ipa_test_kit/generated/head_circumference_group.rb +93 -0
  118. data/lib/ipa_test_kit/generated/heartrate/heartrate_must_support_test.rb +49 -0
  119. data/lib/ipa_test_kit/generated/heartrate/heartrate_patient_category_date_search_test.rb +46 -0
  120. data/lib/ipa_test_kit/generated/heartrate/heartrate_patient_category_search_test.rb +45 -0
  121. data/lib/ipa_test_kit/generated/heartrate/heartrate_patient_category_status_search_test.rb +47 -0
  122. data/lib/ipa_test_kit/generated/heartrate/heartrate_patient_code_date_search_test.rb +48 -0
  123. data/lib/ipa_test_kit/generated/heartrate/heartrate_patient_code_search_test.rb +62 -0
  124. data/lib/ipa_test_kit/generated/heartrate/heartrate_provenance_revinclude_search_test.rb +51 -0
  125. data/lib/ipa_test_kit/generated/heartrate/heartrate_read_test.rb +24 -0
  126. data/lib/ipa_test_kit/generated/heartrate/heartrate_reference_resolution_test.rb +28 -0
  127. data/lib/ipa_test_kit/generated/heartrate/heartrate_validation_test.rb +34 -0
  128. data/lib/ipa_test_kit/generated/heartrate/metadata.yml +325 -0
  129. data/lib/ipa_test_kit/generated/heartrate_group.rb +93 -0
  130. data/lib/ipa_test_kit/generated/immunization/immunization_must_support_test.rb +40 -0
  131. data/lib/ipa_test_kit/generated/immunization/immunization_patient_date_search_test.rb +47 -0
  132. data/lib/ipa_test_kit/generated/immunization/immunization_patient_search_test.rb +60 -0
  133. data/lib/ipa_test_kit/generated/immunization/immunization_patient_status_search_test.rb +45 -0
  134. data/lib/ipa_test_kit/generated/immunization/immunization_provenance_revinclude_search_test.rb +50 -0
  135. data/lib/ipa_test_kit/generated/immunization/immunization_read_test.rb +24 -0
  136. data/lib/ipa_test_kit/generated/immunization/immunization_reference_resolution_test.rb +28 -0
  137. data/lib/ipa_test_kit/generated/immunization/immunization_validation_test.rb +34 -0
  138. data/lib/ipa_test_kit/generated/immunization/metadata.yml +210 -0
  139. data/lib/ipa_test_kit/generated/immunization_group.rb +87 -0
  140. data/lib/ipa_test_kit/generated/ipa_test_suite.rb +88 -0
  141. data/lib/ipa_test_kit/generated/medication_request/medication_request_must_support_test.rb +44 -0
  142. data/lib/ipa_test_kit/generated/medication_request/medication_request_patient_intent_authoredon_search_test.rb +53 -0
  143. data/lib/ipa_test_kit/generated/medication_request/medication_request_patient_intent_encounter_search_test.rb +52 -0
  144. data/lib/ipa_test_kit/generated/medication_request/medication_request_patient_intent_search_test.rb +68 -0
  145. data/lib/ipa_test_kit/generated/medication_request/medication_request_patient_intent_status_search_test.rb +49 -0
  146. data/lib/ipa_test_kit/generated/medication_request/medication_request_provenance_revinclude_search_test.rb +51 -0
  147. data/lib/ipa_test_kit/generated/medication_request/medication_request_read_test.rb +24 -0
  148. data/lib/ipa_test_kit/generated/medication_request/medication_request_reference_resolution_test.rb +28 -0
  149. data/lib/ipa_test_kit/generated/medication_request/medication_request_validation_test.rb +34 -0
  150. data/lib/ipa_test_kit/generated/medication_request/medication_validation_test.rb +34 -0
  151. data/lib/ipa_test_kit/generated/medication_request/metadata.yml +307 -0
  152. data/lib/ipa_test_kit/generated/medication_request_group.rb +92 -0
  153. data/lib/ipa_test_kit/generated/medication_statement/medication_statement_must_support_test.rb +43 -0
  154. data/lib/ipa_test_kit/generated/medication_statement/medication_statement_patient_context_search_test.rb +51 -0
  155. data/lib/ipa_test_kit/generated/medication_statement/medication_statement_patient_effective_search_test.rb +52 -0
  156. data/lib/ipa_test_kit/generated/medication_statement/medication_statement_patient_search_test.rb +68 -0
  157. data/lib/ipa_test_kit/generated/medication_statement/medication_statement_patient_status_search_test.rb +49 -0
  158. data/lib/ipa_test_kit/generated/medication_statement/medication_statement_provenance_revinclude_search_test.rb +51 -0
  159. data/lib/ipa_test_kit/generated/medication_statement/medication_statement_read_test.rb +24 -0
  160. data/lib/ipa_test_kit/generated/medication_statement/medication_statement_reference_resolution_test.rb +28 -0
  161. data/lib/ipa_test_kit/generated/medication_statement/medication_statement_validation_test.rb +34 -0
  162. data/lib/ipa_test_kit/generated/medication_statement/medication_validation_test.rb +34 -0
  163. data/lib/ipa_test_kit/generated/medication_statement/metadata.yml +230 -0
  164. data/lib/ipa_test_kit/generated/medication_statement_group.rb +92 -0
  165. data/lib/ipa_test_kit/generated/metadata.yml +6230 -0
  166. data/lib/ipa_test_kit/generated/observation/metadata.yml +1280 -0
  167. data/lib/ipa_test_kit/generated/observation/observation_must_support_test.rb +41 -0
  168. data/lib/ipa_test_kit/generated/observation/observation_patient_category_date_search_test.rb +46 -0
  169. data/lib/ipa_test_kit/generated/observation/observation_patient_category_search_test.rb +62 -0
  170. data/lib/ipa_test_kit/generated/observation/observation_patient_category_status_search_test.rb +47 -0
  171. data/lib/ipa_test_kit/generated/observation/observation_patient_code_date_search_test.rb +48 -0
  172. data/lib/ipa_test_kit/generated/observation/observation_patient_code_search_test.rb +45 -0
  173. data/lib/ipa_test_kit/generated/observation/observation_provenance_revinclude_search_test.rb +51 -0
  174. data/lib/ipa_test_kit/generated/observation/observation_read_test.rb +24 -0
  175. data/lib/ipa_test_kit/generated/observation/observation_reference_resolution_test.rb +28 -0
  176. data/lib/ipa_test_kit/generated/observation/observation_validation_test.rb +34 -0
  177. data/lib/ipa_test_kit/generated/observation_group.rb +93 -0
  178. data/lib/ipa_test_kit/generated/oxygensat/metadata.yml +366 -0
  179. data/lib/ipa_test_kit/generated/oxygensat/oxygensat_must_support_test.rb +65 -0
  180. data/lib/ipa_test_kit/generated/oxygensat/oxygensat_patient_category_date_search_test.rb +46 -0
  181. data/lib/ipa_test_kit/generated/oxygensat/oxygensat_patient_category_search_test.rb +45 -0
  182. data/lib/ipa_test_kit/generated/oxygensat/oxygensat_patient_category_status_search_test.rb +47 -0
  183. data/lib/ipa_test_kit/generated/oxygensat/oxygensat_patient_code_date_search_test.rb +48 -0
  184. data/lib/ipa_test_kit/generated/oxygensat/oxygensat_patient_code_search_test.rb +62 -0
  185. data/lib/ipa_test_kit/generated/oxygensat/oxygensat_provenance_revinclude_search_test.rb +51 -0
  186. data/lib/ipa_test_kit/generated/oxygensat/oxygensat_read_test.rb +24 -0
  187. data/lib/ipa_test_kit/generated/oxygensat/oxygensat_reference_resolution_test.rb +28 -0
  188. data/lib/ipa_test_kit/generated/oxygensat/oxygensat_validation_test.rb +34 -0
  189. data/lib/ipa_test_kit/generated/oxygensat_group.rb +93 -0
  190. data/lib/ipa_test_kit/generated/patient/metadata.yml +320 -0
  191. data/lib/ipa_test_kit/generated/patient/patient_birthdate_family_search_test.rb +41 -0
  192. data/lib/ipa_test_kit/generated/patient/patient_birthdate_name_search_test.rb +39 -0
  193. data/lib/ipa_test_kit/generated/patient/patient_family_gender_search_test.rb +41 -0
  194. data/lib/ipa_test_kit/generated/patient/patient_gender_name_search_test.rb +39 -0
  195. data/lib/ipa_test_kit/generated/patient/patient_id_search_test.rb +53 -0
  196. data/lib/ipa_test_kit/generated/patient/patient_identifier_search_test.rb +40 -0
  197. data/lib/ipa_test_kit/generated/patient/patient_must_support_test.rb +57 -0
  198. data/lib/ipa_test_kit/generated/patient/patient_name_search_test.rb +39 -0
  199. data/lib/ipa_test_kit/generated/patient/patient_provenance_revinclude_search_test.rb +49 -0
  200. data/lib/ipa_test_kit/generated/patient/patient_read_test.rb +24 -0
  201. data/lib/ipa_test_kit/generated/patient/patient_reference_resolution_test.rb +28 -0
  202. data/lib/ipa_test_kit/generated/patient/patient_validation_test.rb +34 -0
  203. data/lib/ipa_test_kit/generated/patient_group.rb +99 -0
  204. data/lib/ipa_test_kit/generated/practitioner/metadata.yml +124 -0
  205. data/lib/ipa_test_kit/generated/practitioner/practitioner_identifier_search_test.rb +40 -0
  206. data/lib/ipa_test_kit/generated/practitioner/practitioner_must_support_test.rb +40 -0
  207. data/lib/ipa_test_kit/generated/practitioner/practitioner_name_search_test.rb +49 -0
  208. data/lib/ipa_test_kit/generated/practitioner/practitioner_read_test.rb +24 -0
  209. data/lib/ipa_test_kit/generated/practitioner/practitioner_reference_resolution_test.rb +28 -0
  210. data/lib/ipa_test_kit/generated/practitioner/practitioner_validation_test.rb +34 -0
  211. data/lib/ipa_test_kit/generated/practitioner_group.rb +84 -0
  212. data/lib/ipa_test_kit/generated/practitioner_role/metadata.yml +141 -0
  213. data/lib/ipa_test_kit/generated/practitioner_role/practitioner_role_identifier_search_test.rb +40 -0
  214. data/lib/ipa_test_kit/generated/practitioner_role/practitioner_role_must_support_test.rb +40 -0
  215. data/lib/ipa_test_kit/generated/practitioner_role/practitioner_role_practitioner_search_test.rb +51 -0
  216. data/lib/ipa_test_kit/generated/practitioner_role/practitioner_role_read_test.rb +24 -0
  217. data/lib/ipa_test_kit/generated/practitioner_role/practitioner_role_reference_resolution_test.rb +28 -0
  218. data/lib/ipa_test_kit/generated/practitioner_role/practitioner_role_validation_test.rb +34 -0
  219. data/lib/ipa_test_kit/generated/practitioner_role_group.rb +84 -0
  220. data/lib/ipa_test_kit/generated/provenance/metadata.yml +114 -0
  221. data/lib/ipa_test_kit/generated/provenance/provenance_read_test.rb +24 -0
  222. data/lib/ipa_test_kit/generated/provenance/provenance_reference_resolution_test.rb +28 -0
  223. data/lib/ipa_test_kit/generated/provenance/provenance_validation_test.rb +34 -0
  224. data/lib/ipa_test_kit/generated/provenance_group.rb +53 -0
  225. data/lib/ipa_test_kit/generated/resource_list.rb +18 -0
  226. data/lib/ipa_test_kit/generated/resprate/metadata.yml +325 -0
  227. data/lib/ipa_test_kit/generated/resprate/resprate_must_support_test.rb +49 -0
  228. data/lib/ipa_test_kit/generated/resprate/resprate_patient_category_date_search_test.rb +46 -0
  229. data/lib/ipa_test_kit/generated/resprate/resprate_patient_category_search_test.rb +45 -0
  230. data/lib/ipa_test_kit/generated/resprate/resprate_patient_category_status_search_test.rb +47 -0
  231. data/lib/ipa_test_kit/generated/resprate/resprate_patient_code_date_search_test.rb +48 -0
  232. data/lib/ipa_test_kit/generated/resprate/resprate_patient_code_search_test.rb +62 -0
  233. data/lib/ipa_test_kit/generated/resprate/resprate_provenance_revinclude_search_test.rb +51 -0
  234. data/lib/ipa_test_kit/generated/resprate/resprate_read_test.rb +24 -0
  235. data/lib/ipa_test_kit/generated/resprate/resprate_reference_resolution_test.rb +28 -0
  236. data/lib/ipa_test_kit/generated/resprate/resprate_validation_test.rb +34 -0
  237. data/lib/ipa_test_kit/generated/resprate_group.rb +93 -0
  238. data/lib/ipa_test_kit/generator/group_generator.rb +171 -0
  239. data/lib/ipa_test_kit/generator/group_metadata.rb +98 -0
  240. data/lib/ipa_test_kit/generator/group_metadata_extractor.rb +278 -0
  241. data/lib/ipa_test_kit/generator/ig_loader.rb +63 -0
  242. data/lib/ipa_test_kit/generator/ig_metadata.rb +49 -0
  243. data/lib/ipa_test_kit/generator/ig_metadata_extractor.rb +56 -0
  244. data/lib/ipa_test_kit/generator/ig_resources.rb +48 -0
  245. data/lib/ipa_test_kit/generator/must_support_metadata_extractor.rb +221 -0
  246. data/lib/ipa_test_kit/generator/must_support_test_generator.rb +86 -0
  247. data/lib/ipa_test_kit/generator/naming.rb +46 -0
  248. data/lib/ipa_test_kit/generator/provenance_revinclude_search_test_generator.rb +186 -0
  249. data/lib/ipa_test_kit/generator/read_test_generator.rb +89 -0
  250. data/lib/ipa_test_kit/generator/reference_resolution_test_generator.rb +72 -0
  251. data/lib/ipa_test_kit/generator/resource_list_generator.rb +46 -0
  252. data/lib/ipa_test_kit/generator/search_definition_metadata_extractor.rb +181 -0
  253. data/lib/ipa_test_kit/generator/search_metadata_extractor.rb +74 -0
  254. data/lib/ipa_test_kit/generator/search_test_generator.rb +295 -0
  255. data/lib/ipa_test_kit/generator/special_cases.rb +16 -0
  256. data/lib/ipa_test_kit/generator/suite_generator.rb +67 -0
  257. data/lib/ipa_test_kit/generator/terminology_binding_metadata_extractor.rb +105 -0
  258. data/lib/ipa_test_kit/generator/validation_test_generator.rb +124 -0
  259. data/lib/ipa_test_kit/generator.rb +86 -0
  260. data/lib/ipa_test_kit/igs/package.tgz +0 -0
  261. data/lib/ipa_test_kit/must_support_test.rb +146 -0
  262. data/lib/ipa_test_kit/read_test.rb +62 -0
  263. data/lib/ipa_test_kit/reference_resolution_test.rb +111 -0
  264. data/lib/ipa_test_kit/request_logger.rb +46 -0
  265. data/lib/ipa_test_kit/search_test.rb +728 -0
  266. data/lib/ipa_test_kit/search_test_properties.rb +61 -0
  267. data/lib/ipa_test_kit/validation_test.rb +48 -0
  268. data/lib/ipa_test_kit/version.rb +3 -0
  269. data/lib/ipa_test_kit.rb +2 -0
  270. metadata +397 -0
@@ -0,0 +1,46 @@
1
+ module IpaTestKit
2
+ class Generator
3
+ class ResourceListGenerator
4
+ class << self
5
+ def generate(ig_metadata)
6
+ @ig_metadata = ig_metadata
7
+
8
+ FileUtils.mkdir_p(output_file_directory)
9
+ File.open(output_file_name, 'w') { |f| f.write(output) }
10
+ end
11
+
12
+ def resource_list
13
+ @ig_metadata.groups.map(&:resource).uniq
14
+ end
15
+
16
+ def resource_list_string
17
+ resource_list.map { |resource| " '#{resource}'" }.join(",\n")
18
+ end
19
+
20
+ def read_interaction(group_metadata)
21
+ group_metadata.interactions.find { |interaction| interaction[:code] == 'read' }
22
+ end
23
+
24
+ def template
25
+ @template ||= File.read(File.join(__dir__, 'templates', 'resource_list.rb.erb'))
26
+ end
27
+
28
+ def output
29
+ @output ||= ERB.new(template).result(binding)
30
+ end
31
+
32
+ def base_output_file_name
33
+ "resource_list.rb"
34
+ end
35
+
36
+ def output_file_directory
37
+ File.join(__dir__, '..', 'generated')
38
+ end
39
+
40
+ def output_file_name
41
+ File.join(output_file_directory, base_output_file_name)
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,181 @@
1
+ module IpaTestKit
2
+ class Generator
3
+ class SearchDefinitionMetadataExtractor
4
+ attr_accessor :ig_resources, :name, :resource, :profile_elements
5
+
6
+ def initialize(name, ig_resources, resource, profile_elements)
7
+ self.name = name
8
+ self.ig_resources = ig_resources
9
+ self.resource = resource
10
+ self.profile_elements = profile_elements
11
+ end
12
+
13
+ def search_definition
14
+ @search_definition ||=
15
+ {
16
+ path: path,
17
+ full_path: full_path,
18
+ comparators: comparators,
19
+ values: values,
20
+ type: type,
21
+ contains_multiple: contains_multiple?,
22
+ multiple_or: multiple_or_expectation,
23
+ chain: chain
24
+ }.compact
25
+ end
26
+
27
+ def param
28
+ @param ||= ig_resources.search_param_by_resource_and_name(resource, name)
29
+ end
30
+
31
+ def param_hash
32
+ param.source_hash
33
+ end
34
+
35
+ def full_path
36
+ @full_path ||=
37
+ begin
38
+ path = param.expression.gsub(/.where\((.*)/, '')
39
+ path = path[1..-2] if path.start_with?('(') && path.end_with?(')')
40
+ as_type = path.scan(/[. ]as[( ]([^)]*)[)]?/).flatten.first
41
+ path.gsub!(/[. ]as[( ]([^)]*)[)]?/, as_type.upcase_first) if as_type.present?
42
+ path
43
+ end
44
+ end
45
+
46
+ def path
47
+ @path ||= full_path.gsub("#{resource}.", '')
48
+ end
49
+
50
+ def profile_element
51
+ @profile_element ||=
52
+ profile_elements.find { |element| element.id == full_path }
53
+ end
54
+
55
+ def comparator_expectation_extensions
56
+ @comparator_expectation_extensions ||= param_hash['_comparator'] || []
57
+ end
58
+
59
+ def support_expectation(extension)
60
+ extension['extension'].first['valueCode']
61
+ end
62
+
63
+ def comparator_expectation(extension)
64
+ if extension.nil?
65
+ 'MAY'
66
+ else
67
+ support_expectation(extension)
68
+ end
69
+ end
70
+
71
+ def comparators
72
+ {}.tap do |comparators|
73
+ param.comparator&.each_with_index do |comparator, index|
74
+ comparators[comparator.to_sym] = comparator_expectation(comparator_expectation_extensions[index])
75
+ end
76
+ end
77
+ end
78
+
79
+ def type
80
+ if profile_element.present?
81
+ profile_element.type.first.code
82
+ else
83
+ # search is a variable type, eg. Condition.onsetDateTime - element
84
+ # in profile def is Condition.onset[x]
85
+ param.type
86
+ end
87
+ end
88
+
89
+ def contains_multiple?
90
+ profile_element&.max == '*'
91
+ end
92
+
93
+ def chain_extensions
94
+ param_hash['_chain']
95
+ end
96
+
97
+ def chain_expectations
98
+ chain_extensions.map { |extension| support_expectation(extension) }
99
+ end
100
+
101
+ def chain
102
+ return nil if param.chain.blank?
103
+
104
+ param.chain
105
+ .zip(chain_expectations)
106
+ .map { |chain, expectation| { chain: chain, expectation: expectation } }
107
+ end
108
+
109
+ def multiple_or_expectation
110
+ param_hash['_multipleOr']['extension'].first['valueCode']
111
+ end
112
+
113
+ def values
114
+ (
115
+ values_from_slices +
116
+ values_from_fixed_codes +
117
+ values_from_pattern_codeable_concept +
118
+ values_from_value_set_binding
119
+ ).uniq.presence || values_from_resource_metadata
120
+ end
121
+
122
+ def slices
123
+ return [] unless contains_multiple?
124
+
125
+ profile_elements.select do |element|
126
+ element.path == full_path &&
127
+ element.sliceName.present? &&
128
+ element.patternCodeableConcept.present?
129
+ end
130
+ end
131
+
132
+ def values_from_slices
133
+ slices.map do |slice|
134
+ slice.patternCodeableConcept.coding.first.code
135
+ end
136
+ end
137
+
138
+ def values_from_fixed_codes
139
+ return [] unless type == 'CodeableConcept'
140
+
141
+ profile_elements
142
+ .select { |element| element.path == "#{profile_element.path}.coding.code" && element.fixedCode.present? }
143
+ .map { |element| element.fixedCode }
144
+ end
145
+
146
+ def values_from_pattern_codeable_concept
147
+ return [] if type != 'CodeableConcept' || profile_element.patternCodeableConcept.blank?
148
+
149
+ [profile_element.patternCodeableConcept.coding.first.code]
150
+ end
151
+
152
+ def value_set_binding
153
+ profile_element&.binding
154
+ end
155
+
156
+ def value_set
157
+ ig_resources.value_set_by_url(value_set_binding&.valueSet)
158
+ end
159
+
160
+ def bound_systems
161
+ value_set&.compose&.include&.reject { |code| code.concept.nil? }
162
+ end
163
+
164
+ def values_from_value_set_binding
165
+ return [] if bound_systems.blank?
166
+
167
+ bound_systems.flat_map { |system| system.concept.map { |code| code.code } }.uniq
168
+ end
169
+
170
+ def fhir_metadata
171
+ FHIR.const_get(resource)::METADATA[path.gsub("#{resource}.", '')]
172
+ end
173
+
174
+ def values_from_resource_metadata
175
+ return [] if fhir_metadata&.dig('valid_codes').blank?
176
+
177
+ fhir_metadata['valid_codes'].values.flatten
178
+ end
179
+ end
180
+ end
181
+ end
@@ -0,0 +1,74 @@
1
+ require_relative 'search_definition_metadata_extractor'
2
+
3
+ module IpaTestKit
4
+ class Generator
5
+ class SearchMetadataExtractor
6
+ COMBO_EXTENSION_URL =
7
+ 'http://hl7.org/fhir/StructureDefinition/capabilitystatement-search-parameter-combination'.freeze
8
+
9
+ attr_accessor :resource_capabilities, :ig_resources, :resource, :profile_elements
10
+
11
+ def initialize(resource_capabilities, ig_resources, resource, profile_elements)
12
+ self.resource_capabilities = resource_capabilities
13
+ self.ig_resources = ig_resources
14
+ self.resource = resource
15
+ self.profile_elements = profile_elements
16
+ end
17
+
18
+ def searches
19
+ @searches ||= basic_searches + combo_searches
20
+ end
21
+
22
+ def conformance_expectation(search_param)
23
+ search_param.extension.first.valueCode # TODO: fix expectation extension finding
24
+ end
25
+
26
+ def no_search_params?
27
+ resource_capabilities.searchParam.blank?
28
+ end
29
+
30
+ def basic_searches
31
+ return [] if no_search_params?
32
+
33
+ resource_capabilities.searchParam
34
+ .select { |search_param| ['SHALL', 'SHOULD'].include? conformance_expectation(search_param) }
35
+ .map do |search_param|
36
+ {
37
+ names: [search_param.name],
38
+ expectation: conformance_expectation(search_param)
39
+ }
40
+ end
41
+ end
42
+
43
+ def search_extensions
44
+ resource_capabilities.extension
45
+ end
46
+
47
+ def combo_searches
48
+ return [] if search_extensions.blank?
49
+
50
+ search_extensions
51
+ .select { |extension| extension.url == COMBO_EXTENSION_URL }
52
+ .select { |extension| ['SHALL', 'SHOULD'].include? conformance_expectation(extension) }
53
+ .map do |extension|
54
+ names = extension.extension.select { |param| param.valueString.present? }.map(&:valueString)
55
+ {
56
+ expectation: conformance_expectation(extension),
57
+ names: names
58
+ }
59
+ end
60
+ end
61
+
62
+ def search_param_names
63
+ searches.flat_map { |search| search[:names] }.uniq
64
+ end
65
+
66
+ def search_definitions
67
+ search_param_names.each_with_object({}) do |name, definitions|
68
+ definitions[name.to_sym] =
69
+ SearchDefinitionMetadataExtractor.new(name, ig_resources, resource, profile_elements).search_definition
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,295 @@
1
+ require_relative 'naming'
2
+ require_relative 'special_cases'
3
+
4
+ module IpaTestKit
5
+ class Generator
6
+ class SearchTestGenerator
7
+ class << self
8
+ def generate(ig_metadata)
9
+ ig_metadata.groups
10
+ .reject { |group| SpecialCases.exclude_resource? group.resource }
11
+ .select { |group| group.searches.present? }
12
+ .each do |group|
13
+ group.searches.each { |search| new(group, search).generate }
14
+ end
15
+ end
16
+ end
17
+
18
+ attr_accessor :group_metadata, :search_metadata
19
+
20
+ def initialize(group_metadata, search_metadata)
21
+ self.group_metadata = group_metadata
22
+ self.search_metadata = search_metadata
23
+ end
24
+
25
+ def template
26
+ @template ||= File.read(File.join(__dir__, 'templates', 'search.rb.erb'))
27
+ end
28
+
29
+ def output
30
+ @output ||= ERB.new(template).result(binding)
31
+ end
32
+
33
+ def base_output_file_name
34
+ "#{class_name.underscore}.rb"
35
+ end
36
+
37
+ def output_file_directory
38
+ File.join(__dir__, '..', 'generated', profile_identifier)
39
+ end
40
+
41
+ def output_file_name
42
+ File.join(output_file_directory, base_output_file_name)
43
+ end
44
+
45
+ def profile_identifier
46
+ Naming.snake_case_for_profile(group_metadata)
47
+ end
48
+
49
+ def test_id
50
+ "ipa_010_#{profile_identifier}_#{search_identifier}_search_test"
51
+ end
52
+
53
+ def search_identifier
54
+ search_metadata[:names].join('_').tr('-', '_')
55
+ end
56
+
57
+ def search_title
58
+ search_identifier.camelize
59
+ end
60
+
61
+ def class_name
62
+ "#{Naming.upper_camel_case_for_profile(group_metadata)}#{search_title}SearchTest"
63
+ end
64
+
65
+ def resource_type
66
+ group_metadata.resource
67
+ end
68
+
69
+ def conformance_expectation
70
+ search_metadata[:expectation]
71
+ end
72
+
73
+ def search_params
74
+ @search_params ||=
75
+ search_metadata[:names].map do |name|
76
+ {
77
+ name: name,
78
+ path: search_definition(name)[:path]
79
+ }
80
+ end
81
+ end
82
+
83
+ def first_search?
84
+ group_metadata.searches.first == search_metadata
85
+ end
86
+
87
+ def fixed_value_search?
88
+ first_search? && search_metadata[:names] != ['patient'] &&
89
+ !group_metadata.delayed? && resource_type != 'Patient'
90
+ end
91
+
92
+ def fixed_value_search_param_name
93
+ (search_metadata[:names] - [:patient]).first
94
+ end
95
+
96
+ def search_param_name_string
97
+ search_metadata[:names].join(' + ')
98
+ end
99
+
100
+ def needs_patient_id?
101
+ search_metadata[:names].include?('patient') ||
102
+ (resource_type == 'Patient' && search_metadata[:names].include?('_id'))
103
+ end
104
+
105
+ def search_param_names
106
+ search_params.map { |param| param[:name] }
107
+ end
108
+
109
+ def search_param_names_array
110
+ array_of_strings(search_param_names)
111
+ end
112
+
113
+ def path_for_value(path)
114
+ path == 'class' ? 'local_class' : path
115
+ end
116
+
117
+ def required_comparators_for_param(name)
118
+ search_definition(name)[:comparators].select { |_comparator, expectation| expectation == 'SHALL' }
119
+ end
120
+
121
+ def required_comparators
122
+ @required_comparators ||=
123
+ search_param_names.each_with_object({}) do |name, comparators|
124
+ required_comparators = required_comparators_for_param(name)
125
+ comparators[name] = required_comparators if required_comparators.present?
126
+ end
127
+ end
128
+
129
+ def optional?
130
+ conformance_expectation != 'SHALL' || !search_metadata[:must_support_or_mandatory]
131
+ end
132
+
133
+ def search_definition(name)
134
+ group_metadata.search_definitions[name.to_sym]
135
+ end
136
+
137
+ def saves_delayed_references?
138
+ first_search? && group_metadata.delayed_references.present?
139
+ end
140
+
141
+ def possible_status_search?
142
+ !search_metadata[:names].any? { |name| name.include? 'status' } &&
143
+ group_metadata.search_definitions.keys.any? { |key| key.to_s.include? 'status' }
144
+ end
145
+
146
+ def token_search_params
147
+ @token_search_params ||=
148
+ search_param_names.select do |name|
149
+ ['Identifier', 'CodeableConcept', 'Coding'].include? group_metadata.search_definitions[name.to_sym][:type]
150
+ end
151
+ end
152
+
153
+ def token_search_params_string
154
+ array_of_strings(token_search_params)
155
+ end
156
+
157
+ def required_multiple_or_search_params
158
+ @multiple_or_search_params ||=
159
+ search_param_names.select do |name|
160
+ search_definition(name)[:multiple_or] == 'SHALL'
161
+ end
162
+ end
163
+
164
+ def required_multiple_or_search_params_string
165
+ array_of_strings(required_multiple_or_search_params)
166
+ end
167
+
168
+ def required_comparators_string
169
+ array_of_strings(required_comparators.keys)
170
+ end
171
+
172
+ def array_of_strings(array)
173
+ quoted_strings = array.map { |element| "'#{element}'" }
174
+ "[#{quoted_strings.join(', ')}]"
175
+ end
176
+
177
+ def test_reference_variants?
178
+ first_search? && search_param_names.include?('patient')
179
+ end
180
+
181
+ def test_medication_inclusion_mr?
182
+ resource_type == 'MedicationRequest'
183
+ end
184
+
185
+ def test_medication_inclusion_ms?
186
+ resource_type == 'MedicationStatement'
187
+ end
188
+
189
+ def test_post_search?
190
+ first_search?
191
+ end
192
+
193
+ def search_properties
194
+ {}.tap do |properties|
195
+ properties[:first_search] = 'true' if first_search?
196
+ properties[:fixed_value_search] = 'true' if fixed_value_search?
197
+ properties[:resource_type] = "'#{resource_type}'"
198
+ properties[:search_param_names] = search_param_names_array
199
+ properties[:saves_delayed_references] = 'true' if saves_delayed_references?
200
+ properties[:possible_status_search] = 'true' if possible_status_search?
201
+ properties[:test_medication_inclusion_mr] = 'true' if test_medication_inclusion_mr?
202
+ properties[:test_medication_inclusion_ms] = 'true' if test_medication_inclusion_ms?
203
+ properties[:token_search_params] = token_search_params_string if token_search_params.present?
204
+ properties[:test_reference_variants] = 'true' if test_reference_variants?
205
+ properties[:params_with_comparators] = required_comparators_string if required_comparators.present?
206
+ properties[:multiple_or_search_params] = required_multiple_or_search_params_string if required_multiple_or_search_params.present?
207
+ properties[:test_post_search] = 'true' if first_search?
208
+ end
209
+ end
210
+
211
+ def search_test_properties_string
212
+ search_properties
213
+ .map { |key, value| "#{' ' * 8}#{key}: #{value}" }
214
+ .join(",\n")
215
+ end
216
+
217
+ def generate
218
+ FileUtils.mkdir_p(output_file_directory)
219
+ File.open(output_file_name, 'w') { |f| f.write(output) }
220
+
221
+ group_metadata.add_test(
222
+ id: test_id,
223
+ file_name: base_output_file_name
224
+ )
225
+ end
226
+
227
+ def reference_search_description
228
+ return '' unless test_reference_variants?
229
+
230
+ <<~REFERENCE_SEARCH_DESCRIPTION
231
+ This test verifies that the server supports searching by reference using
232
+ the form `patient=[id]` as well as `patient=Patient/[id]`. The two
233
+ different forms are expected to return the same number of results. IPA
234
+ requires that both forms are supported by IPA responders.
235
+ REFERENCE_SEARCH_DESCRIPTION
236
+ end
237
+
238
+ def first_search_description
239
+ return '' unless first_search?
240
+
241
+ <<~FIRST_SEARCH_DESCRIPTION
242
+ Because this is the first search of the sequence, resources in the
243
+ response will be used for subsequent tests.
244
+ FIRST_SEARCH_DESCRIPTION
245
+ end
246
+
247
+ def medication_inclusion_mr_description
248
+ return '' unless test_medication_inclusion_mr?
249
+
250
+ <<~MEDICATION_INCLUSION_MR_DESCRIPTION
251
+ If any MedicationRequest resources use external references to
252
+ Medications, the search will be repeated with
253
+ `_include=MedicationRequest:medication`.
254
+ MEDICATION_INCLUSION_MR_DESCRIPTION
255
+ end
256
+
257
+ def medication_inclusion_ms_description
258
+ return '' unless test_medication_inclusion_ms?
259
+
260
+ <<~MEDICATION_INCLUSION_MS_DESCRIPTION
261
+ If any MedicationStatement resources use external references to
262
+ Medications, the search will be repeated with
263
+ `_include=MedicationStatement:medication`.
264
+ MEDICATION_INCLUSION_MS_DESCRIPTION
265
+ end
266
+
267
+ def post_search_description
268
+ return '' unless test_post_search?
269
+
270
+ <<~POST_SEARCH_DESCRIPTION
271
+ Additionally, this test will check that GET and POST search methods
272
+ return the same number of results. Search by POST is required by the
273
+ FHIR R4 specification, and these tests interpret search by GET as a
274
+ requirement of IPA v0.1.0.
275
+ POST_SEARCH_DESCRIPTION
276
+ end
277
+
278
+ def description
279
+ <<~DESCRIPTION.gsub(/\n{3,}/, "\n\n")
280
+ A server #{conformance_expectation} support searching by
281
+ #{search_param_name_string} on the #{resource_type} resource. This test
282
+ will pass if resources are returned and match the search criteria. If
283
+ none are returned, the test is skipped.
284
+
285
+ #{medication_inclusion_description}
286
+ #{reference_search_description}
287
+ #{first_search_description}
288
+ #{post_search_description}
289
+
290
+ [IPA Server CapabilityStatement](https://build.fhir.org/ig/HL7/fhir-ipa/CapabilityStatement-ipa-server.html)
291
+ DESCRIPTION
292
+ end
293
+ end
294
+ end
295
+ end
@@ -0,0 +1,16 @@
1
+ module IpaTestKit
2
+ class Generator
3
+ module SpecialCases
4
+ RESOURCES_TO_EXCLUDE = [
5
+ 'Medication',
6
+ #'PractitionerRole'
7
+ ].freeze
8
+
9
+ class << self
10
+ def exclude_resource?(resource)
11
+ RESOURCES_TO_EXCLUDE.include? resource
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,67 @@
1
+ require_relative 'naming'
2
+ require_relative 'special_cases'
3
+
4
+ module IpaTestKit
5
+ class Generator
6
+ class SuiteGenerator
7
+ class << self
8
+ def generate(ig_metadata)
9
+ new(ig_metadata).generate
10
+ end
11
+ end
12
+
13
+ attr_accessor :ig_metadata
14
+
15
+ def initialize(ig_metadata)
16
+ self.ig_metadata = ig_metadata
17
+ end
18
+
19
+ def template
20
+ @template ||= File.read(File.join(__dir__, 'templates', 'suite.rb.erb'))
21
+ end
22
+
23
+ def output
24
+ @output ||= ERB.new(template).result(binding)
25
+ end
26
+
27
+ def base_output_file_name
28
+ "ipa_test_suite.rb"
29
+ end
30
+
31
+ def class_name
32
+ "IpaTestSuite"
33
+ end
34
+
35
+ def output_file_name
36
+ File.join(__dir__, '..', 'generated', base_output_file_name)
37
+ end
38
+
39
+ def suite_id
40
+ 'ipa_010'
41
+ end
42
+
43
+ def title
44
+ 'IPA 3.1.1'
45
+ end
46
+
47
+ def generate
48
+ File.open(output_file_name, 'w') { |f| f.write(output) }
49
+ end
50
+
51
+ def groups
52
+ ig_metadata.ordered_groups
53
+ .reject { |group| SpecialCases.exclude_resource? group.resource }
54
+ end
55
+
56
+ def group_id_list
57
+ @group_id_list ||=
58
+ groups.map(&:id)
59
+ end
60
+
61
+ def group_file_list
62
+ @group_file_list ||=
63
+ groups.map { |group| group.file_name.delete_suffix('.rb') }
64
+ end
65
+ end
66
+ end
67
+ end