usps-imis-api 0.13.9 → 0.14.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 (481) hide show
  1. checksums.yaml +4 -4
  2. data/lib/usps/imis/api.rb +9 -6
  3. data/lib/usps/imis/base_data.rb +0 -3
  4. data/lib/usps/imis/blank_object.rb +0 -4
  5. data/lib/usps/imis/business_object.rb +17 -10
  6. data/lib/usps/imis/command_line/formatters.rb +5 -3
  7. data/lib/usps/imis/command_line/interface.rb +2 -0
  8. data/lib/usps/imis/command_line/options.yml +3 -3
  9. data/lib/usps/imis/command_line.rb +2 -3
  10. data/lib/usps/imis/config.rb +12 -6
  11. data/lib/usps/imis/data.rb +0 -5
  12. data/lib/usps/imis/dependencies.rb +33 -0
  13. data/lib/usps/imis/error.rb +10 -17
  14. data/lib/usps/imis/errors/embedded_model_find_error.rb +20 -0
  15. data/lib/usps/imis/errors/empty_payload_error.rb +23 -0
  16. data/lib/usps/imis/errors/missing_party_field_error.rb +24 -0
  17. data/lib/usps/imis/errors/pattern_matching_error.rb +0 -2
  18. data/lib/usps/imis/logger.rb +0 -3
  19. data/lib/usps/imis/models/associations/individual_demog.rb +11 -0
  20. data/lib/usps/imis/models/base/finders.rb +80 -0
  21. data/lib/usps/imis/models/base/persistence.rb +110 -0
  22. data/lib/usps/imis/models/base.rb +279 -0
  23. data/lib/usps/imis/models/education.rb +25 -0
  24. data/lib/usps/imis/models/generated/abc_cs_contact.rb +91 -0
  25. data/lib/usps/imis/models/generated/abc_fed990.rb +17 -0
  26. data/lib/usps/imis/models/generated/abc_ps_volunteer_skills.rb +16 -0
  27. data/lib/usps/imis/models/generated/access_area.rb +22 -0
  28. data/lib/usps/imis/models/generated/access_item.rb +18 -0
  29. data/lib/usps/imis/models/generated/access_main.rb +18 -0
  30. data/lib/usps/imis/models/generated/action_plan.rb +21 -0
  31. data/lib/usps/imis/models/generated/activity.rb +57 -0
  32. data/lib/usps/imis/models/generated/activity_ldao.rb +58 -0
  33. data/lib/usps/imis/models/generated/activity_ldcdr.rb +57 -0
  34. data/lib/usps/imis/models/generated/activity_ldxo.rb +57 -0
  35. data/lib/usps/imis/models/generated/add_family.rb +13 -0
  36. data/lib/usps/imis/models/generated/advanced_email_twelve_months_delivered_by_date.rb +16 -0
  37. data/lib/usps/imis/models/generated/advanced_email_twelve_months_totals.rb +16 -0
  38. data/lib/usps/imis/models/generated/aec_chapter_events.rb +28 -0
  39. data/lib/usps/imis/models/generated/aec_chapter_link_all_events.rb +18 -0
  40. data/lib/usps/imis/models/generated/aec_district_administrators.rb +19 -0
  41. data/lib/usps/imis/models/generated/aec_district_squadron_admins.rb +14 -0
  42. data/lib/usps/imis/models/generated/aec_district_squadron_events.rb +15 -0
  43. data/lib/usps/imis/models/generated/aec_si_r_charge_fee_percentages.rb +14 -0
  44. data/lib/usps/imis/models/generated/aec_si_r_charge_params.rb +16 -0
  45. data/lib/usps/imis/models/generated/appeal.rb +39 -0
  46. data/lib/usps/imis/models/generated/appeal_status_ref.rb +15 -0
  47. data/lib/usps/imis/models/generated/asc_ps_abc_squadron_price.rb +25 -0
  48. data/lib/usps/imis/models/generated/atom_panel_purpose.rb +15 -0
  49. data/lib/usps/imis/models/generated/auto_pay_instruction_detail.rb +22 -0
  50. data/lib/usps/imis/models/generated/auto_pay_invoices.rb +24 -0
  51. data/lib/usps/imis/models/generated/auto_pay_invoices_dues.rb +29 -0
  52. data/lib/usps/imis/models/generated/auto_pay_member_instruction_detail.rb +22 -0
  53. data/lib/usps/imis/models/generated/auto_pay_membership_invoices_base.rb +28 -0
  54. data/lib/usps/imis/models/generated/bad_address_reason_ref.rb +18 -0
  55. data/lib/usps/imis/models/generated/batch_line_status_ref.rb +14 -0
  56. data/lib/usps/imis/models/generated/billing_cycles.rb +50 -0
  57. data/lib/usps/imis/models/generated/billing_fees.rb +61 -0
  58. data/lib/usps/imis/models/generated/billing_fees_by_bill_to_party.rb +20 -0
  59. data/lib/usps/imis/models/generated/billing_issue_notification_by_bill_run.rb +20 -0
  60. data/lib/usps/imis/models/generated/billing_issue_notification_by_party.rb +30 -0
  61. data/lib/usps/imis/models/generated/billing_log_by_bill_cycle_data.rb +28 -0
  62. data/lib/usps/imis/models/generated/billing_log_by_party.rb +29 -0
  63. data/lib/usps/imis/models/generated/billing_product.rb +30 -0
  64. data/lib/usps/imis/models/generated/bo_district_dues.rb +26 -0
  65. data/lib/usps/imis/models/generated/bo_dues_fees.rb +21 -0
  66. data/lib/usps/imis/models/generated/bo_dues_pricing.rb +18 -0
  67. data/lib/usps/imis/models/generated/bo_national_dues.rb +84 -0
  68. data/lib/usps/imis/models/generated/bo_no_natl_dist_dues.rb +135 -0
  69. data/lib/usps/imis/models/generated/bo_squadron_dues.rb +26 -0
  70. data/lib/usps/imis/models/generated/bo_total.rb +17 -0
  71. data/lib/usps/imis/models/generated/campaign.rb +42 -0
  72. data/lib/usps/imis/models/generated/campaign_status_ref.rb +15 -0
  73. data/lib/usps/imis/models/generated/campaign_type_ref.rb +15 -0
  74. data/lib/usps/imis/models/generated/certification_module_status.rb +14 -0
  75. data/lib/usps/imis/models/generated/change_log_report.rb +25 -0
  76. data/lib/usps/imis/models/generated/change_property.rb +18 -0
  77. data/lib/usps/imis/models/generated/chapt_subscriptions.rb +14 -0
  78. data/lib/usps/imis/models/generated/chapter.rb +15 -0
  79. data/lib/usps/imis/models/generated/chapter_events.rb +30 -0
  80. data/lib/usps/imis/models/generated/commerce_product.rb +47 -0
  81. data/lib/usps/imis/models/generated/commission_rate_type_ref.rb +14 -0
  82. data/lib/usps/imis/models/generated/committee.rb +16 -0
  83. data/lib/usps/imis/models/generated/committee_districts_org_id.rb +16 -0
  84. data/lib/usps/imis/models/generated/committee_i_ds_temp.rb +13 -0
  85. data/lib/usps/imis/models/generated/committee_squadrons_org_id.rb +16 -0
  86. data/lib/usps/imis/models/generated/communication_log_summary_for_charts.rb +15 -0
  87. data/lib/usps/imis/models/generated/communication_message_type_ref.rb +14 -0
  88. data/lib/usps/imis/models/generated/communication_reason_ref.rb +22 -0
  89. data/lib/usps/imis/models/generated/community_items.rb +25 -0
  90. data/lib/usps/imis/models/generated/community_subscriptions.rb +25 -0
  91. data/lib/usps/imis/models/generated/comparison_ref.rb +14 -0
  92. data/lib/usps/imis/models/generated/component_registry.rb +28 -0
  93. data/lib/usps/imis/models/generated/contact.rb +32 -0
  94. data/lib/usps/imis/models/generated/contact_birthday_info.rb +20 -0
  95. data/lib/usps/imis/models/generated/contact_communication_reason_preferences.rb +25 -0
  96. data/lib/usps/imis/models/generated/contact_detail_report.rb +49 -0
  97. data/lib/usps/imis/models/generated/contact_offering_ref.rb +14 -0
  98. data/lib/usps/imis/models/generated/contact_profile_image.rb +22 -0
  99. data/lib/usps/imis/models/generated/contact_report.rb +23 -0
  100. data/lib/usps/imis/models/generated/contact_salutation.rb +18 -0
  101. data/lib/usps/imis/models/generated/contact_skill_ref.rb +14 -0
  102. data/lib/usps/imis/models/generated/contact_social_network.rb +19 -0
  103. data/lib/usps/imis/models/generated/contact_status_ref.rb +15 -0
  104. data/lib/usps/imis/models/generated/contact_type_ref.rb +16 -0
  105. data/lib/usps/imis/models/generated/content_filter.rb +18 -0
  106. data/lib/usps/imis/models/generated/content_manager_authority_group.rb +14 -0
  107. data/lib/usps/imis/models/generated/cost_method_ref.rb +15 -0
  108. data/lib/usps/imis/models/generated/country_ref.rb +27 -0
  109. data/lib/usps/imis/models/generated/credit_type_ref.rb +14 -0
  110. data/lib/usps/imis/models/generated/cs_activity.rb +50 -0
  111. data/lib/usps/imis/models/generated/cs_activity_basic.rb +51 -0
  112. data/lib/usps/imis/models/generated/cs_activity_forms.rb +38 -0
  113. data/lib/usps/imis/models/generated/cs_activity_types.rb +16 -0
  114. data/lib/usps/imis/models/generated/cs_address.rb +40 -0
  115. data/lib/usps/imis/models/generated/cs_address_formats.rb +15 -0
  116. data/lib/usps/imis/models/generated/cs_appeal.rb +23 -0
  117. data/lib/usps/imis/models/generated/cs_calls.rb +20 -0
  118. data/lib/usps/imis/models/generated/cs_campaign.rb +20 -0
  119. data/lib/usps/imis/models/generated/cs_committee.rb +23 -0
  120. data/lib/usps/imis/models/generated/cs_committee_code.rb +20 -0
  121. data/lib/usps/imis/models/generated/cs_committee_member.rb +38 -0
  122. data/lib/usps/imis/models/generated/cs_committee_member_group.rb +15 -0
  123. data/lib/usps/imis/models/generated/cs_committee_position.rb +16 -0
  124. data/lib/usps/imis/models/generated/cs_contact.rb +91 -0
  125. data/lib/usps/imis/models/generated/cs_contact_basic.rb +79 -0
  126. data/lib/usps/imis/models/generated/cs_country_names.rb +19 -0
  127. data/lib/usps/imis/models/generated/cs_donations.rb +31 -0
  128. data/lib/usps/imis/models/generated/cs_donations_detail.rb +33 -0
  129. data/lib/usps/imis/models/generated/cs_donor_data.rb +21 -0
  130. data/lib/usps/imis/models/generated/cs_dues_history.rb +22 -0
  131. data/lib/usps/imis/models/generated/cs_event.rb +92 -0
  132. data/lib/usps/imis/models/generated/cs_event_history.rb +20 -0
  133. data/lib/usps/imis/models/generated/cs_exchange_rate.rb +14 -0
  134. data/lib/usps/imis/models/generated/cs_freight_dollar.rb +14 -0
  135. data/lib/usps/imis/models/generated/cs_function.rb +57 -0
  136. data/lib/usps/imis/models/generated/cs_function_fees.rb +20 -0
  137. data/lib/usps/imis/models/generated/cs_gen_tables_union.rb +15 -0
  138. data/lib/usps/imis/models/generated/cs_general_lookup_tables.rb +17 -0
  139. data/lib/usps/imis/models/generated/cs_inventory.rb +37 -0
  140. data/lib/usps/imis/models/generated/cs_invoice.rb +51 -0
  141. data/lib/usps/imis/models/generated/cs_iso_currency_codes.rb +14 -0
  142. data/lib/usps/imis/models/generated/cs_member_type.rb +18 -0
  143. data/lib/usps/imis/models/generated/cs_name_fin.rb +27 -0
  144. data/lib/usps/imis/models/generated/cs_name_fr.rb +27 -0
  145. data/lib/usps/imis/models/generated/cs_name_log.rb +17 -0
  146. data/lib/usps/imis/models/generated/cs_name_note.rb +18 -0
  147. data/lib/usps/imis/models/generated/cs_name_picture.rb +19 -0
  148. data/lib/usps/imis/models/generated/cs_name_user.rb +18 -0
  149. data/lib/usps/imis/models/generated/cs_order_history.rb +22 -0
  150. data/lib/usps/imis/models/generated/cs_order_lines.rb +54 -0
  151. data/lib/usps/imis/models/generated/cs_order_type.rb +15 -0
  152. data/lib/usps/imis/models/generated/cs_orders.rb +85 -0
  153. data/lib/usps/imis/models/generated/cs_org_control.rb +47 -0
  154. data/lib/usps/imis/models/generated/cs_product.rb +49 -0
  155. data/lib/usps/imis/models/generated/cs_product_category.rb +18 -0
  156. data/lib/usps/imis/models/generated/cs_product_fundraising.rb +22 -0
  157. data/lib/usps/imis/models/generated/cs_product_location.rb +14 -0
  158. data/lib/usps/imis/models/generated/cs_product_type.rb +14 -0
  159. data/lib/usps/imis/models/generated/cs_reg_functions.rb +36 -0
  160. data/lib/usps/imis/models/generated/cs_registrant_classes.rb +15 -0
  161. data/lib/usps/imis/models/generated/cs_registration.rb +39 -0
  162. data/lib/usps/imis/models/generated/cs_relationship.rb +25 -0
  163. data/lib/usps/imis/models/generated/cs_relationship_types.rb +17 -0
  164. data/lib/usps/imis/models/generated/cs_salutations.rb +14 -0
  165. data/lib/usps/imis/models/generated/cs_staff_user.rb +34 -0
  166. data/lib/usps/imis/models/generated/cs_state_province_codes.rb +15 -0
  167. data/lib/usps/imis/models/generated/cs_subscriptions.rb +58 -0
  168. data/lib/usps/imis/models/generated/cs_subscriptions_chapters.rb +15 -0
  169. data/lib/usps/imis/models/generated/cs_system_params.rb +15 -0
  170. data/lib/usps/imis/models/generated/cs_terms.rb +17 -0
  171. data/lib/usps/imis/models/generated/cs_trans_notify.rb +16 -0
  172. data/lib/usps/imis/models/generated/cs_web_security_group.rb +14 -0
  173. data/lib/usps/imis/models/generated/cs_web_user.rb +18 -0
  174. data/lib/usps/imis/models/generated/culture_ref.rb +14 -0
  175. data/lib/usps/imis/models/generated/customer_experience_status.rb +14 -0
  176. data/lib/usps/imis/models/generated/data_type.rb +16 -0
  177. data/lib/usps/imis/models/generated/data_vault_attempt_settlement_status_ref.rb +15 -0
  178. data/lib/usps/imis/models/generated/data_vault_attempt_status_ref.rb +14 -0
  179. data/lib/usps/imis/models/generated/data_vault_attempt_summary.rb +39 -0
  180. data/lib/usps/imis/models/generated/data_vault_batch_summary.rb +21 -0
  181. data/lib/usps/imis/models/generated/data_vault_log_attempt.rb +25 -0
  182. data/lib/usps/imis/models/generated/data_vault_status_ref.rb +14 -0
  183. data/lib/usps/imis/models/generated/data_vault_status_summary.rb +15 -0
  184. data/lib/usps/imis/models/generated/data_vault_status_summary_detail.rb +19 -0
  185. data/lib/usps/imis/models/generated/date_dimension.rb +24 -0
  186. data/lib/usps/imis/models/generated/day_of_the_week_ref.rb +14 -0
  187. data/lib/usps/imis/models/generated/discountable_item.rb +20 -0
  188. data/lib/usps/imis/models/generated/discountable_item_class.rb +15 -0
  189. data/lib/usps/imis/models/generated/distinct_user_defined_multi_select_properties.rb +17 -0
  190. data/lib/usps/imis/models/generated/districts_and_primary_members.rb +15 -0
  191. data/lib/usps/imis/models/generated/document_path.rb +14 -0
  192. data/lib/usps/imis/models/generated/document_storage.rb +23 -0
  193. data/lib/usps/imis/models/generated/document_system_size_info.rb +36 -0
  194. data/lib/usps/imis/models/generated/document_system_size_info_by_type.rb +37 -0
  195. data/lib/usps/imis/models/generated/document_system_status_count_info.rb +14 -0
  196. data/lib/usps/imis/models/generated/document_system_status_size_info.rb +15 -0
  197. data/lib/usps/imis/models/generated/document_system_type_count_info.rb +14 -0
  198. data/lib/usps/imis/models/generated/document_system_type_size_info.rb +15 -0
  199. data/lib/usps/imis/models/generated/document_type.rb +34 -0
  200. data/lib/usps/imis/models/generated/document_type_status_path_info.rb +28 -0
  201. data/lib/usps/imis/models/generated/donation.rb +31 -0
  202. data/lib/usps/imis/models/generated/donation_performance.rb +19 -0
  203. data/lib/usps/imis/models/generated/donation_summary.rb +36 -0
  204. data/lib/usps/imis/models/generated/dynamic_group.rb +18 -0
  205. data/lib/usps/imis/models/generated/educ_abc.rb +21 -0
  206. data/lib/usps/imis/models/generated/educ_boc.rb +21 -0
  207. data/lib/usps/imis/models/generated/educ_crs.rb +21 -0
  208. data/lib/usps/imis/models/generated/educ_id.rb +21 -0
  209. data/lib/usps/imis/models/generated/educ_ot.rb +21 -0
  210. data/lib/usps/imis/models/generated/educ_sem.rb +21 -0
  211. data/lib/usps/imis/models/generated/education_in_progress.rb +16 -0
  212. data/lib/usps/imis/models/generated/education_level_ref.rb +15 -0
  213. data/lib/usps/imis/models/generated/effective_contact_communication_preferences_data.rb +23 -0
  214. data/lib/usps/imis/models/generated/effective_fundraising_preferences_data.rb +18 -0
  215. data/lib/usps/imis/models/generated/engagement_category.rb +23 -0
  216. data/lib/usps/imis/models/generated/engagement_measure.rb +24 -0
  217. data/lib/usps/imis/models/generated/engagement_score_current_data.rb +21 -0
  218. data/lib/usps/imis/models/generated/engagement_score_formula.rb +19 -0
  219. data/lib/usps/imis/models/generated/engagement_score_monthly_data.rb +22 -0
  220. data/lib/usps/imis/models/generated/engagement_score_result.rb +21 -0
  221. data/lib/usps/imis/models/generated/engagement_score_yearly_data.rb +21 -0
  222. data/lib/usps/imis/models/generated/event_category_list.rb +16 -0
  223. data/lib/usps/imis/models/generated/event_function_resource_data.rb +22 -0
  224. data/lib/usps/imis/models/generated/event_question.rb +24 -0
  225. data/lib/usps/imis/models/generated/event_question_response.rb +25 -0
  226. data/lib/usps/imis/models/generated/event_registrants_report.rb +45 -0
  227. data/lib/usps/imis/models/generated/execution_mode_ref.rb +15 -0
  228. data/lib/usps/imis/models/generated/experience_definition_status.rb +14 -0
  229. data/lib/usps/imis/models/generated/expired_member_update_detail_log.rb +19 -0
  230. data/lib/usps/imis/models/generated/family_add_contact.rb +91 -0
  231. data/lib/usps/imis/models/generated/family_member_count.rb +37 -0
  232. data/lib/usps/imis/models/generated/file_type_ref.rb +16 -0
  233. data/lib/usps/imis/models/generated/first_notify_contact_per_gift.rb +14 -0
  234. data/lib/usps/imis/models/generated/first_payment_date_type_ref.rb +15 -0
  235. data/lib/usps/imis/models/generated/form_definition_field_data.rb +19 -0
  236. data/lib/usps/imis/models/generated/form_field_response_data.rb +22 -0
  237. data/lib/usps/imis/models/generated/fundraising_preference_ref.rb +15 -0
  238. data/lib/usps/imis/models/generated/fundraising_profile_donor_data.rb +18 -0
  239. data/lib/usps/imis/models/generated/gateway_result_ref.rb +14 -0
  240. data/lib/usps/imis/models/generated/gateway_transaction_data.rb +35 -0
  241. data/lib/usps/imis/models/generated/gateway_transaction_ref.rb +15 -0
  242. data/lib/usps/imis/models/generated/gateway_type_ref.rb +17 -0
  243. data/lib/usps/imis/models/generated/gift.rb +41 -0
  244. data/lib/usps/imis/models/generated/gift_adjustment_log_summary.rb +25 -0
  245. data/lib/usps/imis/models/generated/gift_aid_claim_status_ref.rb +14 -0
  246. data/lib/usps/imis/models/generated/gift_array.rb +16 -0
  247. data/lib/usps/imis/models/generated/gift_detail.rb +29 -0
  248. data/lib/usps/imis/models/generated/gift_history.rb +45 -0
  249. data/lib/usps/imis/models/generated/gift_history_summary.rb +33 -0
  250. data/lib/usps/imis/models/generated/gift_history_summary_basic.rb +33 -0
  251. data/lib/usps/imis/models/generated/gift_summary.rb +16 -0
  252. data/lib/usps/imis/models/generated/gift_totals_by_date.rb +15 -0
  253. data/lib/usps/imis/models/generated/gift_transaction.rb +43 -0
  254. data/lib/usps/imis/models/generated/gifts_received.rb +32 -0
  255. data/lib/usps/imis/models/generated/gifts_received_for_receipting.rb +44 -0
  256. data/lib/usps/imis/models/generated/gifts_received_summary.rb +33 -0
  257. data/lib/usps/imis/models/generated/gifts_with_void_and_replaced_receipts.rb +43 -0
  258. data/lib/usps/imis/models/generated/gl_batch_transaction_data.rb +30 -0
  259. data/lib/usps/imis/models/generated/gl_daily_transaction_data.rb +30 -0
  260. data/lib/usps/imis/models/generated/gl_detail_due_to_due_from_transaction_data.rb +17 -0
  261. data/lib/usps/imis/models/generated/gl_detail_transaction_data.rb +36 -0
  262. data/lib/usps/imis/models/generated/gl_detail_transaction_data_full.rb +36 -0
  263. data/lib/usps/imis/models/generated/gl_due_to_due_from_transaction_data.rb +18 -0
  264. data/lib/usps/imis/models/generated/gl_entry_type_ref.rb +14 -0
  265. data/lib/usps/imis/models/generated/gl_export_format_type_ref.rb +14 -0
  266. data/lib/usps/imis/models/generated/gl_export_log_detail.rb +15 -0
  267. data/lib/usps/imis/models/generated/gl_export_log_summary.rb +26 -0
  268. data/lib/usps/imis/models/generated/gl_export_multiple.rb +15 -0
  269. data/lib/usps/imis/models/generated/gl_export_summary_level_ref.rb +15 -0
  270. data/lib/usps/imis/models/generated/gl_monthly_due_to_due_from_transaction_data.rb +18 -0
  271. data/lib/usps/imis/models/generated/gl_monthly_transaction_data.rb +29 -0
  272. data/lib/usps/imis/models/generated/gl_source_item_type_ref.rb +14 -0
  273. data/lib/usps/imis/models/generated/gl_transaction_data.rb +41 -0
  274. data/lib/usps/imis/models/generated/grade.rb +14 -0
  275. data/lib/usps/imis/models/generated/group_info.rb +28 -0
  276. data/lib/usps/imis/models/generated/group_member_administrator_type_ref.rb +15 -0
  277. data/lib/usps/imis/models/generated/group_member_detail.rb +29 -0
  278. data/lib/usps/imis/models/generated/group_member_status_ref.rb +15 -0
  279. data/lib/usps/imis/models/generated/group_perspective.rb +16 -0
  280. data/lib/usps/imis/models/generated/group_price_sheet.rb +17 -0
  281. data/lib/usps/imis/models/generated/group_role_ref.rb +17 -0
  282. data/lib/usps/imis/models/generated/group_status_ref.rb +16 -0
  283. data/lib/usps/imis/models/generated/group_type_member_status.rb +17 -0
  284. data/lib/usps/imis/models/generated/group_type_ref.rb +33 -0
  285. data/lib/usps/imis/models/generated/group_type_role.rb +22 -0
  286. data/lib/usps/imis/models/generated/handling_price_ref.rb +15 -0
  287. data/lib/usps/imis/models/generated/hierarchy.rb +21 -0
  288. data/lib/usps/imis/models/generated/hierarchy_root.rb +22 -0
  289. data/lib/usps/imis/models/generated/i_series_data.rb +15 -0
  290. data/lib/usps/imis/models/generated/individual_demog.rb +34 -0
  291. data/lib/usps/imis/models/generated/institute_type_code_ref.rb +16 -0
  292. data/lib/usps/imis/models/generated/interaction_log.rb +35 -0
  293. data/lib/usps/imis/models/generated/interaction_log_event.rb +24 -0
  294. data/lib/usps/imis/models/generated/interaction_log_event_summary.rb +30 -0
  295. data/lib/usps/imis/models/generated/interval_type_ref.rb +15 -0
  296. data/lib/usps/imis/models/generated/invoice_line_data.rb +39 -0
  297. data/lib/usps/imis/models/generated/invoice_lines.rb +42 -0
  298. data/lib/usps/imis/models/generated/invoice_number.rb +16 -0
  299. data/lib/usps/imis/models/generated/invoice_payment_summary.rb +14 -0
  300. data/lib/usps/imis/models/generated/invoice_purpose.rb +15 -0
  301. data/lib/usps/imis/models/generated/invoice_source_system_ref.rb +13 -0
  302. data/lib/usps/imis/models/generated/invoice_type_ref.rb +14 -0
  303. data/lib/usps/imis/models/generated/journal_entry_type_ref.rb +14 -0
  304. data/lib/usps/imis/models/generated/license_ref.rb +15 -0
  305. data/lib/usps/imis/models/generated/line_pricing_ref.rb +15 -0
  306. data/lib/usps/imis/models/generated/list_entity.rb +14 -0
  307. data/lib/usps/imis/models/generated/locale_ref.rb +14 -0
  308. data/lib/usps/imis/models/generated/location_status.rb +14 -0
  309. data/lib/usps/imis/models/generated/mail_code_ref.rb +16 -0
  310. data/lib/usps/imis/models/generated/matching_gift_plan_type_ref.rb +15 -0
  311. data/lib/usps/imis/models/generated/matching_mode_ref.rb +15 -0
  312. data/lib/usps/imis/models/generated/matching_period_ref.rb +15 -0
  313. data/lib/usps/imis/models/generated/memorial_tribute_type_ref.rb +14 -0
  314. data/lib/usps/imis/models/generated/method_set_type_ref.rb +14 -0
  315. data/lib/usps/imis/models/generated/month_ref.rb +18 -0
  316. data/lib/usps/imis/models/generated/name_prefixes.rb +15 -0
  317. data/lib/usps/imis/models/generated/name_suffixes.rb +13 -0
  318. data/lib/usps/imis/models/generated/navigation_pane.rb +18 -0
  319. data/lib/usps/imis/models/generated/net_contact.rb +99 -0
  320. data/lib/usps/imis/models/generated/net_contact_basic.rb +88 -0
  321. data/lib/usps/imis/models/generated/net_contact_data.rb +88 -0
  322. data/lib/usps/imis/models/generated/note_purpose_ref.rb +14 -0
  323. data/lib/usps/imis/models/generated/offering_status.rb +14 -0
  324. data/lib/usps/imis/models/generated/opportunity_class_ref.rb +15 -0
  325. data/lib/usps/imis/models/generated/opportunity_default_status_ref.rb +15 -0
  326. data/lib/usps/imis/models/generated/opportunity_status_ref.rb +15 -0
  327. data/lib/usps/imis/models/generated/opportunity_task_user.rb +20 -0
  328. data/lib/usps/imis/models/generated/opportunity_type.rb +29 -0
  329. data/lib/usps/imis/models/generated/order_category.rb +14 -0
  330. data/lib/usps/imis/models/generated/order_fulfillment_status_ref.rb +14 -0
  331. data/lib/usps/imis/models/generated/order_invoice.rb +14 -0
  332. data/lib/usps/imis/models/generated/order_state_ref.rb +14 -0
  333. data/lib/usps/imis/models/generated/order_type_detail.rb +17 -0
  334. data/lib/usps/imis/models/generated/org_demog.rb +28 -0
  335. data/lib/usps/imis/models/generated/organization_demo.rb +18 -0
  336. data/lib/usps/imis/models/generated/organization_hierarchy.rb +19 -0
  337. data/lib/usps/imis/models/generated/package.rb +25 -0
  338. data/lib/usps/imis/models/generated/package_item.rb +19 -0
  339. data/lib/usps/imis/models/generated/package_status_ref.rb +14 -0
  340. data/lib/usps/imis/models/generated/payment_application.rb +31 -0
  341. data/lib/usps/imis/models/generated/payment_application_detail.rb +35 -0
  342. data/lib/usps/imis/models/generated/payment_application_restriction_ref.rb +14 -0
  343. data/lib/usps/imis/models/generated/payment_application_summary.rb +18 -0
  344. data/lib/usps/imis/models/generated/payment_application_type.rb +14 -0
  345. data/lib/usps/imis/models/generated/payment_category_ref.rb +14 -0
  346. data/lib/usps/imis/models/generated/payment_detail_status_ref.rb +15 -0
  347. data/lib/usps/imis/models/generated/payment_method_data.rb +20 -0
  348. data/lib/usps/imis/models/generated/payment_reconciliation.rb +26 -0
  349. data/lib/usps/imis/models/generated/payment_status_ref.rb +14 -0
  350. data/lib/usps/imis/models/generated/percentile_ranking.rb +20 -0
  351. data/lib/usps/imis/models/generated/picture_purpose_ref.rb +14 -0
  352. data/lib/usps/imis/models/generated/pin_update.rb +13 -0
  353. data/lib/usps/imis/models/generated/pipeline.rb +15 -0
  354. data/lib/usps/imis/models/generated/pipeline_stage.rb +17 -0
  355. data/lib/usps/imis/models/generated/postal_code_ref.rb +26 -0
  356. data/lib/usps/imis/models/generated/prefix_ref.rb +17 -0
  357. data/lib/usps/imis/models/generated/price_basis_ref.rb +15 -0
  358. data/lib/usps/imis/models/generated/pricing_type_ref.rb +15 -0
  359. data/lib/usps/imis/models/generated/primary_fam_members.rb +14 -0
  360. data/lib/usps/imis/models/generated/process_type_default_owner_all_users.rb +15 -0
  361. data/lib/usps/imis/models/generated/product_price_sheet.rb +20 -0
  362. data/lib/usps/imis/models/generated/product_status_ref.rb +15 -0
  363. data/lib/usps/imis/models/generated/product_trans.rb +31 -0
  364. data/lib/usps/imis/models/generated/product_trans_detail.rb +17 -0
  365. data/lib/usps/imis/models/generated/profile_documents.rb +15 -0
  366. data/lib/usps/imis/models/generated/profile_page.rb +36 -0
  367. data/lib/usps/imis/models/generated/program_group_status.rb +14 -0
  368. data/lib/usps/imis/models/generated/program_status.rb +14 -0
  369. data/lib/usps/imis/models/generated/promotion_rule_ref.rb +15 -0
  370. data/lib/usps/imis/models/generated/property_definition.rb +33 -0
  371. data/lib/usps/imis/models/generated/prospect.rb +38 -0
  372. data/lib/usps/imis/models/generated/publish_priority.rb +14 -0
  373. data/lib/usps/imis/models/generated/publish_request.rb +18 -0
  374. data/lib/usps/imis/models/generated/publish_request_detail.rb +22 -0
  375. data/lib/usps/imis/models/generated/publish_request_status.rb +15 -0
  376. data/lib/usps/imis/models/generated/publish_server.rb +29 -0
  377. data/lib/usps/imis/models/generated/quality_ref.rb +15 -0
  378. data/lib/usps/imis/models/generated/rank.rb +21 -0
  379. data/lib/usps/imis/models/generated/receipt_report.rb +24 -0
  380. data/lib/usps/imis/models/generated/receipt_status_ref.rb +15 -0
  381. data/lib/usps/imis/models/generated/recurring_donation_expected_payment_set.rb +19 -0
  382. data/lib/usps/imis/models/generated/recurring_donation_expected_payment_set_list.rb +20 -0
  383. data/lib/usps/imis/models/generated/recurring_donation_expected_payment_set_status.rb +15 -0
  384. data/lib/usps/imis/models/generated/recurring_donation_expected_payment_status.rb +15 -0
  385. data/lib/usps/imis/models/generated/recurring_donation_frequency_ref.rb +15 -0
  386. data/lib/usps/imis/models/generated/reference_date.rb +13 -0
  387. data/lib/usps/imis/models/generated/registered_component.rb +27 -0
  388. data/lib/usps/imis/models/generated/registration_status.rb +14 -0
  389. data/lib/usps/imis/models/generated/relationship.rb +18 -0
  390. data/lib/usps/imis/models/generated/relationship_category.rb +17 -0
  391. data/lib/usps/imis/models/generated/relationship_type_category.rb +17 -0
  392. data/lib/usps/imis/models/generated/relationship_type_ref.rb +16 -0
  393. data/lib/usps/imis/models/generated/relationship_update.rb +16 -0
  394. data/lib/usps/imis/models/generated/relationship_update_contact_panel.rb +16 -0
  395. data/lib/usps/imis/models/generated/remove_district_org_committee_terms.rb +28 -0
  396. data/lib/usps/imis/models/generated/remove_squadron_org_committee_terms.rb +28 -0
  397. data/lib/usps/imis/models/generated/reporting_group_user.rb +14 -0
  398. data/lib/usps/imis/models/generated/response_media_ref.rb +14 -0
  399. data/lib/usps/imis/models/generated/response_type_ref.rb +15 -0
  400. data/lib/usps/imis/models/generated/restock_price_ref.rb +15 -0
  401. data/lib/usps/imis/models/generated/sales_location_status_ref.rb +15 -0
  402. data/lib/usps/imis/models/generated/salutation_ref.rb +22 -0
  403. data/lib/usps/imis/models/generated/sbuddy_answers.rb +23 -0
  404. data/lib/usps/imis/models/generated/sbuddy_definition.rb +28 -0
  405. data/lib/usps/imis/models/generated/schedule_frequency_ref.rb +14 -0
  406. data/lib/usps/imis/models/generated/segmentation_job_status_ref.rb +15 -0
  407. data/lib/usps/imis/models/generated/sequence_counter.rb +16 -0
  408. data/lib/usps/imis/models/generated/set_district_org_committee_terms.rb +28 -0
  409. data/lib/usps/imis/models/generated/set_squadron_org_committee_terms.rb +28 -0
  410. data/lib/usps/imis/models/generated/ship_price_ref.rb +15 -0
  411. data/lib/usps/imis/models/generated/soa_group.rb +21 -0
  412. data/lib/usps/imis/models/generated/soa_group_member.rb +19 -0
  413. data/lib/usps/imis/models/generated/soa_group_member_detail.rb +28 -0
  414. data/lib/usps/imis/models/generated/social_network_ref.rb +15 -0
  415. data/lib/usps/imis/models/generated/solicitation.rb +40 -0
  416. data/lib/usps/imis/models/generated/solicitation_status_ref.rb +15 -0
  417. data/lib/usps/imis/models/generated/source_code.rb +43 -0
  418. data/lib/usps/imis/models/generated/source_code_status_ref.rb +15 -0
  419. data/lib/usps/imis/models/generated/source_code_type_ref.rb +15 -0
  420. data/lib/usps/imis/models/generated/squad_form_add_fam.rb +23 -0
  421. data/lib/usps/imis/models/generated/squad_form_add_individual.rb +31 -0
  422. data/lib/usps/imis/models/generated/squad_leader_add_individual_contact.rb +28 -0
  423. data/lib/usps/imis/models/generated/squad_note.rb +13 -0
  424. data/lib/usps/imis/models/generated/squad_to_district.rb +18 -0
  425. data/lib/usps/imis/models/generated/squadron_chap_com.rb +16 -0
  426. data/lib/usps/imis/models/generated/squadron_district_lookup.rb +18 -0
  427. data/lib/usps/imis/models/generated/squadrons_and_primary_members.rb +15 -0
  428. data/lib/usps/imis/models/generated/standard_page.rb +15 -0
  429. data/lib/usps/imis/models/generated/state_province_ref.rb +21 -0
  430. data/lib/usps/imis/models/generated/suffix_ref.rb +16 -0
  431. data/lib/usps/imis/models/generated/supplement.rb +27 -0
  432. data/lib/usps/imis/models/generated/supplement_status_ref.rb +15 -0
  433. data/lib/usps/imis/models/generated/supplement_type_ref.rb +15 -0
  434. data/lib/usps/imis/models/generated/system_config_xml.rb +14 -0
  435. data/lib/usps/imis/models/generated/system_param_int.rb +23 -0
  436. data/lib/usps/imis/models/generated/tag_hierarchy.rb +32 -0
  437. data/lib/usps/imis/models/generated/tag_relationship_type.rb +16 -0
  438. data/lib/usps/imis/models/generated/task_item.rb +32 -0
  439. data/lib/usps/imis/models/generated/task_item_status_ref.rb +15 -0
  440. data/lib/usps/imis/models/generated/task_latest_log.rb +15 -0
  441. data/lib/usps/imis/models/generated/task_notify_creator_ref.rb +15 -0
  442. data/lib/usps/imis/models/generated/task_priority.rb +15 -0
  443. data/lib/usps/imis/models/generated/task_status.rb +16 -0
  444. data/lib/usps/imis/models/generated/task_type.rb +15 -0
  445. data/lib/usps/imis/models/generated/tax_authority_level_ref.rb +15 -0
  446. data/lib/usps/imis/models/generated/time_zone_ref.rb +20 -0
  447. data/lib/usps/imis/models/generated/top_level_parent_organization.rb +20 -0
  448. data/lib/usps/imis/models/generated/transaction_detail.rb +56 -0
  449. data/lib/usps/imis/models/generated/transaction_summary_large_batch.rb +44 -0
  450. data/lib/usps/imis/models/generated/uniform_registry.rb +14 -0
  451. data/lib/usps/imis/models/generated/uniform_tag.rb +17 -0
  452. data/lib/usps/imis/models/generated/upgrade_log_detail.rb +19 -0
  453. data/lib/usps/imis/models/generated/url_mapping_type_ref.rb +15 -0
  454. data/lib/usps/imis/models/generated/user_data.rb +33 -0
  455. data/lib/usps/imis/models/generated/user_role.rb +14 -0
  456. data/lib/usps/imis/models/generated/user_token.rb +14 -0
  457. data/lib/usps/imis/models/generated/vertical_alignment_ref.rb +15 -0
  458. data/lib/usps/imis/models/generated/vessels.rb +18 -0
  459. data/lib/usps/imis/models/generated/volunteer_information.rb +22 -0
  460. data/lib/usps/imis/models/generated/warehouse_status_ref.rb +14 -0
  461. data/lib/usps/imis/models/generated/warehouse_type_ref.rb +14 -0
  462. data/lib/usps/imis/models/generated/web_user_control_ref.rb +15 -0
  463. data/lib/usps/imis/models/generated/workflow_queue_item.rb +25 -0
  464. data/lib/usps/imis/models/generated/workflow_queue_item_with_status.rb +25 -0
  465. data/lib/usps/imis/models/generated/workflow_queue_status_ref.rb +15 -0
  466. data/lib/usps/imis/models/generated/workflow_status_ref.rb +15 -0
  467. data/lib/usps/imis/models/party/address.rb +32 -0
  468. data/lib/usps/imis/models/party/alternate_id.rb +16 -0
  469. data/lib/usps/imis/models/party/email.rb +17 -0
  470. data/lib/usps/imis/models/party/phone.rb +17 -0
  471. data/lib/usps/imis/models/party/salutation.rb +18 -0
  472. data/lib/usps/imis/models/party.rb +131 -0
  473. data/lib/usps/imis/models/types/upcase_string.rb +18 -0
  474. data/lib/usps/imis/models/vessel_safety_checks.rb +20 -0
  475. data/lib/usps/imis/models.rb +57 -0
  476. data/lib/usps/imis/party_data.rb +1 -6
  477. data/lib/usps/imis/query.rb +5 -1
  478. data/lib/usps/imis/version.rb +1 -1
  479. data/lib/usps/imis.rb +10 -19
  480. data/spec/support/usps/simple_cov_uncovered_lines_formatter.rb +53 -0
  481. metadata +477 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fca31f9bb4d8d748374f47185b5110c95b6f80088dc682cb44613e3629199319
4
- data.tar.gz: 742c11021ae6b6446bc29e3b5b29fc99bf151683e5607e2ca2fcb12d5b19f569
3
+ metadata.gz: b8075b08c9527b8309ac2e784db46c2e9dc6d922b5a4ee7392fbb493ece0bdb8
4
+ data.tar.gz: 1f37a85470c68ee132e42e10f26cf3d6be97700d160fbd7479d14bdcd3f23474
5
5
  SHA512:
6
- metadata.gz: 7b5bc685dec91340b99d60d5cf199d41b7dbf5750a5469b25dc46f445c0bb180b1d77bc7cd5e244ee68f88e93f9332083eea11fa19516dbd8d84e572177a35b5
7
- data.tar.gz: 3fc9d20a2d78f4cc0ced1c3552db53e08106bb8ab74cd1384897f7faee5b7091a7b411b0ba5b6c91c06a3dcc01d1b94f5f315d746d89b81f9757f98129fda2df
6
+ metadata.gz: 158b6e90ec01dc5b1d8f3f9ddad0d91434ba86facfe05b1547aaa4ba3a16679092f6e4c4a83d6c96d3ff1e02724bd1c8d8e4aa42eb45782019f18989036842ba
7
+ data.tar.gz: 298cf14dee964a5c6c1029a68a629b3e0cd921ec7f3ff396947919269686c3233a160fe48d36eb7058431f7e8d5be8b9bd174c911c23f4cdf5bed836ea11b8b2
data/lib/usps/imis/api.rb CHANGED
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'requests'
4
3
  require_relative 'business_object'
5
4
  require_relative 'mapper'
6
5
  require_relative 'query'
@@ -98,7 +97,7 @@ module Usps
98
97
 
99
98
  raise Errors::LockedIdError if lock_imis_id
100
99
 
101
- @record_id = id.to_i
100
+ @record_id = format_id(id)
102
101
  end
103
102
 
104
103
  # Currently selected Record ID for API requests
@@ -124,7 +123,7 @@ module Usps
124
123
  party = query('Party', UniformId: net_contact_data.id).one
125
124
  raise Errors::NotFoundError, 'Member not found' if party.nil?
126
125
 
127
- self.imis_id = party.id
126
+ self.imis_id = party.imis_id
128
127
  rescue Errors::ResponseError
129
128
  raise Errors::NotFoundError, 'Member not found'
130
129
  end
@@ -231,12 +230,16 @@ module Usps
231
230
  #
232
231
  delegate :update, to: :mapper
233
232
 
234
- # List of available Business Object names
233
+ # Names of every Business Object that has a registered +Models::Base+
234
+ # wrapper, partitioned by whether the name carries an +ABC+ prefix.
235
+ # Sourced from the in-process registry — no HTTP — so this answers
236
+ # "what does the gem know how to wrap?", not "what does the server
237
+ # expose?". Anything not listed still round-trips as raw +Data+.
235
238
  #
236
- # @return [Hash<Symbol, Array<String>>] Grouped available Business Objects
239
+ # @return [Hash<Symbol, Array<String>>] Grouped registered Business Objects
237
240
  #
238
241
  def business_objects
239
- abc, other = query('BOEntityDefinition').map(&:entity).partition { it.include?('ABC') }
242
+ abc, other = Models.entity_names.partition { it.include?('ABC') }
240
243
 
241
244
  { abc:, other: }
242
245
  end
@@ -1,8 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'pp'
4
- require 'stringio'
5
-
6
3
  module Usps
7
4
  module Imis
8
5
  # Base class for API data response wrappers
@@ -1,9 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'requests'
4
- require_relative 'data'
5
- require_relative 'party_data'
6
-
7
3
  module Usps
8
4
  module Imis
9
5
  # Constructor for blank BusinessObject and BasePanel objects
@@ -1,9 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'requests'
4
- require_relative 'data'
5
- require_relative 'party_data'
6
-
7
3
  module Usps
8
4
  module Imis
9
5
  # Configured accessor for a specific Business Object
@@ -216,10 +212,9 @@ module Usps
216
212
  raise Errors::MissingIdError if api.imis_id.nil?
217
213
 
218
214
  response = submit(authorize(http_get))
219
- klass = business_object_name == 'Party' ? PartyData : Data
220
- result = klass.from_json(response.body)
215
+ result = parse_response(response)
221
216
  logger.json result
222
- result
217
+ wrap_data(result)
223
218
  end
224
219
 
225
220
  # Upload an object to the API
@@ -229,10 +224,22 @@ module Usps
229
224
 
230
225
  request.body = JSON.dump(body)
231
226
  response = submit(authorize(request))
232
- klass = business_object_name == 'Party' ? PartyData : Data
233
- result = klass.from_json(response.body)
227
+ result = parse_response(response)
234
228
  logger.json result
235
- result
229
+ wrap_data(result)
230
+ end
231
+
232
+ def parse_response(response)
233
+ klass = business_object_name == 'Party' ? PartyData : Data
234
+ klass.from_json(response.body)
235
+ end
236
+
237
+ # If a +Model+ subclass is registered for this Business Object, wrap the
238
+ # parsed +Data+ / +PartyData+ in it. Otherwise pass it through unchanged.
239
+ #
240
+ def wrap_data(data)
241
+ model_klass = Models.for_entity(business_object_name)
242
+ model_klass ? model_klass.from_data(data, api:) : data
236
243
  end
237
244
 
238
245
  def block_not_supported!
@@ -15,9 +15,11 @@ module Usps
15
15
 
16
16
  private
17
17
 
18
- # rubocop:disable Metrics/MethodLength
18
+ # rubocop:disable Metrics/MethodLength,Metrics/AbcSize
19
19
  def simplify(data)
20
20
  data = data.to_a if data.is_a?(Query)
21
+ data = data.map { it.is_a?(Models::Base) ? it.data : it } if data.is_a?(Array)
22
+ data = data.data if data.is_a?(Models::Base)
21
23
 
22
24
  return simplify_raw(data) if force_raw_output?
23
25
 
@@ -37,7 +39,7 @@ module Usps
37
39
  data
38
40
  end
39
41
  end
40
- # rubocop:enable Metrics/MethodLength
42
+ # rubocop:enable Metrics/MethodLength,Metrics/AbcSize
41
43
 
42
44
  def simplify_raw(data)
43
45
  return data.raw if data.is_a?(BaseData)
@@ -72,7 +74,7 @@ module Usps
72
74
  end
73
75
  end
74
76
 
75
- return json(value) if @options[:json]
77
+ return json(value) if @options[:force_json]
76
78
  return value if value.is_a?(String) || value.is_a?(Symbol) || value.nil?
77
79
 
78
80
  json(value)
@@ -111,6 +111,7 @@ module Usps
111
111
  # Supports YAML or JSON config data
112
112
  #
113
113
  def configure!
114
+ Usps::Imis::Config.load_dotenv!
114
115
  return if config_path.nil?
115
116
 
116
117
  config_data = YAML.safe_load_file(config_path)
@@ -171,6 +172,7 @@ module Usps
171
172
  def handle_exception!(exception)
172
173
  raise(exception) if options[:trace] || ENV.fetch('TESTING', false) || ENV.fetch('CI', false)
173
174
 
175
+ exception.log_error if exception.is_a?(Imis::Error)
174
176
  exit(2)
175
177
  end
176
178
  end
@@ -112,10 +112,10 @@ Options:
112
112
  - short: S
113
113
  jsonl:
114
114
  - Format array output as JSONL
115
- - short: j
116
- json:
117
- - Format string output also as JSON (i.e. quoted)
118
115
  - short: J
116
+ force_json:
117
+ - Force JSON-compliant output (i.e. quote raw strings) for piping into %{cyan:jq}
118
+ - short: j
119
119
 
120
120
  Configuration:
121
121
  config:
@@ -13,7 +13,6 @@ module Usps
13
13
  end
14
14
  end
15
15
 
16
+ # Load OptionsParserConfig before OptionsParser
16
17
  require_relative 'command_line/options_parser_config'
17
- require_relative 'command_line/help'
18
- require_relative 'command_line/options_parser'
19
- require_relative 'command_line/interface'
18
+ Dir[File.join(__dir__, 'command_line', '*.rb')].each { require_relative it }
@@ -1,10 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'fileutils'
4
-
5
3
  require_relative 'logger'
6
- require_relative 'logger_formatter'
7
- require_relative 'logger_helpers'
8
4
 
9
5
  module Usps
10
6
  module Imis
@@ -15,10 +11,20 @@ module Usps
15
11
  IMIS_ROOT_URL_DEV = 'https://abcdev.imiscloud.com'
16
12
  DEFAULT_GLOBAL_LOG_PATH = '/var/log/imis/imis.log'
17
13
  REQUIRED = %w[username password].freeze
18
- OPTIONAL = %w[environment logger_file global_log_path].freeze
14
+ OPTIONAL = %w[environment logger_file global_log_path pretty_print_api].freeze
19
15
  SETTABLE = (REQUIRED + OPTIONAL).freeze
20
16
 
21
- attr_accessor :username, :password
17
+ class << self
18
+ # Opt-in +.env+ loader. The gem no longer auto-loads dotenv on require —
19
+ # call this from your app boot (or before +Imis.configure+) if you want
20
+ # +ENV+ populated from +.env+. Idempotent.
21
+ #
22
+ def load_dotenv!
23
+ Dotenv.load
24
+ end
25
+ end
26
+
27
+ attr_accessor :username, :password, :pretty_print_api
22
28
  attr_reader :environment, :logger, :logger_level, :logger_file
23
29
 
24
30
  def initialize
@@ -1,10 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'pp'
4
- require 'stringio'
5
-
6
- require_relative 'base_data'
7
-
8
3
  module Usps
9
4
  module Imis
10
5
  # Convenience wrapper for accessing specific properties within an API data response
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Single source of truth for every external (gem + stdlib) dependency the library uses.
4
+ #
5
+ # The Command Line alternate entry declares its own additional dependencies.
6
+
7
+ # Stdlib
8
+ require 'cgi'
9
+ require 'fileutils'
10
+ require 'json'
11
+ require 'logger'
12
+ require 'net/https'
13
+ require 'pp'
14
+ require 'stringio'
15
+ require 'time'
16
+ require 'yaml'
17
+
18
+ # ActiveSupport / ActiveModel
19
+ require 'active_model'
20
+ require 'active_model/type'
21
+ require 'active_support/concern'
22
+ require 'active_support/core_ext/class/attribute'
23
+ require 'active_support/core_ext/enumerable'
24
+ require 'active_support/core_ext/module/delegation'
25
+ require 'active_support/core_ext/object/to_query'
26
+ require 'active_support/core_ext/string/inflections'
27
+ require 'active_support/duration'
28
+ require 'active_support/isolated_execution_state' # Fix constant loading issue with TaggedLogging
29
+ require 'active_support/string_inquirer'
30
+ require 'active_support/tagged_logging'
31
+
32
+ # Others
33
+ require 'dotenv'
@@ -17,8 +17,6 @@ module Usps
17
17
  def initialize(message, metadata = {})
18
18
  super(message)
19
19
  @metadata = metadata
20
-
21
- log_error
22
20
  end
23
21
 
24
22
  # Additional metadata to include in Bugsnag reports
@@ -34,27 +32,22 @@ module Usps
34
32
  metadata == {} ? {} : base_metadata
35
33
  end
36
34
 
35
+ # Log the exception message at error level. Callers (e.g. the CLI's
36
+ # top-level handler) invoke this when an exception escapes user code;
37
+ # not called from +initialize+ so that internally-rescued exceptions
38
+ # (e.g. +Models::Base#identity_from_data+) don't pollute the log.
39
+ #
40
+ def log_error
41
+ Imis.logger(self.class.name).multiline(message, level: :error)
42
+ end
43
+
37
44
  private
38
45
 
39
46
  def base_metadata
40
47
  { api: metadata }
41
48
  end
42
-
43
- def log_error
44
- Imis.logger(self.class.name).multiline(message, level: :error)
45
- end
46
49
  end
47
50
  end
48
51
  end
49
52
 
50
- require_relative 'errors/api_error'
51
- require_relative 'errors/config_error'
52
- require_relative 'errors/locked_id_error'
53
- require_relative 'errors/mapper_error'
54
- require_relative 'errors/missing_id_error'
55
- require_relative 'errors/not_found_error'
56
- require_relative 'errors/response_error'
57
- require_relative 'errors/panel_unimplemented_error'
58
- require_relative 'errors/unexpected_property_type_error'
59
- require_relative 'errors/pattern_matching_error'
60
- require_relative 'errors/command_line_error'
53
+ Dir[File.join(__dir__, 'errors', '*.rb')].each { require_relative it }
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Usps
4
+ module Imis
5
+ module Errors
6
+ # Exception raised when attempting to +find+ an embedded model
7
+ #
8
+ class EmbeddedModelFindError < Error
9
+ attr_reader :name
10
+
11
+ def initialize(name)
12
+ @name = name
13
+ super(message)
14
+ end
15
+
16
+ def message = "Cannot `find` an embedded model: #{name}"
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Usps
4
+ module Imis
5
+ module Errors
6
+ # Raised when +Models::Base#save+ would build an empty payload — i.e. the
7
+ # model has no persistable attributes to send. Currently fires when every
8
+ # changed attribute resolves to a dotted source (which the generic
9
+ # +payload_for+ cannot serialize) or to +nil+.
10
+ #
11
+ class EmptyPayloadError < Error
12
+ attr_reader :model_class
13
+
14
+ def initialize(model_class)
15
+ @model_class = model_class
16
+ super(message)
17
+ end
18
+
19
+ def message = "Cannot save #{model_class}: no persistable attributes in payload"
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Usps
4
+ module Imis
5
+ module Errors
6
+ # Raised when +Party#updated_party_payload+ tries to write a property
7
+ # field whose named slot isn't present in the loaded raw payload. The
8
+ # gem doesn't support creating Party records — every Party model is
9
+ # expected to start from a fully-loaded payload — so a missing slot
10
+ # indicates either a malformed payload or a typo in the +source:+.
11
+ #
12
+ class MissingPartyFieldError < Error
13
+ attr_reader :field
14
+
15
+ def initialize(field)
16
+ @field = field
17
+ super(message)
18
+ end
19
+
20
+ def message = "Party payload has no property entry named #{field.inspect}"
21
+ end
22
+ end
23
+ end
24
+ end
@@ -13,8 +13,6 @@ module Usps
13
13
  super('Unable to match pattern from options', { options: })
14
14
  end
15
15
 
16
- private
17
-
18
16
  def log_error
19
17
  Imis.logger(self.class.name).error('Unable to match pattern from options:')
20
18
  Imis.logger(self.class.name).json(options, level: :error)
@@ -1,8 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'logger_formatter'
4
- require_relative 'logger_helpers'
5
-
6
3
  module Usps
7
4
  module Imis
8
5
  # Formatted logger with additional helpers
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Usps
4
+ module Imis
5
+ module Models
6
+ class IndividualDemog
7
+ belongs_to :party
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Usps
4
+ module Imis
5
+ module Models
6
+ class Base
7
+ # ActiveRecord-style finder methods
8
+ #
9
+ module Finders
10
+ # Fetch all records
11
+ #
12
+ def all(api: Models.default_api, **)
13
+ raise Errors::EmbeddedModelFindError, name if business_object_name.nil?
14
+
15
+ api.query(business_object_name, **)
16
+ end
17
+ alias where all
18
+
19
+ # Fetch a record by +imis_id+. For multi-record Business Objects, pass
20
+ # +record_id:+, and for panels pass +ordinal:+. Always wraps the request in
21
+ # +Api#with+ so caller api state is preserved.
22
+ #
23
+ # @param imis_id [String, Integer] The iMIS ID to use for the request
24
+ # @param child_id [String, Integer] Input for +record_id+ or +ordinal+, based on Model config
25
+ #
26
+ # @raise [Errors::NotFoundError] when the Business Object returns no record
27
+ # @raise [Errors::EmbeddedModelFindError] when called on an embedded (non-Business Object) Model
28
+ #
29
+ def find(imis_id, child_id = nil, api: Models.default_api, record_id: nil, ordinal: nil)
30
+ raise Errors::EmbeddedModelFindError, name if business_object_name.nil?
31
+
32
+ record_id, ordinal = resolve_find_key(child_id, record_id, ordinal)
33
+
34
+ bon = business_object_name
35
+ # Pin record_id explicitly: api.record_id= is a no-op on nil, so a
36
+ # stale @record_id from a prior call would otherwise leak into the
37
+ # URL (e.g. wrong parent in `~{record_id}|{ordinal}` for panels).
38
+ result = api.with(imis_id, record_id: record_id || imis_id) { on(bon, ordinal: ordinal).get }
39
+ raise Errors::NotFoundError, "#{name} #{imis_id} not found" if result.nil?
40
+
41
+ result
42
+ end
43
+
44
+ # Look up a record via an IQA-style query against the Business Object. Returns
45
+ # +nil+ if no record matches (mirroring +ActiveRecord::Base.find_by+).
46
+ #
47
+ def find_by(api: Models.default_api, **conditions)
48
+ raise Errors::EmbeddedModelFindError, name if business_object_name.nil?
49
+ raise ArgumentError, "#{name}.find_by requires at least one condition" if conditions.empty?
50
+
51
+ return unless (result = api.query(business_object_name, **conditions).one)
52
+
53
+ # +Query#wrap+ already wraps registered Business Objects as Models, so the +is_a?+
54
+ # branch handles the common case. The +from_data+ fallback is defensive: it catches
55
+ # non-model-defined Business Objects that may exist on the server but lack a registered
56
+ # wrapper.
57
+ #
58
+ result.is_a?(self) ? result : from_data(result, api:)
59
+ end
60
+
61
+ # Raising form of +find_by+.
62
+ #
63
+ def find_by!(api: Models.default_api, **conditions)
64
+ find_by(api:, **conditions) || raise(Errors::NotFoundError, "#{name} not found by #{conditions.inspect}")
65
+ end
66
+
67
+ private
68
+
69
+ # Select the correct IDs for the request, based on Model config and what was provided
70
+ #
71
+ def resolve_find_key(child_id, record_id, ordinal)
72
+ return [record_id, ordinal] if child_id.nil?
73
+
74
+ find_key == :ordinal ? [record_id, ordinal || child_id] : [record_id || child_id, ordinal]
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,110 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Usps
4
+ module Imis
5
+ module Models
6
+ class Base
7
+ # ActiveRecord-style persistence for +Models::Base+ subclasses:
8
+ # +save+ / +save!+ on dirty instances, +update+ / +update!+ for
9
+ # assign-then-save, plus class-level +create+ / +create!+ shortcuts.
10
+ #
11
+ module Persistence
12
+ extend ActiveSupport::Concern
13
+
14
+ class_methods do
15
+ # Build a new instance with attributes and persist it. Returns the
16
+ # instance whether or not the save succeeded — check +persisted?+.
17
+ #
18
+ def create(**) = new(**).tap(&:save)
19
+
20
+ # Build a new instance with attributes and persist it, raising if
21
+ # validation fails.
22
+ #
23
+ def create!(**) = new(**).tap(&:save!)
24
+ end
25
+
26
+ # Save dirty changes to the iMIS API. Issues +put+ for persisted
27
+ # instances (loaded via +from_data+) and +post+ for new instances.
28
+ # Reloads attributes from the response, clearing dirty state.
29
+ #
30
+ # @return [Boolean] +true+ on success, +false+ if validation failed.
31
+ #
32
+ def save
33
+ return false unless valid?
34
+
35
+ result = persisted? ? perform_update : perform_create
36
+ load_from_data(result.is_a?(Models::Base) ? result.data : result)
37
+ true
38
+ rescue Errors::EmptyPayloadError => e
39
+ errors.add(:base, e.message)
40
+ false
41
+ end
42
+
43
+ # Raising form of +save+.
44
+ #
45
+ def save! = save || raise(ActiveModel::ValidationError, self)
46
+
47
+ # Assign attributes and +save+. Returns +true+ / +false+ matching +save+.
48
+ #
49
+ def update(**)
50
+ assign_attributes(**)
51
+ save
52
+ end
53
+
54
+ # Assign attributes and +save!+. Raises on validation failure.
55
+ #
56
+ def update!(**)
57
+ assign_attributes(**)
58
+ save!
59
+ end
60
+
61
+ private
62
+
63
+ # find / belongs_to dispatch through Api#with, which restores prior
64
+ # api state on block exit — so by the time .save fires, api.imis_id
65
+ # is back to whatever it was (typically nil). Re-pin the request
66
+ # scope here from the model's own identity, mirroring Finders#find.
67
+ #
68
+ def perform_create
69
+ bon = self.class.business_object_name
70
+ payload = ->(accessor) { payload_for(accessor) }
71
+ api.with(imis_id, record_id: record_id || imis_id) do
72
+ accessor = on(bon)
73
+ accessor.post(payload.call(accessor))
74
+ end
75
+ end
76
+
77
+ def perform_update
78
+ bon = self.class.business_object_name
79
+ ord = ordinal
80
+ payload = ->(accessor) { payload_for(accessor) }
81
+ api.with(imis_id, record_id: record_id || imis_id) do
82
+ accessor = on(bon, ordinal: ord)
83
+ accessor.put(payload.call(accessor))
84
+ end
85
+ end
86
+
87
+ # Maps snake_case attribute names back to their iMIS source names
88
+ # and builds the GenericEntityData envelope via +BlankObject+. On
89
+ # update, only changed attributes are sent; on create, all set
90
+ # attributes are.
91
+ #
92
+ def payload_for(accessor)
93
+ fields = persisted? ? changes.transform_values(&:last) : attributes
94
+ named = fields.filter_map { |attr, value| named_field(attr, value) }.to_h
95
+ raise Errors::EmptyPayloadError, self.class if named.empty?
96
+
97
+ BlankObject.new(accessor, ordinal&.to_s).build(named)
98
+ end
99
+
100
+ def named_field(attr, value)
101
+ source = self.class.imis_attribute_map[attr.to_sym]
102
+ return if source.nil? || source.include?('.') || value.nil?
103
+
104
+ [source, value]
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end
110
+ end