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.
- checksums.yaml +4 -4
- data/lib/usps/imis/api.rb +9 -6
- data/lib/usps/imis/base_data.rb +0 -3
- data/lib/usps/imis/blank_object.rb +0 -4
- data/lib/usps/imis/business_object.rb +17 -10
- data/lib/usps/imis/command_line/formatters.rb +5 -3
- data/lib/usps/imis/command_line/interface.rb +2 -0
- data/lib/usps/imis/command_line/options.yml +3 -3
- data/lib/usps/imis/command_line.rb +2 -3
- data/lib/usps/imis/config.rb +12 -6
- data/lib/usps/imis/data.rb +0 -5
- data/lib/usps/imis/dependencies.rb +33 -0
- data/lib/usps/imis/error.rb +10 -17
- data/lib/usps/imis/errors/embedded_model_find_error.rb +20 -0
- data/lib/usps/imis/errors/empty_payload_error.rb +23 -0
- data/lib/usps/imis/errors/missing_party_field_error.rb +24 -0
- data/lib/usps/imis/errors/pattern_matching_error.rb +0 -2
- data/lib/usps/imis/logger.rb +0 -3
- data/lib/usps/imis/models/associations/individual_demog.rb +11 -0
- data/lib/usps/imis/models/base/finders.rb +80 -0
- data/lib/usps/imis/models/base/persistence.rb +110 -0
- data/lib/usps/imis/models/base.rb +279 -0
- data/lib/usps/imis/models/education.rb +25 -0
- data/lib/usps/imis/models/generated/abc_cs_contact.rb +91 -0
- data/lib/usps/imis/models/generated/abc_fed990.rb +17 -0
- data/lib/usps/imis/models/generated/abc_ps_volunteer_skills.rb +16 -0
- data/lib/usps/imis/models/generated/access_area.rb +22 -0
- data/lib/usps/imis/models/generated/access_item.rb +18 -0
- data/lib/usps/imis/models/generated/access_main.rb +18 -0
- data/lib/usps/imis/models/generated/action_plan.rb +21 -0
- data/lib/usps/imis/models/generated/activity.rb +57 -0
- data/lib/usps/imis/models/generated/activity_ldao.rb +58 -0
- data/lib/usps/imis/models/generated/activity_ldcdr.rb +57 -0
- data/lib/usps/imis/models/generated/activity_ldxo.rb +57 -0
- data/lib/usps/imis/models/generated/add_family.rb +13 -0
- data/lib/usps/imis/models/generated/advanced_email_twelve_months_delivered_by_date.rb +16 -0
- data/lib/usps/imis/models/generated/advanced_email_twelve_months_totals.rb +16 -0
- data/lib/usps/imis/models/generated/aec_chapter_events.rb +28 -0
- data/lib/usps/imis/models/generated/aec_chapter_link_all_events.rb +18 -0
- data/lib/usps/imis/models/generated/aec_district_administrators.rb +19 -0
- data/lib/usps/imis/models/generated/aec_district_squadron_admins.rb +14 -0
- data/lib/usps/imis/models/generated/aec_district_squadron_events.rb +15 -0
- data/lib/usps/imis/models/generated/aec_si_r_charge_fee_percentages.rb +14 -0
- data/lib/usps/imis/models/generated/aec_si_r_charge_params.rb +16 -0
- data/lib/usps/imis/models/generated/appeal.rb +39 -0
- data/lib/usps/imis/models/generated/appeal_status_ref.rb +15 -0
- data/lib/usps/imis/models/generated/asc_ps_abc_squadron_price.rb +25 -0
- data/lib/usps/imis/models/generated/atom_panel_purpose.rb +15 -0
- data/lib/usps/imis/models/generated/auto_pay_instruction_detail.rb +22 -0
- data/lib/usps/imis/models/generated/auto_pay_invoices.rb +24 -0
- data/lib/usps/imis/models/generated/auto_pay_invoices_dues.rb +29 -0
- data/lib/usps/imis/models/generated/auto_pay_member_instruction_detail.rb +22 -0
- data/lib/usps/imis/models/generated/auto_pay_membership_invoices_base.rb +28 -0
- data/lib/usps/imis/models/generated/bad_address_reason_ref.rb +18 -0
- data/lib/usps/imis/models/generated/batch_line_status_ref.rb +14 -0
- data/lib/usps/imis/models/generated/billing_cycles.rb +50 -0
- data/lib/usps/imis/models/generated/billing_fees.rb +61 -0
- data/lib/usps/imis/models/generated/billing_fees_by_bill_to_party.rb +20 -0
- data/lib/usps/imis/models/generated/billing_issue_notification_by_bill_run.rb +20 -0
- data/lib/usps/imis/models/generated/billing_issue_notification_by_party.rb +30 -0
- data/lib/usps/imis/models/generated/billing_log_by_bill_cycle_data.rb +28 -0
- data/lib/usps/imis/models/generated/billing_log_by_party.rb +29 -0
- data/lib/usps/imis/models/generated/billing_product.rb +30 -0
- data/lib/usps/imis/models/generated/bo_district_dues.rb +26 -0
- data/lib/usps/imis/models/generated/bo_dues_fees.rb +21 -0
- data/lib/usps/imis/models/generated/bo_dues_pricing.rb +18 -0
- data/lib/usps/imis/models/generated/bo_national_dues.rb +84 -0
- data/lib/usps/imis/models/generated/bo_no_natl_dist_dues.rb +135 -0
- data/lib/usps/imis/models/generated/bo_squadron_dues.rb +26 -0
- data/lib/usps/imis/models/generated/bo_total.rb +17 -0
- data/lib/usps/imis/models/generated/campaign.rb +42 -0
- data/lib/usps/imis/models/generated/campaign_status_ref.rb +15 -0
- data/lib/usps/imis/models/generated/campaign_type_ref.rb +15 -0
- data/lib/usps/imis/models/generated/certification_module_status.rb +14 -0
- data/lib/usps/imis/models/generated/change_log_report.rb +25 -0
- data/lib/usps/imis/models/generated/change_property.rb +18 -0
- data/lib/usps/imis/models/generated/chapt_subscriptions.rb +14 -0
- data/lib/usps/imis/models/generated/chapter.rb +15 -0
- data/lib/usps/imis/models/generated/chapter_events.rb +30 -0
- data/lib/usps/imis/models/generated/commerce_product.rb +47 -0
- data/lib/usps/imis/models/generated/commission_rate_type_ref.rb +14 -0
- data/lib/usps/imis/models/generated/committee.rb +16 -0
- data/lib/usps/imis/models/generated/committee_districts_org_id.rb +16 -0
- data/lib/usps/imis/models/generated/committee_i_ds_temp.rb +13 -0
- data/lib/usps/imis/models/generated/committee_squadrons_org_id.rb +16 -0
- data/lib/usps/imis/models/generated/communication_log_summary_for_charts.rb +15 -0
- data/lib/usps/imis/models/generated/communication_message_type_ref.rb +14 -0
- data/lib/usps/imis/models/generated/communication_reason_ref.rb +22 -0
- data/lib/usps/imis/models/generated/community_items.rb +25 -0
- data/lib/usps/imis/models/generated/community_subscriptions.rb +25 -0
- data/lib/usps/imis/models/generated/comparison_ref.rb +14 -0
- data/lib/usps/imis/models/generated/component_registry.rb +28 -0
- data/lib/usps/imis/models/generated/contact.rb +32 -0
- data/lib/usps/imis/models/generated/contact_birthday_info.rb +20 -0
- data/lib/usps/imis/models/generated/contact_communication_reason_preferences.rb +25 -0
- data/lib/usps/imis/models/generated/contact_detail_report.rb +49 -0
- data/lib/usps/imis/models/generated/contact_offering_ref.rb +14 -0
- data/lib/usps/imis/models/generated/contact_profile_image.rb +22 -0
- data/lib/usps/imis/models/generated/contact_report.rb +23 -0
- data/lib/usps/imis/models/generated/contact_salutation.rb +18 -0
- data/lib/usps/imis/models/generated/contact_skill_ref.rb +14 -0
- data/lib/usps/imis/models/generated/contact_social_network.rb +19 -0
- data/lib/usps/imis/models/generated/contact_status_ref.rb +15 -0
- data/lib/usps/imis/models/generated/contact_type_ref.rb +16 -0
- data/lib/usps/imis/models/generated/content_filter.rb +18 -0
- data/lib/usps/imis/models/generated/content_manager_authority_group.rb +14 -0
- data/lib/usps/imis/models/generated/cost_method_ref.rb +15 -0
- data/lib/usps/imis/models/generated/country_ref.rb +27 -0
- data/lib/usps/imis/models/generated/credit_type_ref.rb +14 -0
- data/lib/usps/imis/models/generated/cs_activity.rb +50 -0
- data/lib/usps/imis/models/generated/cs_activity_basic.rb +51 -0
- data/lib/usps/imis/models/generated/cs_activity_forms.rb +38 -0
- data/lib/usps/imis/models/generated/cs_activity_types.rb +16 -0
- data/lib/usps/imis/models/generated/cs_address.rb +40 -0
- data/lib/usps/imis/models/generated/cs_address_formats.rb +15 -0
- data/lib/usps/imis/models/generated/cs_appeal.rb +23 -0
- data/lib/usps/imis/models/generated/cs_calls.rb +20 -0
- data/lib/usps/imis/models/generated/cs_campaign.rb +20 -0
- data/lib/usps/imis/models/generated/cs_committee.rb +23 -0
- data/lib/usps/imis/models/generated/cs_committee_code.rb +20 -0
- data/lib/usps/imis/models/generated/cs_committee_member.rb +38 -0
- data/lib/usps/imis/models/generated/cs_committee_member_group.rb +15 -0
- data/lib/usps/imis/models/generated/cs_committee_position.rb +16 -0
- data/lib/usps/imis/models/generated/cs_contact.rb +91 -0
- data/lib/usps/imis/models/generated/cs_contact_basic.rb +79 -0
- data/lib/usps/imis/models/generated/cs_country_names.rb +19 -0
- data/lib/usps/imis/models/generated/cs_donations.rb +31 -0
- data/lib/usps/imis/models/generated/cs_donations_detail.rb +33 -0
- data/lib/usps/imis/models/generated/cs_donor_data.rb +21 -0
- data/lib/usps/imis/models/generated/cs_dues_history.rb +22 -0
- data/lib/usps/imis/models/generated/cs_event.rb +92 -0
- data/lib/usps/imis/models/generated/cs_event_history.rb +20 -0
- data/lib/usps/imis/models/generated/cs_exchange_rate.rb +14 -0
- data/lib/usps/imis/models/generated/cs_freight_dollar.rb +14 -0
- data/lib/usps/imis/models/generated/cs_function.rb +57 -0
- data/lib/usps/imis/models/generated/cs_function_fees.rb +20 -0
- data/lib/usps/imis/models/generated/cs_gen_tables_union.rb +15 -0
- data/lib/usps/imis/models/generated/cs_general_lookup_tables.rb +17 -0
- data/lib/usps/imis/models/generated/cs_inventory.rb +37 -0
- data/lib/usps/imis/models/generated/cs_invoice.rb +51 -0
- data/lib/usps/imis/models/generated/cs_iso_currency_codes.rb +14 -0
- data/lib/usps/imis/models/generated/cs_member_type.rb +18 -0
- data/lib/usps/imis/models/generated/cs_name_fin.rb +27 -0
- data/lib/usps/imis/models/generated/cs_name_fr.rb +27 -0
- data/lib/usps/imis/models/generated/cs_name_log.rb +17 -0
- data/lib/usps/imis/models/generated/cs_name_note.rb +18 -0
- data/lib/usps/imis/models/generated/cs_name_picture.rb +19 -0
- data/lib/usps/imis/models/generated/cs_name_user.rb +18 -0
- data/lib/usps/imis/models/generated/cs_order_history.rb +22 -0
- data/lib/usps/imis/models/generated/cs_order_lines.rb +54 -0
- data/lib/usps/imis/models/generated/cs_order_type.rb +15 -0
- data/lib/usps/imis/models/generated/cs_orders.rb +85 -0
- data/lib/usps/imis/models/generated/cs_org_control.rb +47 -0
- data/lib/usps/imis/models/generated/cs_product.rb +49 -0
- data/lib/usps/imis/models/generated/cs_product_category.rb +18 -0
- data/lib/usps/imis/models/generated/cs_product_fundraising.rb +22 -0
- data/lib/usps/imis/models/generated/cs_product_location.rb +14 -0
- data/lib/usps/imis/models/generated/cs_product_type.rb +14 -0
- data/lib/usps/imis/models/generated/cs_reg_functions.rb +36 -0
- data/lib/usps/imis/models/generated/cs_registrant_classes.rb +15 -0
- data/lib/usps/imis/models/generated/cs_registration.rb +39 -0
- data/lib/usps/imis/models/generated/cs_relationship.rb +25 -0
- data/lib/usps/imis/models/generated/cs_relationship_types.rb +17 -0
- data/lib/usps/imis/models/generated/cs_salutations.rb +14 -0
- data/lib/usps/imis/models/generated/cs_staff_user.rb +34 -0
- data/lib/usps/imis/models/generated/cs_state_province_codes.rb +15 -0
- data/lib/usps/imis/models/generated/cs_subscriptions.rb +58 -0
- data/lib/usps/imis/models/generated/cs_subscriptions_chapters.rb +15 -0
- data/lib/usps/imis/models/generated/cs_system_params.rb +15 -0
- data/lib/usps/imis/models/generated/cs_terms.rb +17 -0
- data/lib/usps/imis/models/generated/cs_trans_notify.rb +16 -0
- data/lib/usps/imis/models/generated/cs_web_security_group.rb +14 -0
- data/lib/usps/imis/models/generated/cs_web_user.rb +18 -0
- data/lib/usps/imis/models/generated/culture_ref.rb +14 -0
- data/lib/usps/imis/models/generated/customer_experience_status.rb +14 -0
- data/lib/usps/imis/models/generated/data_type.rb +16 -0
- data/lib/usps/imis/models/generated/data_vault_attempt_settlement_status_ref.rb +15 -0
- data/lib/usps/imis/models/generated/data_vault_attempt_status_ref.rb +14 -0
- data/lib/usps/imis/models/generated/data_vault_attempt_summary.rb +39 -0
- data/lib/usps/imis/models/generated/data_vault_batch_summary.rb +21 -0
- data/lib/usps/imis/models/generated/data_vault_log_attempt.rb +25 -0
- data/lib/usps/imis/models/generated/data_vault_status_ref.rb +14 -0
- data/lib/usps/imis/models/generated/data_vault_status_summary.rb +15 -0
- data/lib/usps/imis/models/generated/data_vault_status_summary_detail.rb +19 -0
- data/lib/usps/imis/models/generated/date_dimension.rb +24 -0
- data/lib/usps/imis/models/generated/day_of_the_week_ref.rb +14 -0
- data/lib/usps/imis/models/generated/discountable_item.rb +20 -0
- data/lib/usps/imis/models/generated/discountable_item_class.rb +15 -0
- data/lib/usps/imis/models/generated/distinct_user_defined_multi_select_properties.rb +17 -0
- data/lib/usps/imis/models/generated/districts_and_primary_members.rb +15 -0
- data/lib/usps/imis/models/generated/document_path.rb +14 -0
- data/lib/usps/imis/models/generated/document_storage.rb +23 -0
- data/lib/usps/imis/models/generated/document_system_size_info.rb +36 -0
- data/lib/usps/imis/models/generated/document_system_size_info_by_type.rb +37 -0
- data/lib/usps/imis/models/generated/document_system_status_count_info.rb +14 -0
- data/lib/usps/imis/models/generated/document_system_status_size_info.rb +15 -0
- data/lib/usps/imis/models/generated/document_system_type_count_info.rb +14 -0
- data/lib/usps/imis/models/generated/document_system_type_size_info.rb +15 -0
- data/lib/usps/imis/models/generated/document_type.rb +34 -0
- data/lib/usps/imis/models/generated/document_type_status_path_info.rb +28 -0
- data/lib/usps/imis/models/generated/donation.rb +31 -0
- data/lib/usps/imis/models/generated/donation_performance.rb +19 -0
- data/lib/usps/imis/models/generated/donation_summary.rb +36 -0
- data/lib/usps/imis/models/generated/dynamic_group.rb +18 -0
- data/lib/usps/imis/models/generated/educ_abc.rb +21 -0
- data/lib/usps/imis/models/generated/educ_boc.rb +21 -0
- data/lib/usps/imis/models/generated/educ_crs.rb +21 -0
- data/lib/usps/imis/models/generated/educ_id.rb +21 -0
- data/lib/usps/imis/models/generated/educ_ot.rb +21 -0
- data/lib/usps/imis/models/generated/educ_sem.rb +21 -0
- data/lib/usps/imis/models/generated/education_in_progress.rb +16 -0
- data/lib/usps/imis/models/generated/education_level_ref.rb +15 -0
- data/lib/usps/imis/models/generated/effective_contact_communication_preferences_data.rb +23 -0
- data/lib/usps/imis/models/generated/effective_fundraising_preferences_data.rb +18 -0
- data/lib/usps/imis/models/generated/engagement_category.rb +23 -0
- data/lib/usps/imis/models/generated/engagement_measure.rb +24 -0
- data/lib/usps/imis/models/generated/engagement_score_current_data.rb +21 -0
- data/lib/usps/imis/models/generated/engagement_score_formula.rb +19 -0
- data/lib/usps/imis/models/generated/engagement_score_monthly_data.rb +22 -0
- data/lib/usps/imis/models/generated/engagement_score_result.rb +21 -0
- data/lib/usps/imis/models/generated/engagement_score_yearly_data.rb +21 -0
- data/lib/usps/imis/models/generated/event_category_list.rb +16 -0
- data/lib/usps/imis/models/generated/event_function_resource_data.rb +22 -0
- data/lib/usps/imis/models/generated/event_question.rb +24 -0
- data/lib/usps/imis/models/generated/event_question_response.rb +25 -0
- data/lib/usps/imis/models/generated/event_registrants_report.rb +45 -0
- data/lib/usps/imis/models/generated/execution_mode_ref.rb +15 -0
- data/lib/usps/imis/models/generated/experience_definition_status.rb +14 -0
- data/lib/usps/imis/models/generated/expired_member_update_detail_log.rb +19 -0
- data/lib/usps/imis/models/generated/family_add_contact.rb +91 -0
- data/lib/usps/imis/models/generated/family_member_count.rb +37 -0
- data/lib/usps/imis/models/generated/file_type_ref.rb +16 -0
- data/lib/usps/imis/models/generated/first_notify_contact_per_gift.rb +14 -0
- data/lib/usps/imis/models/generated/first_payment_date_type_ref.rb +15 -0
- data/lib/usps/imis/models/generated/form_definition_field_data.rb +19 -0
- data/lib/usps/imis/models/generated/form_field_response_data.rb +22 -0
- data/lib/usps/imis/models/generated/fundraising_preference_ref.rb +15 -0
- data/lib/usps/imis/models/generated/fundraising_profile_donor_data.rb +18 -0
- data/lib/usps/imis/models/generated/gateway_result_ref.rb +14 -0
- data/lib/usps/imis/models/generated/gateway_transaction_data.rb +35 -0
- data/lib/usps/imis/models/generated/gateway_transaction_ref.rb +15 -0
- data/lib/usps/imis/models/generated/gateway_type_ref.rb +17 -0
- data/lib/usps/imis/models/generated/gift.rb +41 -0
- data/lib/usps/imis/models/generated/gift_adjustment_log_summary.rb +25 -0
- data/lib/usps/imis/models/generated/gift_aid_claim_status_ref.rb +14 -0
- data/lib/usps/imis/models/generated/gift_array.rb +16 -0
- data/lib/usps/imis/models/generated/gift_detail.rb +29 -0
- data/lib/usps/imis/models/generated/gift_history.rb +45 -0
- data/lib/usps/imis/models/generated/gift_history_summary.rb +33 -0
- data/lib/usps/imis/models/generated/gift_history_summary_basic.rb +33 -0
- data/lib/usps/imis/models/generated/gift_summary.rb +16 -0
- data/lib/usps/imis/models/generated/gift_totals_by_date.rb +15 -0
- data/lib/usps/imis/models/generated/gift_transaction.rb +43 -0
- data/lib/usps/imis/models/generated/gifts_received.rb +32 -0
- data/lib/usps/imis/models/generated/gifts_received_for_receipting.rb +44 -0
- data/lib/usps/imis/models/generated/gifts_received_summary.rb +33 -0
- data/lib/usps/imis/models/generated/gifts_with_void_and_replaced_receipts.rb +43 -0
- data/lib/usps/imis/models/generated/gl_batch_transaction_data.rb +30 -0
- data/lib/usps/imis/models/generated/gl_daily_transaction_data.rb +30 -0
- data/lib/usps/imis/models/generated/gl_detail_due_to_due_from_transaction_data.rb +17 -0
- data/lib/usps/imis/models/generated/gl_detail_transaction_data.rb +36 -0
- data/lib/usps/imis/models/generated/gl_detail_transaction_data_full.rb +36 -0
- data/lib/usps/imis/models/generated/gl_due_to_due_from_transaction_data.rb +18 -0
- data/lib/usps/imis/models/generated/gl_entry_type_ref.rb +14 -0
- data/lib/usps/imis/models/generated/gl_export_format_type_ref.rb +14 -0
- data/lib/usps/imis/models/generated/gl_export_log_detail.rb +15 -0
- data/lib/usps/imis/models/generated/gl_export_log_summary.rb +26 -0
- data/lib/usps/imis/models/generated/gl_export_multiple.rb +15 -0
- data/lib/usps/imis/models/generated/gl_export_summary_level_ref.rb +15 -0
- data/lib/usps/imis/models/generated/gl_monthly_due_to_due_from_transaction_data.rb +18 -0
- data/lib/usps/imis/models/generated/gl_monthly_transaction_data.rb +29 -0
- data/lib/usps/imis/models/generated/gl_source_item_type_ref.rb +14 -0
- data/lib/usps/imis/models/generated/gl_transaction_data.rb +41 -0
- data/lib/usps/imis/models/generated/grade.rb +14 -0
- data/lib/usps/imis/models/generated/group_info.rb +28 -0
- data/lib/usps/imis/models/generated/group_member_administrator_type_ref.rb +15 -0
- data/lib/usps/imis/models/generated/group_member_detail.rb +29 -0
- data/lib/usps/imis/models/generated/group_member_status_ref.rb +15 -0
- data/lib/usps/imis/models/generated/group_perspective.rb +16 -0
- data/lib/usps/imis/models/generated/group_price_sheet.rb +17 -0
- data/lib/usps/imis/models/generated/group_role_ref.rb +17 -0
- data/lib/usps/imis/models/generated/group_status_ref.rb +16 -0
- data/lib/usps/imis/models/generated/group_type_member_status.rb +17 -0
- data/lib/usps/imis/models/generated/group_type_ref.rb +33 -0
- data/lib/usps/imis/models/generated/group_type_role.rb +22 -0
- data/lib/usps/imis/models/generated/handling_price_ref.rb +15 -0
- data/lib/usps/imis/models/generated/hierarchy.rb +21 -0
- data/lib/usps/imis/models/generated/hierarchy_root.rb +22 -0
- data/lib/usps/imis/models/generated/i_series_data.rb +15 -0
- data/lib/usps/imis/models/generated/individual_demog.rb +34 -0
- data/lib/usps/imis/models/generated/institute_type_code_ref.rb +16 -0
- data/lib/usps/imis/models/generated/interaction_log.rb +35 -0
- data/lib/usps/imis/models/generated/interaction_log_event.rb +24 -0
- data/lib/usps/imis/models/generated/interaction_log_event_summary.rb +30 -0
- data/lib/usps/imis/models/generated/interval_type_ref.rb +15 -0
- data/lib/usps/imis/models/generated/invoice_line_data.rb +39 -0
- data/lib/usps/imis/models/generated/invoice_lines.rb +42 -0
- data/lib/usps/imis/models/generated/invoice_number.rb +16 -0
- data/lib/usps/imis/models/generated/invoice_payment_summary.rb +14 -0
- data/lib/usps/imis/models/generated/invoice_purpose.rb +15 -0
- data/lib/usps/imis/models/generated/invoice_source_system_ref.rb +13 -0
- data/lib/usps/imis/models/generated/invoice_type_ref.rb +14 -0
- data/lib/usps/imis/models/generated/journal_entry_type_ref.rb +14 -0
- data/lib/usps/imis/models/generated/license_ref.rb +15 -0
- data/lib/usps/imis/models/generated/line_pricing_ref.rb +15 -0
- data/lib/usps/imis/models/generated/list_entity.rb +14 -0
- data/lib/usps/imis/models/generated/locale_ref.rb +14 -0
- data/lib/usps/imis/models/generated/location_status.rb +14 -0
- data/lib/usps/imis/models/generated/mail_code_ref.rb +16 -0
- data/lib/usps/imis/models/generated/matching_gift_plan_type_ref.rb +15 -0
- data/lib/usps/imis/models/generated/matching_mode_ref.rb +15 -0
- data/lib/usps/imis/models/generated/matching_period_ref.rb +15 -0
- data/lib/usps/imis/models/generated/memorial_tribute_type_ref.rb +14 -0
- data/lib/usps/imis/models/generated/method_set_type_ref.rb +14 -0
- data/lib/usps/imis/models/generated/month_ref.rb +18 -0
- data/lib/usps/imis/models/generated/name_prefixes.rb +15 -0
- data/lib/usps/imis/models/generated/name_suffixes.rb +13 -0
- data/lib/usps/imis/models/generated/navigation_pane.rb +18 -0
- data/lib/usps/imis/models/generated/net_contact.rb +99 -0
- data/lib/usps/imis/models/generated/net_contact_basic.rb +88 -0
- data/lib/usps/imis/models/generated/net_contact_data.rb +88 -0
- data/lib/usps/imis/models/generated/note_purpose_ref.rb +14 -0
- data/lib/usps/imis/models/generated/offering_status.rb +14 -0
- data/lib/usps/imis/models/generated/opportunity_class_ref.rb +15 -0
- data/lib/usps/imis/models/generated/opportunity_default_status_ref.rb +15 -0
- data/lib/usps/imis/models/generated/opportunity_status_ref.rb +15 -0
- data/lib/usps/imis/models/generated/opportunity_task_user.rb +20 -0
- data/lib/usps/imis/models/generated/opportunity_type.rb +29 -0
- data/lib/usps/imis/models/generated/order_category.rb +14 -0
- data/lib/usps/imis/models/generated/order_fulfillment_status_ref.rb +14 -0
- data/lib/usps/imis/models/generated/order_invoice.rb +14 -0
- data/lib/usps/imis/models/generated/order_state_ref.rb +14 -0
- data/lib/usps/imis/models/generated/order_type_detail.rb +17 -0
- data/lib/usps/imis/models/generated/org_demog.rb +28 -0
- data/lib/usps/imis/models/generated/organization_demo.rb +18 -0
- data/lib/usps/imis/models/generated/organization_hierarchy.rb +19 -0
- data/lib/usps/imis/models/generated/package.rb +25 -0
- data/lib/usps/imis/models/generated/package_item.rb +19 -0
- data/lib/usps/imis/models/generated/package_status_ref.rb +14 -0
- data/lib/usps/imis/models/generated/payment_application.rb +31 -0
- data/lib/usps/imis/models/generated/payment_application_detail.rb +35 -0
- data/lib/usps/imis/models/generated/payment_application_restriction_ref.rb +14 -0
- data/lib/usps/imis/models/generated/payment_application_summary.rb +18 -0
- data/lib/usps/imis/models/generated/payment_application_type.rb +14 -0
- data/lib/usps/imis/models/generated/payment_category_ref.rb +14 -0
- data/lib/usps/imis/models/generated/payment_detail_status_ref.rb +15 -0
- data/lib/usps/imis/models/generated/payment_method_data.rb +20 -0
- data/lib/usps/imis/models/generated/payment_reconciliation.rb +26 -0
- data/lib/usps/imis/models/generated/payment_status_ref.rb +14 -0
- data/lib/usps/imis/models/generated/percentile_ranking.rb +20 -0
- data/lib/usps/imis/models/generated/picture_purpose_ref.rb +14 -0
- data/lib/usps/imis/models/generated/pin_update.rb +13 -0
- data/lib/usps/imis/models/generated/pipeline.rb +15 -0
- data/lib/usps/imis/models/generated/pipeline_stage.rb +17 -0
- data/lib/usps/imis/models/generated/postal_code_ref.rb +26 -0
- data/lib/usps/imis/models/generated/prefix_ref.rb +17 -0
- data/lib/usps/imis/models/generated/price_basis_ref.rb +15 -0
- data/lib/usps/imis/models/generated/pricing_type_ref.rb +15 -0
- data/lib/usps/imis/models/generated/primary_fam_members.rb +14 -0
- data/lib/usps/imis/models/generated/process_type_default_owner_all_users.rb +15 -0
- data/lib/usps/imis/models/generated/product_price_sheet.rb +20 -0
- data/lib/usps/imis/models/generated/product_status_ref.rb +15 -0
- data/lib/usps/imis/models/generated/product_trans.rb +31 -0
- data/lib/usps/imis/models/generated/product_trans_detail.rb +17 -0
- data/lib/usps/imis/models/generated/profile_documents.rb +15 -0
- data/lib/usps/imis/models/generated/profile_page.rb +36 -0
- data/lib/usps/imis/models/generated/program_group_status.rb +14 -0
- data/lib/usps/imis/models/generated/program_status.rb +14 -0
- data/lib/usps/imis/models/generated/promotion_rule_ref.rb +15 -0
- data/lib/usps/imis/models/generated/property_definition.rb +33 -0
- data/lib/usps/imis/models/generated/prospect.rb +38 -0
- data/lib/usps/imis/models/generated/publish_priority.rb +14 -0
- data/lib/usps/imis/models/generated/publish_request.rb +18 -0
- data/lib/usps/imis/models/generated/publish_request_detail.rb +22 -0
- data/lib/usps/imis/models/generated/publish_request_status.rb +15 -0
- data/lib/usps/imis/models/generated/publish_server.rb +29 -0
- data/lib/usps/imis/models/generated/quality_ref.rb +15 -0
- data/lib/usps/imis/models/generated/rank.rb +21 -0
- data/lib/usps/imis/models/generated/receipt_report.rb +24 -0
- data/lib/usps/imis/models/generated/receipt_status_ref.rb +15 -0
- data/lib/usps/imis/models/generated/recurring_donation_expected_payment_set.rb +19 -0
- data/lib/usps/imis/models/generated/recurring_donation_expected_payment_set_list.rb +20 -0
- data/lib/usps/imis/models/generated/recurring_donation_expected_payment_set_status.rb +15 -0
- data/lib/usps/imis/models/generated/recurring_donation_expected_payment_status.rb +15 -0
- data/lib/usps/imis/models/generated/recurring_donation_frequency_ref.rb +15 -0
- data/lib/usps/imis/models/generated/reference_date.rb +13 -0
- data/lib/usps/imis/models/generated/registered_component.rb +27 -0
- data/lib/usps/imis/models/generated/registration_status.rb +14 -0
- data/lib/usps/imis/models/generated/relationship.rb +18 -0
- data/lib/usps/imis/models/generated/relationship_category.rb +17 -0
- data/lib/usps/imis/models/generated/relationship_type_category.rb +17 -0
- data/lib/usps/imis/models/generated/relationship_type_ref.rb +16 -0
- data/lib/usps/imis/models/generated/relationship_update.rb +16 -0
- data/lib/usps/imis/models/generated/relationship_update_contact_panel.rb +16 -0
- data/lib/usps/imis/models/generated/remove_district_org_committee_terms.rb +28 -0
- data/lib/usps/imis/models/generated/remove_squadron_org_committee_terms.rb +28 -0
- data/lib/usps/imis/models/generated/reporting_group_user.rb +14 -0
- data/lib/usps/imis/models/generated/response_media_ref.rb +14 -0
- data/lib/usps/imis/models/generated/response_type_ref.rb +15 -0
- data/lib/usps/imis/models/generated/restock_price_ref.rb +15 -0
- data/lib/usps/imis/models/generated/sales_location_status_ref.rb +15 -0
- data/lib/usps/imis/models/generated/salutation_ref.rb +22 -0
- data/lib/usps/imis/models/generated/sbuddy_answers.rb +23 -0
- data/lib/usps/imis/models/generated/sbuddy_definition.rb +28 -0
- data/lib/usps/imis/models/generated/schedule_frequency_ref.rb +14 -0
- data/lib/usps/imis/models/generated/segmentation_job_status_ref.rb +15 -0
- data/lib/usps/imis/models/generated/sequence_counter.rb +16 -0
- data/lib/usps/imis/models/generated/set_district_org_committee_terms.rb +28 -0
- data/lib/usps/imis/models/generated/set_squadron_org_committee_terms.rb +28 -0
- data/lib/usps/imis/models/generated/ship_price_ref.rb +15 -0
- data/lib/usps/imis/models/generated/soa_group.rb +21 -0
- data/lib/usps/imis/models/generated/soa_group_member.rb +19 -0
- data/lib/usps/imis/models/generated/soa_group_member_detail.rb +28 -0
- data/lib/usps/imis/models/generated/social_network_ref.rb +15 -0
- data/lib/usps/imis/models/generated/solicitation.rb +40 -0
- data/lib/usps/imis/models/generated/solicitation_status_ref.rb +15 -0
- data/lib/usps/imis/models/generated/source_code.rb +43 -0
- data/lib/usps/imis/models/generated/source_code_status_ref.rb +15 -0
- data/lib/usps/imis/models/generated/source_code_type_ref.rb +15 -0
- data/lib/usps/imis/models/generated/squad_form_add_fam.rb +23 -0
- data/lib/usps/imis/models/generated/squad_form_add_individual.rb +31 -0
- data/lib/usps/imis/models/generated/squad_leader_add_individual_contact.rb +28 -0
- data/lib/usps/imis/models/generated/squad_note.rb +13 -0
- data/lib/usps/imis/models/generated/squad_to_district.rb +18 -0
- data/lib/usps/imis/models/generated/squadron_chap_com.rb +16 -0
- data/lib/usps/imis/models/generated/squadron_district_lookup.rb +18 -0
- data/lib/usps/imis/models/generated/squadrons_and_primary_members.rb +15 -0
- data/lib/usps/imis/models/generated/standard_page.rb +15 -0
- data/lib/usps/imis/models/generated/state_province_ref.rb +21 -0
- data/lib/usps/imis/models/generated/suffix_ref.rb +16 -0
- data/lib/usps/imis/models/generated/supplement.rb +27 -0
- data/lib/usps/imis/models/generated/supplement_status_ref.rb +15 -0
- data/lib/usps/imis/models/generated/supplement_type_ref.rb +15 -0
- data/lib/usps/imis/models/generated/system_config_xml.rb +14 -0
- data/lib/usps/imis/models/generated/system_param_int.rb +23 -0
- data/lib/usps/imis/models/generated/tag_hierarchy.rb +32 -0
- data/lib/usps/imis/models/generated/tag_relationship_type.rb +16 -0
- data/lib/usps/imis/models/generated/task_item.rb +32 -0
- data/lib/usps/imis/models/generated/task_item_status_ref.rb +15 -0
- data/lib/usps/imis/models/generated/task_latest_log.rb +15 -0
- data/lib/usps/imis/models/generated/task_notify_creator_ref.rb +15 -0
- data/lib/usps/imis/models/generated/task_priority.rb +15 -0
- data/lib/usps/imis/models/generated/task_status.rb +16 -0
- data/lib/usps/imis/models/generated/task_type.rb +15 -0
- data/lib/usps/imis/models/generated/tax_authority_level_ref.rb +15 -0
- data/lib/usps/imis/models/generated/time_zone_ref.rb +20 -0
- data/lib/usps/imis/models/generated/top_level_parent_organization.rb +20 -0
- data/lib/usps/imis/models/generated/transaction_detail.rb +56 -0
- data/lib/usps/imis/models/generated/transaction_summary_large_batch.rb +44 -0
- data/lib/usps/imis/models/generated/uniform_registry.rb +14 -0
- data/lib/usps/imis/models/generated/uniform_tag.rb +17 -0
- data/lib/usps/imis/models/generated/upgrade_log_detail.rb +19 -0
- data/lib/usps/imis/models/generated/url_mapping_type_ref.rb +15 -0
- data/lib/usps/imis/models/generated/user_data.rb +33 -0
- data/lib/usps/imis/models/generated/user_role.rb +14 -0
- data/lib/usps/imis/models/generated/user_token.rb +14 -0
- data/lib/usps/imis/models/generated/vertical_alignment_ref.rb +15 -0
- data/lib/usps/imis/models/generated/vessels.rb +18 -0
- data/lib/usps/imis/models/generated/volunteer_information.rb +22 -0
- data/lib/usps/imis/models/generated/warehouse_status_ref.rb +14 -0
- data/lib/usps/imis/models/generated/warehouse_type_ref.rb +14 -0
- data/lib/usps/imis/models/generated/web_user_control_ref.rb +15 -0
- data/lib/usps/imis/models/generated/workflow_queue_item.rb +25 -0
- data/lib/usps/imis/models/generated/workflow_queue_item_with_status.rb +25 -0
- data/lib/usps/imis/models/generated/workflow_queue_status_ref.rb +15 -0
- data/lib/usps/imis/models/generated/workflow_status_ref.rb +15 -0
- data/lib/usps/imis/models/party/address.rb +32 -0
- data/lib/usps/imis/models/party/alternate_id.rb +16 -0
- data/lib/usps/imis/models/party/email.rb +17 -0
- data/lib/usps/imis/models/party/phone.rb +17 -0
- data/lib/usps/imis/models/party/salutation.rb +18 -0
- data/lib/usps/imis/models/party.rb +131 -0
- data/lib/usps/imis/models/types/upcase_string.rb +18 -0
- data/lib/usps/imis/models/vessel_safety_checks.rb +20 -0
- data/lib/usps/imis/models.rb +57 -0
- data/lib/usps/imis/party_data.rb +1 -6
- data/lib/usps/imis/query.rb +5 -1
- data/lib/usps/imis/version.rb +1 -1
- data/lib/usps/imis.rb +10 -19
- data/spec/support/usps/simple_cov_uncovered_lines_formatter.rb +53 -0
- metadata +477 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: b8075b08c9527b8309ac2e784db46c2e9dc6d922b5a4ee7392fbb493ece0bdb8
|
|
4
|
+
data.tar.gz: 1f37a85470c68ee132e42e10f26cf3d6be97700d160fbd7479d14bdcd3f23474
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
|
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.
|
|
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
|
-
#
|
|
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
|
|
239
|
+
# @return [Hash<Symbol, Array<String>>] Grouped registered Business Objects
|
|
237
240
|
#
|
|
238
241
|
def business_objects
|
|
239
|
-
abc, other =
|
|
242
|
+
abc, other = Models.entity_names.partition { it.include?('ABC') }
|
|
240
243
|
|
|
241
244
|
{ abc:, other: }
|
|
242
245
|
end
|
data/lib/usps/imis/base_data.rb
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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[:
|
|
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
|
-
|
|
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 }
|
data/lib/usps/imis/config.rb
CHANGED
|
@@ -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
|
-
|
|
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
|
data/lib/usps/imis/data.rb
CHANGED
|
@@ -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'
|
data/lib/usps/imis/error.rb
CHANGED
|
@@ -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
|
-
|
|
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
|
data/lib/usps/imis/logger.rb
CHANGED
|
@@ -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
|