ecoportal-api-graphql 2.0.0 → 2.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 (355) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +363 -1
  3. data/LICENSE +21 -21
  4. data/README.md +24 -24
  5. data/lib/ecoportal/api/common/graphql/auth_service.rb +115 -115
  6. data/lib/ecoportal/api/common/graphql/class_helpers.rb +46 -46
  7. data/lib/ecoportal/api/common/graphql/client.rb +69 -69
  8. data/lib/ecoportal/api/common/graphql/hash_helpers.rb +105 -105
  9. data/lib/ecoportal/api/common/graphql/http_client.rb +85 -2
  10. data/lib/ecoportal/api/common/graphql/model/as_input.rb +54 -54
  11. data/lib/ecoportal/api/common/graphql/model/diffable/classic_diff_service.rb +49 -49
  12. data/lib/ecoportal/api/common/graphql/model/diffable/diff_service.rb +188 -188
  13. data/lib/ecoportal/api/common/graphql/model/diffable/hash_diff.rb +55 -55
  14. data/lib/ecoportal/api/common/graphql/model/diffable/hash_diff_nesting.rb +295 -295
  15. data/lib/ecoportal/api/common/graphql/model.rb +17 -17
  16. data/lib/ecoportal/api/common/graphql/patches.rb +1 -1
  17. data/lib/ecoportal/api/common/graphql/query_integration.rb +45 -45
  18. data/lib/ecoportal/api/common/graphql.rb +16 -16
  19. data/lib/ecoportal/api/common.graphql.rb +8 -8
  20. data/lib/ecoportal/api/graphql/base/action_category.rb +15 -15
  21. data/lib/ecoportal/api/graphql/base/ai_summary_version.rb +1 -1
  22. data/lib/ecoportal/api/graphql/base/contractor_entity.rb +24 -24
  23. data/lib/ecoportal/api/graphql/base/date_time.rb +12 -12
  24. data/lib/ecoportal/api/graphql/base/delta_result.rb +16 -16
  25. data/lib/ecoportal/api/graphql/base/field.rb +12 -12
  26. data/lib/ecoportal/api/graphql/base/file_attachment.rb +15 -15
  27. data/lib/ecoportal/api/graphql/base/location_node.rb +14 -14
  28. data/lib/ecoportal/api/graphql/base/location_structure/draft/structure.rb +37 -37
  29. data/lib/ecoportal/api/graphql/base/location_structure/draft.rb +93 -93
  30. data/lib/ecoportal/api/graphql/base/page/data_field/actions_list.rb +9 -9
  31. data/lib/ecoportal/api/graphql/base/page/data_field/ai_summary.rb +18 -18
  32. data/lib/ecoportal/api/graphql/base/page/data_field/checklist.rb +29 -29
  33. data/lib/ecoportal/api/graphql/base/page/data_field/cross_reference.rb +1 -1
  34. data/lib/ecoportal/api/graphql/base/page/data_field/date_field.rb +23 -23
  35. data/lib/ecoportal/api/graphql/base/page/data_field/geo.rb +24 -24
  36. data/lib/ecoportal/api/graphql/base/page/data_field/image_gallery.rb +1 -1
  37. data/lib/ecoportal/api/graphql/base/page/data_field/law.rb +8 -8
  38. data/lib/ecoportal/api/graphql/base/page/data_field/mailbox.rb +9 -9
  39. data/lib/ecoportal/api/graphql/base/page/data_field/plain_text.rb +17 -17
  40. data/lib/ecoportal/api/graphql/base/page/data_field/rich_text.rb +26 -26
  41. data/lib/ecoportal/api/graphql/base/page/data_field/signature.rb +9 -9
  42. data/lib/ecoportal/api/graphql/base/page/data_field/smart_fill.rb +17 -17
  43. data/lib/ecoportal/api/graphql/base/page/data_field/table.rb +9 -9
  44. data/lib/ecoportal/api/graphql/base/page/data_field/tag_field.rb +21 -21
  45. data/lib/ecoportal/api/graphql/base/page/phased/stage.rb +51 -0
  46. data/lib/ecoportal/api/graphql/base/page/phased.rb +15 -15
  47. data/lib/ecoportal/api/graphql/base/page/section.rb +48 -48
  48. data/lib/ecoportal/api/graphql/base/page_info.rb +12 -12
  49. data/lib/ecoportal/api/graphql/base/pages_workflow/operation_interface.rb +39 -39
  50. data/lib/ecoportal/api/graphql/base/pages_workflow/operations/assign_to.rb +27 -27
  51. data/lib/ecoportal/api/graphql/base/pages_workflow/operations/send_notification.rb +30 -30
  52. data/lib/ecoportal/api/graphql/base/pages_workflow/recipient_config.rb +34 -34
  53. data/lib/ecoportal/api/graphql/base/pages_workflow.rb +35 -35
  54. data/lib/ecoportal/api/graphql/base/person_member.rb +22 -22
  55. data/lib/ecoportal/api/graphql/base/preview_page.rb +23 -23
  56. data/lib/ecoportal/api/graphql/base/register.rb +1 -1
  57. data/lib/ecoportal/api/graphql/base/resource.rb +13 -13
  58. data/lib/ecoportal/api/graphql/base/template/change_log_entry.rb +118 -0
  59. data/lib/ecoportal/api/graphql/base/template.rb +2 -0
  60. data/lib/ecoportal/api/graphql/builder/action.rb +41 -41
  61. data/lib/ecoportal/api/graphql/builder/location_structure/draft.rb +64 -64
  62. data/lib/ecoportal/api/graphql/builder/location_structure.rb +40 -40
  63. data/lib/ecoportal/api/graphql/builder/register/preset_view.rb +84 -84
  64. data/lib/ecoportal/api/graphql/builder/register.rb +49 -49
  65. data/lib/ecoportal/api/graphql/builder/template.rb +28 -0
  66. data/lib/ecoportal/api/graphql/builder/template_builder.rb +21 -2
  67. data/lib/ecoportal/api/graphql/compat/page_reference.rb +23 -23
  68. data/lib/ecoportal/api/graphql/compat/registers.rb +84 -84
  69. data/lib/ecoportal/api/graphql/compat/search_results.rb +33 -33
  70. data/lib/ecoportal/api/graphql/compat.rb +17 -17
  71. data/lib/ecoportal/api/graphql/concerns/data_field_access.rb +71 -71
  72. data/lib/ecoportal/api/graphql/concerns/fragment_definitions.rb +68 -68
  73. data/lib/ecoportal/api/graphql/concerns/snake_camel_access.rb +60 -60
  74. data/lib/ecoportal/api/graphql/connection/preset_view.rb +11 -11
  75. data/lib/ecoportal/api/graphql/connection/template_change_log.rb +19 -0
  76. data/lib/ecoportal/api/graphql/connection.rb +1 -0
  77. data/lib/ecoportal/api/graphql/diff/change.rb +7 -2
  78. data/lib/ecoportal/api/graphql/diff/command_synthesizer.rb +19 -1
  79. data/lib/ecoportal/api/graphql/diff/version_diff.rb +13 -6
  80. data/lib/ecoportal/api/graphql/error/locations_error/fetch_nested.rb +51 -51
  81. data/lib/ecoportal/api/graphql/error/locations_error.rb +28 -28
  82. data/lib/ecoportal/api/graphql/error/locations_validation_error.rb +20 -20
  83. data/lib/ecoportal/api/graphql/error/validation_errors.rb +28 -28
  84. data/lib/ecoportal/api/graphql/error.rb +12 -12
  85. data/lib/ecoportal/api/graphql/file_upload.rb +10 -10
  86. data/lib/ecoportal/api/graphql/fragment/action.rb +65 -65
  87. data/lib/ecoportal/api/graphql/fragment/action_category.rb +17 -17
  88. data/lib/ecoportal/api/graphql/fragment/contractor_entity.rb +20 -20
  89. data/lib/ecoportal/api/graphql/fragment/locations_error.rb +19 -19
  90. data/lib/ecoportal/api/graphql/fragment/page.rb +1 -0
  91. data/lib/ecoportal/api/graphql/fragment/pages/common_page_union.rb +2 -0
  92. data/lib/ecoportal/api/graphql/fragment/pages.rb +15 -15
  93. data/lib/ecoportal/api/graphql/fragment/pagination.rb +17 -17
  94. data/lib/ecoportal/api/graphql/fragment/template_change_log.rb +102 -0
  95. data/lib/ecoportal/api/graphql/fragment.rb +1 -0
  96. data/lib/ecoportal/api/graphql/helpers/locations_tree.rb +41 -41
  97. data/lib/ecoportal/api/graphql/helpers.rb +10 -10
  98. data/lib/ecoportal/api/graphql/input/action/archive.rb +14 -14
  99. data/lib/ecoportal/api/graphql/input/action/create.rb +13 -13
  100. data/lib/ecoportal/api/graphql/input/action.rb +14 -14
  101. data/lib/ecoportal/api/graphql/input/contractor_entity/create.rb +14 -14
  102. data/lib/ecoportal/api/graphql/input/contractor_entity/destroy.rb +13 -13
  103. data/lib/ecoportal/api/graphql/input/delta_input.rb +16 -16
  104. data/lib/ecoportal/api/graphql/input/id_diff.rb +11 -11
  105. data/lib/ecoportal/api/graphql/input/location_structure/archive_command.rb +13 -13
  106. data/lib/ecoportal/api/graphql/input/location_structure/delete_command.rb +13 -13
  107. data/lib/ecoportal/api/graphql/input/location_structure/draft/create.rb +15 -15
  108. data/lib/ecoportal/api/graphql/input/location_structure/draft/delete.rb +15 -15
  109. data/lib/ecoportal/api/graphql/input/location_structure/draft/drop_bad_commands.rb +16 -16
  110. data/lib/ecoportal/api/graphql/input/location_structure/draft/publish.rb +16 -16
  111. data/lib/ecoportal/api/graphql/input/location_structure/draft.rb +19 -19
  112. data/lib/ecoportal/api/graphql/input/location_structure/insert_command.rb +21 -13
  113. data/lib/ecoportal/api/graphql/input/location_structure/move_command.rb +14 -14
  114. data/lib/ecoportal/api/graphql/input/location_structure/reorder_command.rb +13 -13
  115. data/lib/ecoportal/api/graphql/input/location_structure/unarchive_command.rb +13 -13
  116. data/lib/ecoportal/api/graphql/input/location_structure.rb +20 -20
  117. data/lib/ecoportal/api/graphql/input/page/archive.rb +14 -14
  118. data/lib/ecoportal/api/graphql/input/page/build_from_template.rb +13 -13
  119. data/lib/ecoportal/api/graphql/input/page/create_draft.rb +13 -13
  120. data/lib/ecoportal/api/graphql/input/page/create_from_template.rb +18 -18
  121. data/lib/ecoportal/api/graphql/input/page/delete_draft.rb +13 -13
  122. data/lib/ecoportal/api/graphql/input/page/publish_draft.rb +13 -13
  123. data/lib/ecoportal/api/graphql/input/page/review_task.rb +27 -14
  124. data/lib/ecoportal/api/graphql/input/page/unarchive.rb +14 -14
  125. data/lib/ecoportal/api/graphql/input/page.rb +26 -26
  126. data/lib/ecoportal/api/graphql/input/preset_view/create.rb +18 -18
  127. data/lib/ecoportal/api/graphql/input/preset_view/permission.rb +16 -16
  128. data/lib/ecoportal/api/graphql/input/preset_view/update.rb +1 -1
  129. data/lib/ecoportal/api/graphql/input/preset_view.rb +14 -14
  130. data/lib/ecoportal/api/graphql/input/register/create.rb +18 -18
  131. data/lib/ecoportal/api/graphql/input/register/update.rb +15 -15
  132. data/lib/ecoportal/api/graphql/input/register.rb +13 -13
  133. data/lib/ecoportal/api/graphql/input/search.rb +13 -13
  134. data/lib/ecoportal/api/graphql/input/search_conf/ai_generator.rb +234 -234
  135. data/lib/ecoportal/api/graphql/input/search_filter.rb +12 -12
  136. data/lib/ecoportal/api/graphql/input/search_sorter.rb +11 -11
  137. data/lib/ecoportal/api/graphql/input/workflow_command/add_action_tag.rb +18 -18
  138. data/lib/ecoportal/api/graphql/input/workflow_command/add_binding.rb +18 -18
  139. data/lib/ecoportal/api/graphql/input/workflow_command/add_comment_tagging_user_group.rb +18 -18
  140. data/lib/ecoportal/api/graphql/input/workflow_command/add_default_direct_strategy_user.rb +18 -18
  141. data/lib/ecoportal/api/graphql/input/workflow_command/add_default_strategy.rb +18 -18
  142. data/lib/ecoportal/api/graphql/input/workflow_command/add_direct_strategy_user.rb +18 -18
  143. data/lib/ecoportal/api/graphql/input/workflow_command/add_field.rb +10 -9
  144. data/lib/ecoportal/api/graphql/input/workflow_command/add_force.rb +18 -18
  145. data/lib/ecoportal/api/graphql/input/workflow_command/add_linked_field_config.rb +23 -23
  146. data/lib/ecoportal/api/graphql/input/workflow_command/add_linked_helper.rb +18 -18
  147. data/lib/ecoportal/api/graphql/input/workflow_command/add_operation.rb +18 -18
  148. data/lib/ecoportal/api/graphql/input/workflow_command/add_operation_direct_strategy_user.rb +18 -18
  149. data/lib/ecoportal/api/graphql/input/workflow_command/add_operation_strategy.rb +18 -18
  150. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_action_type.rb +18 -18
  151. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_filter.rb +18 -18
  152. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_people_field.rb +18 -18
  153. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_task_config.rb +18 -18
  154. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_user.rb +18 -18
  155. data/lib/ecoportal/api/graphql/input/workflow_command/add_scheduled_callback.rb +23 -23
  156. data/lib/ecoportal/api/graphql/input/workflow_command/add_scheduled_callback_action.rb +18 -18
  157. data/lib/ecoportal/api/graphql/input/workflow_command/add_section.rb +18 -18
  158. data/lib/ecoportal/api/graphql/input/workflow_command/add_select_field_option.rb +25 -19
  159. data/lib/ecoportal/api/graphql/input/workflow_command/add_stage_section.rb +18 -18
  160. data/lib/ecoportal/api/graphql/input/workflow_command/add_stage_tag.rb +18 -18
  161. data/lib/ecoportal/api/graphql/input/workflow_command/add_strategy.rb +18 -18
  162. data/lib/ecoportal/api/graphql/input/workflow_command/add_task.rb +18 -18
  163. data/lib/ecoportal/api/graphql/input/workflow_command/add_task_assignment_user_group.rb +18 -18
  164. data/lib/ecoportal/api/graphql/input/workflow_command/add_workflow_callback.rb +18 -18
  165. data/lib/ecoportal/api/graphql/input/workflow_command/collapse_section.rb +18 -18
  166. data/lib/ecoportal/api/graphql/input/workflow_command/edit_binding.rb +18 -18
  167. data/lib/ecoportal/api/graphql/input/workflow_command/edit_creator_permissions.rb +18 -18
  168. data/lib/ecoportal/api/graphql/input/workflow_command/edit_default_strategy.rb +18 -18
  169. data/lib/ecoportal/api/graphql/input/workflow_command/edit_field_configuration.rb +7 -2
  170. data/lib/ecoportal/api/graphql/input/workflow_command/edit_force.rb +21 -18
  171. data/lib/ecoportal/api/graphql/input/workflow_command/edit_gauge_field_stop.rb +19 -19
  172. data/lib/ecoportal/api/graphql/input/workflow_command/edit_linked_field_config.rb +19 -19
  173. data/lib/ecoportal/api/graphql/input/workflow_command/edit_linked_helper.rb +18 -18
  174. data/lib/ecoportal/api/graphql/input/workflow_command/edit_operation.rb +18 -18
  175. data/lib/ecoportal/api/graphql/input/workflow_command/edit_operation_strategy.rb +18 -18
  176. data/lib/ecoportal/api/graphql/input/workflow_command/edit_reminder.rb +18 -18
  177. data/lib/ecoportal/api/graphql/input/workflow_command/edit_required_sign_offs.rb +18 -18
  178. data/lib/ecoportal/api/graphql/input/workflow_command/edit_restrict_comment_tagging.rb +18 -18
  179. data/lib/ecoportal/api/graphql/input/workflow_command/edit_restrict_task_assignment.rb +18 -18
  180. data/lib/ecoportal/api/graphql/input/workflow_command/edit_scheduled_callback.rb +22 -22
  181. data/lib/ecoportal/api/graphql/input/workflow_command/edit_section_header.rb +18 -18
  182. data/lib/ecoportal/api/graphql/input/workflow_command/edit_select_field_option.rb +23 -19
  183. data/lib/ecoportal/api/graphql/input/workflow_command/edit_stage.rb +18 -18
  184. data/lib/ecoportal/api/graphql/input/workflow_command/edit_strategy.rb +18 -18
  185. data/lib/ecoportal/api/graphql/input/workflow_command/edit_task_due.rb +18 -18
  186. data/lib/ecoportal/api/graphql/input/workflow_command/edit_template_basic_settings.rb +7 -2
  187. data/lib/ecoportal/api/graphql/input/workflow_command/edit_trigger.rb +18 -18
  188. data/lib/ecoportal/api/graphql/input/workflow_command/expand_section.rb +18 -18
  189. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/contractor_entities.rb +28 -24
  190. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/cross_reference.rb +8 -2
  191. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/gauge.rb +20 -20
  192. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/location_field.rb +24 -24
  193. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/plain_text.rb +8 -2
  194. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/signature.rb +20 -20
  195. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/table.rb +25 -25
  196. data/lib/ecoportal/api/graphql/input/workflow_command/manage_copy_page_configuration.rb +47 -0
  197. data/lib/ecoportal/api/graphql/input/workflow_command/move_stage.rb +18 -18
  198. data/lib/ecoportal/api/graphql/input/workflow_command/remove_action_tag.rb +18 -18
  199. data/lib/ecoportal/api/graphql/input/workflow_command/remove_binding.rb +18 -18
  200. data/lib/ecoportal/api/graphql/input/workflow_command/remove_callback.rb +18 -18
  201. data/lib/ecoportal/api/graphql/input/workflow_command/remove_comment_tagging_user_group.rb +18 -18
  202. data/lib/ecoportal/api/graphql/input/workflow_command/remove_default_direct_strategy_user.rb +18 -18
  203. data/lib/ecoportal/api/graphql/input/workflow_command/remove_default_strategy.rb +18 -18
  204. data/lib/ecoportal/api/graphql/input/workflow_command/remove_direct_strategy_user.rb +18 -18
  205. data/lib/ecoportal/api/graphql/input/workflow_command/remove_field.rb +18 -18
  206. data/lib/ecoportal/api/graphql/input/workflow_command/remove_force.rb +18 -18
  207. data/lib/ecoportal/api/graphql/input/workflow_command/remove_linked_helper.rb +18 -18
  208. data/lib/ecoportal/api/graphql/input/workflow_command/remove_operation.rb +18 -18
  209. data/lib/ecoportal/api/graphql/input/workflow_command/remove_operation_direct_strategy_user.rb +18 -18
  210. data/lib/ecoportal/api/graphql/input/workflow_command/remove_operation_strategy.rb +18 -18
  211. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_action_type.rb +18 -18
  212. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_filter.rb +18 -18
  213. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_people_field.rb +18 -18
  214. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_task_config.rb +18 -18
  215. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_user.rb +18 -18
  216. data/lib/ecoportal/api/graphql/input/workflow_command/remove_scheduled_callback.rb +18 -18
  217. data/lib/ecoportal/api/graphql/input/workflow_command/remove_section.rb +18 -18
  218. data/lib/ecoportal/api/graphql/input/workflow_command/remove_stage.rb +18 -18
  219. data/lib/ecoportal/api/graphql/input/workflow_command/remove_stage_section.rb +18 -18
  220. data/lib/ecoportal/api/graphql/input/workflow_command/remove_stage_tag.rb +18 -18
  221. data/lib/ecoportal/api/graphql/input/workflow_command/remove_strategy.rb +18 -18
  222. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task.rb +18 -18
  223. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task_assignment_user_group.rb +18 -18
  224. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task_due.rb +18 -18
  225. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task_priority_level.rb +18 -18
  226. data/lib/ecoportal/api/graphql/input/workflow_command.rb +3 -0
  227. data/lib/ecoportal/api/graphql/interface/base_page.rb +14 -0
  228. data/lib/ecoportal/api/graphql/interface/location_structure/node.rb +43 -43
  229. data/lib/ecoportal/api/graphql/interface/location_structure.rb +14 -14
  230. data/lib/ecoportal/api/graphql/interface.rb +11 -11
  231. data/lib/ecoportal/api/graphql/logic/base_model.rb +15 -15
  232. data/lib/ecoportal/api/graphql/logic/base_query.rb +260 -193
  233. data/lib/ecoportal/api/graphql/logic/mutation.rb +59 -59
  234. data/lib/ecoportal/api/graphql/logic/payload.rb +42 -42
  235. data/lib/ecoportal/api/graphql/logic/query.rb +23 -23
  236. data/lib/ecoportal/api/graphql/logic/query_array.rb +30 -30
  237. data/lib/ecoportal/api/graphql/logic/query_connection.rb +48 -48
  238. data/lib/ecoportal/api/graphql/logic.rb +18 -18
  239. data/lib/ecoportal/api/graphql/model/account.rb +15 -15
  240. data/lib/ecoportal/api/graphql/model/action.rb +22 -22
  241. data/lib/ecoportal/api/graphql/model/ai_summary_version.rb +10 -10
  242. data/lib/ecoportal/api/graphql/model/contractor_entity.rb +12 -12
  243. data/lib/ecoportal/api/graphql/model/field.rb +10 -10
  244. data/lib/ecoportal/api/graphql/model/file_attachment.rb +10 -10
  245. data/lib/ecoportal/api/graphql/model/file_container.rb +11 -11
  246. data/lib/ecoportal/api/graphql/model/location_node.rb +14 -14
  247. data/lib/ecoportal/api/graphql/model/location_structure/draft/structure.rb +15 -15
  248. data/lib/ecoportal/api/graphql/model/location_structure/draft.rb +15 -15
  249. data/lib/ecoportal/api/graphql/model/location_structure.rb +16 -16
  250. data/lib/ecoportal/api/graphql/model/organization.rb +9 -0
  251. data/lib/ecoportal/api/graphql/model/page/basic.rb +14 -14
  252. data/lib/ecoportal/api/graphql/model/page/data_field.rb +12 -12
  253. data/lib/ecoportal/api/graphql/model/page/phased/stage.rb +14 -14
  254. data/lib/ecoportal/api/graphql/model/page/phased.rb +17 -0
  255. data/lib/ecoportal/api/graphql/model/page/section.rb +12 -12
  256. data/lib/ecoportal/api/graphql/model/page_union.rb +21 -21
  257. data/lib/ecoportal/api/graphql/model/pages_workflow.rb +20 -20
  258. data/lib/ecoportal/api/graphql/model/preset_view.rb +10 -10
  259. data/lib/ecoportal/api/graphql/model/preview_page.rb +10 -10
  260. data/lib/ecoportal/api/graphql/model/register.rb +10 -10
  261. data/lib/ecoportal/api/graphql/model/resource.rb +13 -13
  262. data/lib/ecoportal/api/graphql/model/template/change_log_entry.rb +19 -0
  263. data/lib/ecoportal/api/graphql/model/template.rb +4 -1
  264. data/lib/ecoportal/api/graphql/model/user.rb +14 -14
  265. data/lib/ecoportal/api/graphql/mutation/action/archive.rb +41 -41
  266. data/lib/ecoportal/api/graphql/mutation/action/create.rb +40 -40
  267. data/lib/ecoportal/api/graphql/mutation/action/update.rb +40 -40
  268. data/lib/ecoportal/api/graphql/mutation/action.rb +14 -14
  269. data/lib/ecoportal/api/graphql/mutation/ai_summary/generate.rb +1 -1
  270. data/lib/ecoportal/api/graphql/mutation/ai_summary/submit_feedback.rb +1 -1
  271. data/lib/ecoportal/api/graphql/mutation/ai_summary.rb +13 -13
  272. data/lib/ecoportal/api/graphql/mutation/contractor_entity/create.rb +40 -40
  273. data/lib/ecoportal/api/graphql/mutation/contractor_entity/destroy.rb +40 -40
  274. data/lib/ecoportal/api/graphql/mutation/contractor_entity/update.rb +40 -40
  275. data/lib/ecoportal/api/graphql/mutation/location_structure/apply_commands.rb +54 -54
  276. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/add_commands.rb +55 -55
  277. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/create.rb +54 -54
  278. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/delete.rb +43 -43
  279. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/drop_bad_commands.rb +56 -56
  280. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/publish.rb +66 -66
  281. data/lib/ecoportal/api/graphql/mutation/location_structure/draft.rb +18 -18
  282. data/lib/ecoportal/api/graphql/mutation/location_structure.rb +13 -13
  283. data/lib/ecoportal/api/graphql/mutation/page/approve_review_task.rb +1 -1
  284. data/lib/ecoportal/api/graphql/mutation/page/archive.rb +40 -40
  285. data/lib/ecoportal/api/graphql/mutation/page/batch_update_review_task.rb +1 -1
  286. data/lib/ecoportal/api/graphql/mutation/page/build_from_template.rb +50 -50
  287. data/lib/ecoportal/api/graphql/mutation/page/create_draft.rb +1 -1
  288. data/lib/ecoportal/api/graphql/mutation/page/create_from_template.rb +43 -43
  289. data/lib/ecoportal/api/graphql/mutation/page/delete_draft.rb +1 -1
  290. data/lib/ecoportal/api/graphql/mutation/page/publish_draft.rb +1 -1
  291. data/lib/ecoportal/api/graphql/mutation/page/reject_review_task.rb +1 -1
  292. data/lib/ecoportal/api/graphql/mutation/page/restart_review_task.rb +1 -1
  293. data/lib/ecoportal/api/graphql/mutation/page/unarchive.rb +40 -40
  294. data/lib/ecoportal/api/graphql/mutation/page/undo_review_task.rb +1 -1
  295. data/lib/ecoportal/api/graphql/mutation/page/update.rb +40 -40
  296. data/lib/ecoportal/api/graphql/mutation/page.rb +28 -28
  297. data/lib/ecoportal/api/graphql/mutation/preset_view/create.rb +35 -35
  298. data/lib/ecoportal/api/graphql/mutation/preset_view/destroy.rb +1 -1
  299. data/lib/ecoportal/api/graphql/mutation/preset_view/permission.rb +37 -37
  300. data/lib/ecoportal/api/graphql/mutation/preset_view/update.rb +35 -35
  301. data/lib/ecoportal/api/graphql/mutation/preset_view.rb +15 -15
  302. data/lib/ecoportal/api/graphql/mutation/register/create.rb +35 -35
  303. data/lib/ecoportal/api/graphql/mutation/register/destroy.rb +1 -1
  304. data/lib/ecoportal/api/graphql/mutation/register/update.rb +35 -35
  305. data/lib/ecoportal/api/graphql/mutation/register.rb +14 -14
  306. data/lib/ecoportal/api/graphql/payload/action/archive.rb +13 -13
  307. data/lib/ecoportal/api/graphql/payload/action/create.rb +13 -13
  308. data/lib/ecoportal/api/graphql/payload/action/update.rb +13 -13
  309. data/lib/ecoportal/api/graphql/payload/action.rb +14 -14
  310. data/lib/ecoportal/api/graphql/payload/ai_summary_generate.rb +12 -12
  311. data/lib/ecoportal/api/graphql/payload/contractor_entity/create.rb +13 -13
  312. data/lib/ecoportal/api/graphql/payload/contractor_entity/destroy.rb +12 -12
  313. data/lib/ecoportal/api/graphql/payload/contractor_entity/update.rb +12 -12
  314. data/lib/ecoportal/api/graphql/payload/kickstand/bulk_update_jobs.rb +2 -2
  315. data/lib/ecoportal/api/graphql/payload/kickstand/bulk_update_workflows.rb +2 -2
  316. data/lib/ecoportal/api/graphql/payload/location_structure/apply_commands.rb +51 -51
  317. data/lib/ecoportal/api/graphql/payload/location_structure/command_execution_result.rb +50 -50
  318. data/lib/ecoportal/api/graphql/payload/location_structure/draft/add_commands.rb +30 -30
  319. data/lib/ecoportal/api/graphql/payload/location_structure/draft/delete.rb +30 -30
  320. data/lib/ecoportal/api/graphql/payload/location_structure/draft/drop_bad_commands.rb +43 -43
  321. data/lib/ecoportal/api/graphql/payload/location_structure/draft/publish.rb +63 -63
  322. data/lib/ecoportal/api/graphql/payload/location_structure/draft.rb +18 -18
  323. data/lib/ecoportal/api/graphql/payload/location_structure.rb +14 -14
  324. data/lib/ecoportal/api/graphql/payload/ok_payload.rb +1 -1
  325. data/lib/ecoportal/api/graphql/payload/page/archive.rb +13 -13
  326. data/lib/ecoportal/api/graphql/payload/page/build_from_template.rb +13 -13
  327. data/lib/ecoportal/api/graphql/payload/page/create_from_template.rb +13 -13
  328. data/lib/ecoportal/api/graphql/payload/page/draft.rb +1 -1
  329. data/lib/ecoportal/api/graphql/payload/page/review_task.rb +1 -1
  330. data/lib/ecoportal/api/graphql/payload/page/unarchive.rb +13 -13
  331. data/lib/ecoportal/api/graphql/payload/page/update.rb +13 -13
  332. data/lib/ecoportal/api/graphql/payload/preset_view.rb +1 -1
  333. data/lib/ecoportal/api/graphql/payload/register.rb +1 -1
  334. data/lib/ecoportal/api/graphql/query/action.rb +33 -33
  335. data/lib/ecoportal/api/graphql/query/action_categories.rb +53 -53
  336. data/lib/ecoportal/api/graphql/query/actions.rb +43 -43
  337. data/lib/ecoportal/api/graphql/query/contractor_entities.rb +53 -53
  338. data/lib/ecoportal/api/graphql/query/file_upload_signature.rb +76 -76
  339. data/lib/ecoportal/api/graphql/query/location_classifications.rb +39 -39
  340. data/lib/ecoportal/api/graphql/query/page_delta.rb +47 -47
  341. data/lib/ecoportal/api/graphql/query/pages.rb +59 -59
  342. data/lib/ecoportal/api/graphql/query/person_members.rb +76 -0
  343. data/lib/ecoportal/api/graphql/query/register_preset_views.rb +1 -1
  344. data/lib/ecoportal/api/graphql/query/register_preview_pages.rb +83 -83
  345. data/lib/ecoportal/api/graphql/query/template_change_log.rb +118 -0
  346. data/lib/ecoportal/api/graphql/query/templates.rb +53 -53
  347. data/lib/ecoportal/api/graphql/query.rb +2 -0
  348. data/lib/ecoportal/api/graphql_version.rb +1 -1
  349. data/lib/ecoportal/api-graphql.rb +10 -10
  350. metadata +10 -8
  351. data/lib/ecoportal/api/common/graphql/CLAUDE.md +0 -36
  352. data/lib/ecoportal/api/common/graphql/model/CLAUDE.md +0 -28
  353. data/lib/ecoportal/api/graphql/CLAUDE.md +0 -37
  354. data/lib/ecoportal/api/graphql/base/CLAUDE.md +0 -50
  355. data/lib/ecoportal/api/graphql/builder/CLAUDE.md +0 -65
@@ -1,115 +1,115 @@
1
- module Ecoportal
2
- module API
3
- module Common
4
- module GraphQL
5
- module AuthService
6
- DEFAULT_SERVER = 'live.ecoportal.com'.freeze
7
- TOKEN_AUTORENEW = 90 # minutes
8
-
9
- module InstanceMethods
10
- def session_token(host: server, auto_renew: true)
11
- session_token_data(host: host).then do |body|
12
- next unless body
13
-
14
- if auto_renew && token_renew?(body['expires_in'])
15
- session_token_renewed(
16
- host: host,
17
- refresh_token: body['refresh_token']
18
- )
19
- else
20
- body['access_token']
21
- end
22
- end
23
- end
24
-
25
- def session_token_renewed(host: server, refresh_token: nil)
26
- unless refresh_token
27
- return unless (body = session_token_data(host: host))
28
- return unless (refresh_token = body['resfresh_token'])
29
- end
30
-
31
- session_refresh_token_data(
32
- host: host,
33
- refresh_token: refresh_token
34
- ).then do |bdy|
35
- bdy['access_token'] if bdy
36
- end
37
- end
38
-
39
- private
40
-
41
- def session_token_data(host: server)
42
- auth_http_client(host: host).post(
43
- '/oauth/token',
44
- data: {
45
- 'grant_type' => 'password',
46
- 'email' => user_email,
47
- 'password' => user_pass
48
- }
49
- ).then do |response|
50
- next response.body if response.success?
51
- end
52
- end
53
-
54
- def session_refresh_token_data(refresh_token:, host: server)
55
- auth_http_client(host: host).post(
56
- '/oauth/token',
57
- data: {
58
- 'grant_type' => 'refresh_token',
59
- 'refresh_token' => refresh_token
60
- }
61
- ).then do |response|
62
- next response.body if response.success?
63
- end
64
- end
65
-
66
- def token_renew?(seconds)
67
- (TOKEN_AUTORENEW * 60) > seconds
68
- end
69
-
70
- def auth_http_client(host: server)
71
- @auth_http_client ||= Ecoportal::API::Common::GraphQL::HttpClient.new(
72
- host: host,
73
- version: 'http'
74
- )
75
- end
76
-
77
- def user_email
78
- @user_email || fetch_env_required('USER_EMAIL')
79
- end
80
-
81
- def user_pass
82
- @user_pass || fetch_env_required('USER_PASS')
83
- end
84
-
85
- def server(default = DEFAULT_SERVER)
86
- ENV['SERVER'] || default
87
- end
88
-
89
- def fetch_env_required(name)
90
- raise "Missing ENV '#{name}'" unless ENV.key?(name)
91
- ENV[name]
92
- end
93
-
94
- def abort(msg)
95
- puts msg
96
- exit(1)
97
- end
98
- end
99
-
100
- module ClassMethods
101
- end
102
-
103
- class << self
104
- include InstanceMethods
105
-
106
- def included(base)
107
- base.send(:include, InstanceMethods)
108
- base.extend(ClassMethods)
109
- end
110
- end
111
- end
112
- end
113
- end
114
- end
115
- end
1
+ module Ecoportal
2
+ module API
3
+ module Common
4
+ module GraphQL
5
+ module AuthService
6
+ DEFAULT_SERVER = 'live.ecoportal.com'.freeze
7
+ TOKEN_AUTORENEW = 90 # minutes
8
+
9
+ module InstanceMethods
10
+ def session_token(host: server, auto_renew: true)
11
+ session_token_data(host: host).then do |body|
12
+ next unless body
13
+
14
+ if auto_renew && token_renew?(body['expires_in'])
15
+ session_token_renewed(
16
+ host: host,
17
+ refresh_token: body['refresh_token']
18
+ )
19
+ else
20
+ body['access_token']
21
+ end
22
+ end
23
+ end
24
+
25
+ def session_token_renewed(host: server, refresh_token: nil)
26
+ unless refresh_token
27
+ return unless (body = session_token_data(host: host))
28
+ return unless (refresh_token = body['resfresh_token'])
29
+ end
30
+
31
+ session_refresh_token_data(
32
+ host: host,
33
+ refresh_token: refresh_token
34
+ ).then do |bdy|
35
+ bdy['access_token'] if bdy
36
+ end
37
+ end
38
+
39
+ private
40
+
41
+ def session_token_data(host: server)
42
+ auth_http_client(host: host).post(
43
+ '/oauth/token',
44
+ data: {
45
+ 'grant_type' => 'password',
46
+ 'email' => user_email,
47
+ 'password' => user_pass
48
+ }
49
+ ).then do |response|
50
+ next response.body if response.success?
51
+ end
52
+ end
53
+
54
+ def session_refresh_token_data(refresh_token:, host: server)
55
+ auth_http_client(host: host).post(
56
+ '/oauth/token',
57
+ data: {
58
+ 'grant_type' => 'refresh_token',
59
+ 'refresh_token' => refresh_token
60
+ }
61
+ ).then do |response|
62
+ next response.body if response.success?
63
+ end
64
+ end
65
+
66
+ def token_renew?(seconds)
67
+ (TOKEN_AUTORENEW * 60) > seconds
68
+ end
69
+
70
+ def auth_http_client(host: server)
71
+ @auth_http_client ||= Ecoportal::API::Common::GraphQL::HttpClient.new(
72
+ host: host,
73
+ version: 'http'
74
+ )
75
+ end
76
+
77
+ def user_email
78
+ @user_email || fetch_env_required('USER_EMAIL')
79
+ end
80
+
81
+ def user_pass
82
+ @user_pass || fetch_env_required('USER_PASS')
83
+ end
84
+
85
+ def server(default = DEFAULT_SERVER)
86
+ ENV['SERVER'] || default
87
+ end
88
+
89
+ def fetch_env_required(name)
90
+ raise "Missing ENV '#{name}'" unless ENV.key?(name)
91
+ ENV[name]
92
+ end
93
+
94
+ def abort(msg)
95
+ puts msg
96
+ exit(1)
97
+ end
98
+ end
99
+
100
+ module ClassMethods
101
+ end
102
+
103
+ class << self
104
+ include InstanceMethods
105
+
106
+ def included(base)
107
+ base.send(:include, InstanceMethods)
108
+ base.extend(ClassMethods)
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
@@ -1,46 +1,46 @@
1
- module Ecoportal
2
- module API
3
- module Common
4
- module GraphQL
5
- module ClassHelpers
6
- module InstanceMethods
7
- def becomes(klass)
8
- klass.new.tap do |becoming|
9
- instance_variables.each do |var|
10
- becoming.instance_variable_set(
11
- var,
12
- instance_variable_get(var)
13
- )
14
- end
15
- end
16
- end
17
-
18
- def becomes_parent_class
19
- becomes(self.class.superclass)
20
- end
21
- end
22
-
23
- module ClassMethods
24
- include Ecoportal::API::Common::Content::ClassHelpers
25
-
26
- def const?(value)
27
- begin
28
- const_get(value)
29
- rescue NameError
30
- return false
31
- end
32
- true
33
- end
34
- end
35
-
36
- class << self
37
- def included(base)
38
- base.send(:include, InstanceMethods)
39
- base.extend(ClassMethods)
40
- end
41
- end
42
- end
43
- end
44
- end
45
- end
46
- end
1
+ module Ecoportal
2
+ module API
3
+ module Common
4
+ module GraphQL
5
+ module ClassHelpers
6
+ module InstanceMethods
7
+ def becomes(klass)
8
+ klass.new.tap do |becoming|
9
+ instance_variables.each do |var|
10
+ becoming.instance_variable_set(
11
+ var,
12
+ instance_variable_get(var)
13
+ )
14
+ end
15
+ end
16
+ end
17
+
18
+ def becomes_parent_class
19
+ becomes(self.class.superclass)
20
+ end
21
+ end
22
+
23
+ module ClassMethods
24
+ include Ecoportal::API::Common::Content::ClassHelpers
25
+
26
+ def const?(value)
27
+ begin
28
+ const_get(value)
29
+ rescue NameError
30
+ return false
31
+ end
32
+ true
33
+ end
34
+ end
35
+
36
+ class << self
37
+ def included(base)
38
+ base.send(:include, InstanceMethods)
39
+ base.extend(ClassMethods)
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -1,69 +1,69 @@
1
- require 'graphlient'
2
- module Ecoportal
3
- module API
4
- module Common
5
- module GraphQL
6
- class Client < ::Graphlient::Client
7
- ENDPOINT_PATH = 'external/graphql'.freeze
8
-
9
- attr_accessor :host, :http_client
10
-
11
- READ_TIMEOUT = 90
12
- WRITE_TIMEOUT = 90
13
-
14
- include Ecoportal::API::Common::GraphQL::AuthService
15
-
16
- def initialize(
17
- email: nil,
18
- pass: nil,
19
- org_id: self.org_id,
20
- host: server,
21
- schema_path: host,
22
- no_schema: false
23
- )
24
- @org_id = org_id
25
- @host = host
26
- @no_schema = no_schema
27
- @user_email = email
28
- @user_pass = pass
29
-
30
- puts "Configuring GraphQL Client onto '#{url}'"
31
-
32
- super(
33
- url,
34
- headers: {
35
- 'Authorization' => "Bearer #{session_token(host: host)}"
36
- },
37
- http_options: {
38
- read_timeout: READ_TIMEOUT,
39
- write_timeout: WRITE_TIMEOUT
40
- }.tap do |options|
41
- options.merge!(schema_path: schema_path) unless @no_schema
42
- end
43
- )
44
- end
45
-
46
- def new(org_id: self.org_id, host: self.host, schema_path: host, no_schema: @no_schema)
47
- self.class.new(
48
- org_id: org_id,
49
- host: host,
50
- schema_path: schema_path,
51
- no_schema: no_schema
52
- )
53
- end
54
-
55
- def org_id
56
- @org_id || fetch_env_required('ORGANIZATION_ID')
57
- end
58
-
59
- private
60
-
61
- def url
62
- base_url = Ecoportal::API::Common::GraphQL::HttpClient.base_url(host)
63
- "#{base_url}/api/#{org_id}/#{ENDPOINT_PATH}"
64
- end
65
- end
66
- end
67
- end
68
- end
69
- end
1
+ require 'graphlient'
2
+ module Ecoportal
3
+ module API
4
+ module Common
5
+ module GraphQL
6
+ class Client < ::Graphlient::Client
7
+ ENDPOINT_PATH = 'external/graphql'.freeze
8
+
9
+ attr_accessor :host, :http_client
10
+
11
+ READ_TIMEOUT = 90
12
+ WRITE_TIMEOUT = 90
13
+
14
+ include Ecoportal::API::Common::GraphQL::AuthService
15
+
16
+ def initialize(
17
+ email: nil,
18
+ pass: nil,
19
+ org_id: self.org_id,
20
+ host: server,
21
+ schema_path: host,
22
+ no_schema: false
23
+ )
24
+ @org_id = org_id
25
+ @host = host
26
+ @no_schema = no_schema
27
+ @user_email = email
28
+ @user_pass = pass
29
+
30
+ puts "Configuring GraphQL Client onto '#{url}'"
31
+
32
+ super(
33
+ url,
34
+ headers: {
35
+ 'Authorization' => "Bearer #{session_token(host: host)}"
36
+ },
37
+ http_options: {
38
+ read_timeout: READ_TIMEOUT,
39
+ write_timeout: WRITE_TIMEOUT
40
+ }.tap do |options|
41
+ options.merge!(schema_path: schema_path) unless @no_schema
42
+ end
43
+ )
44
+ end
45
+
46
+ def new(org_id: self.org_id, host: self.host, schema_path: host, no_schema: @no_schema)
47
+ self.class.new(
48
+ org_id: org_id,
49
+ host: host,
50
+ schema_path: schema_path,
51
+ no_schema: no_schema
52
+ )
53
+ end
54
+
55
+ def org_id
56
+ @org_id || fetch_env_required('ORGANIZATION_ID')
57
+ end
58
+
59
+ private
60
+
61
+ def url
62
+ base_url = Ecoportal::API::Common::GraphQL::HttpClient.base_url(host)
63
+ "#{base_url}/api/#{org_id}/#{ENDPOINT_PATH}"
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -1,105 +1,105 @@
1
- module Ecoportal
2
- module API
3
- module Common
4
- module GraphQL
5
- module HashHelpers
6
- class << self
7
- def included(base)
8
- base.send(:include, InstanceMethods)
9
- end
10
- end
11
-
12
- module InstanceMethods
13
- def keys_to_sym_deep(value)
14
- transform_keys_deep(value, &:to_sym)
15
- end
16
-
17
- def keys_to_s_deep(value)
18
- transform_keys_deep(value, &:to_s)
19
- end
20
-
21
- def except_keys(value, *keys)
22
- return value unless value.is_a?(Hash)
23
-
24
- deep_dup(value).tap do |out|
25
- keys.each {|key| out.delete(key)}
26
- end
27
- end
28
-
29
- # Targetted removal of keys in `target` that are `nil`
30
- def remove_nil_keys_deep(value, target: [])
31
- remove_keys_deep_if(value, target: target, &:nil?)
32
- end
33
-
34
- # Based on Rails support.
35
- def deep_dup(data)
36
- case data
37
- when Hash
38
- data.each_with_object({}) do |(k, v), copy|
39
- if k.is_a?(::String) || k.is_a?(::Symbol)
40
- copy[k] = deep_dup(v)
41
- else
42
- copy.delete(k)
43
- copy[deep_dup(k)] = deep_dup(v)
44
- end
45
- end
46
- when Enumerable
47
- data.map {|d| deep_dup(d)}
48
- else
49
- data.dup
50
- end
51
- end
52
-
53
- private
54
-
55
- # Iterator
56
- # @param value [Variadic]
57
- # @return [value.class]
58
- def transform_keys_deep(value, &block)
59
- case value
60
- when Hash
61
- value.dup.each_with_object({}) do |(k, v), out|
62
- k_val = block_given?? yield(k) : k
63
- out[k_val] = transform_keys_deep(v, &block)
64
- end
65
- when Enumerable
66
- value.map {|v| transform_keys_deep(v, &block)}
67
- else
68
- value
69
- end
70
- end
71
-
72
- # Targetted removal of keys in `target` that meet
73
- # the `block` condition.
74
- # @param value [Variadic]
75
- # @param target [Array<String>, Array<Symbol>] the target
76
- # `keys` to yield `block` onto.
77
- # @return [value.class]
78
- def remove_keys_deep_if(value, target: [], &block)
79
- msg = 'Expected block. None given.'
80
- raise ArgumentError, msg unless block_given?
81
-
82
- target = [target].flatten.compact
83
- return value if target.empty?
84
-
85
- case value
86
- when Hash
87
- value.dup.each_with_object({}) do |(k, v), out|
88
- next if yield(v) && target.include?(k) # skip
89
-
90
- out[k] = remove_nil_keys_deep(v, target: target, &block)
91
- end
92
- when Enumerable
93
- value.map {|v| remove_nil_keys_deep(v, target: target, &block)}
94
- else
95
- value
96
- end
97
- end
98
- end
99
-
100
- extend InstanceMethods
101
- end
102
- end
103
- end
104
- end
105
- end
1
+ module Ecoportal
2
+ module API
3
+ module Common
4
+ module GraphQL
5
+ module HashHelpers
6
+ class << self
7
+ def included(base)
8
+ base.send(:include, InstanceMethods)
9
+ end
10
+ end
11
+
12
+ module InstanceMethods
13
+ def keys_to_sym_deep(value)
14
+ transform_keys_deep(value, &:to_sym)
15
+ end
16
+
17
+ def keys_to_s_deep(value)
18
+ transform_keys_deep(value, &:to_s)
19
+ end
20
+
21
+ def except_keys(value, *keys)
22
+ return value unless value.is_a?(Hash)
23
+
24
+ deep_dup(value).tap do |out|
25
+ keys.each {|key| out.delete(key)}
26
+ end
27
+ end
28
+
29
+ # Targetted removal of keys in `target` that are `nil`
30
+ def remove_nil_keys_deep(value, target: [])
31
+ remove_keys_deep_if(value, target: target, &:nil?)
32
+ end
33
+
34
+ # Based on Rails support.
35
+ def deep_dup(data)
36
+ case data
37
+ when Hash
38
+ data.each_with_object({}) do |(k, v), copy|
39
+ if k.is_a?(::String) || k.is_a?(::Symbol)
40
+ copy[k] = deep_dup(v)
41
+ else
42
+ copy.delete(k)
43
+ copy[deep_dup(k)] = deep_dup(v)
44
+ end
45
+ end
46
+ when Enumerable
47
+ data.map {|d| deep_dup(d)}
48
+ else
49
+ data.dup
50
+ end
51
+ end
52
+
53
+ private
54
+
55
+ # Iterator
56
+ # @param value [Variadic]
57
+ # @return [value.class]
58
+ def transform_keys_deep(value, &block)
59
+ case value
60
+ when Hash
61
+ value.dup.each_with_object({}) do |(k, v), out|
62
+ k_val = block_given?? yield(k) : k
63
+ out[k_val] = transform_keys_deep(v, &block)
64
+ end
65
+ when Enumerable
66
+ value.map {|v| transform_keys_deep(v, &block)}
67
+ else
68
+ value
69
+ end
70
+ end
71
+
72
+ # Targetted removal of keys in `target` that meet
73
+ # the `block` condition.
74
+ # @param value [Variadic]
75
+ # @param target [Array<String>, Array<Symbol>] the target
76
+ # `keys` to yield `block` onto.
77
+ # @return [value.class]
78
+ def remove_keys_deep_if(value, target: [], &block)
79
+ msg = 'Expected block. None given.'
80
+ raise ArgumentError, msg unless block_given?
81
+
82
+ target = [target].flatten.compact
83
+ return value if target.empty?
84
+
85
+ case value
86
+ when Hash
87
+ value.dup.each_with_object({}) do |(k, v), out|
88
+ next if yield(v) && target.include?(k) # skip
89
+
90
+ out[k] = remove_nil_keys_deep(v, target: target, &block)
91
+ end
92
+ when Enumerable
93
+ value.map {|v| remove_nil_keys_deep(v, target: target, &block)}
94
+ else
95
+ value
96
+ end
97
+ end
98
+ end
99
+
100
+ extend InstanceMethods
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end