twilio-ruby 7.11.1 → 7.11.2
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/CHANGES.md +221 -0
- data/Gemfile.lock +2 -2
- data/README.md +2 -2
- data/lib/rack/twilio_webhook_authentication.rb +45 -2
- data/lib/twilio-ruby/rest/accounts/v1/auth_token_promotion.rb +0 -59
- data/lib/twilio-ruby/rest/accounts/v1/bulk_consents.rb +0 -59
- data/lib/twilio-ruby/rest/accounts/v1/bulk_contacts.rb +0 -59
- data/lib/twilio-ruby/rest/accounts/v1/credential.rb +0 -59
- data/lib/twilio-ruby/rest/accounts/v1/messaging_geopermissions.rb +0 -59
- data/lib/twilio-ruby/rest/accounts/v1/safelist.rb +0 -59
- data/lib/twilio-ruby/rest/accounts/v1/secondary_auth_token.rb +0 -59
- data/lib/twilio-ruby/rest/api/v2010/account/balance.rb +0 -59
- data/lib/twilio-ruby/rest/api/v2010/account/call/payment.rb +0 -59
- data/lib/twilio-ruby/rest/api/v2010/account/call/siprec.rb +0 -59
- data/lib/twilio-ruby/rest/api/v2010/account/call/stream.rb +0 -59
- data/lib/twilio-ruby/rest/api/v2010/account/call/transcription.rb +0 -59
- data/lib/twilio-ruby/rest/api/v2010/account/call/user_defined_message.rb +0 -59
- data/lib/twilio-ruby/rest/api/v2010/account/call/user_defined_message_subscription.rb +0 -59
- data/lib/twilio-ruby/rest/api/v2010/account/message/feedback.rb +0 -59
- data/lib/twilio-ruby/rest/api/v2010/account/message.rb +6 -0
- data/lib/twilio-ruby/rest/api/v2010/account/new_key.rb +0 -59
- data/lib/twilio-ruby/rest/api/v2010/account/new_signing_key.rb +0 -59
- data/lib/twilio-ruby/rest/api/v2010/account/recording/add_on_result/payload/data.rb +0 -59
- data/lib/twilio-ruby/rest/api/v2010/account/sip/domain/auth_types/auth_type_calls.rb +0 -59
- data/lib/twilio-ruby/rest/api/v2010/account/sip/domain/auth_types/auth_type_registrations.rb +0 -59
- data/lib/twilio-ruby/rest/api/v2010/account/sip/domain/auth_types.rb +0 -59
- data/lib/twilio-ruby/rest/api/v2010/account/sip.rb +0 -59
- data/lib/twilio-ruby/rest/api/v2010/account/token.rb +0 -59
- data/lib/twilio-ruby/rest/api/v2010/account/usage.rb +0 -59
- data/lib/twilio-ruby/rest/api/v2010/account/validation_request.rb +0 -59
- data/lib/twilio-ruby/rest/bulkexports/v1/export/job.rb +0 -59
- data/lib/twilio-ruby/rest/bulkexports/v1/export.rb +0 -59
- data/lib/twilio-ruby/rest/bulkexports/v1/export_configuration.rb +0 -59
- data/lib/twilio-ruby/rest/chat/v3/channel.rb +0 -59
- data/lib/twilio-ruby/rest/content/v1/content/approval_create.rb +0 -59
- data/lib/twilio-ruby/rest/content/v1/content/approval_fetch.rb +0 -59
- data/lib/twilio-ruby/rest/conversations/v1/configuration/webhook.rb +0 -59
- data/lib/twilio-ruby/rest/conversations/v1/configuration.rb +0 -59
- data/lib/twilio-ruby/rest/conversations/v1/conversation_with_participants.rb +0 -59
- data/lib/twilio-ruby/rest/conversations/v1/service/configuration/notification.rb +0 -59
- data/lib/twilio-ruby/rest/conversations/v1/service/configuration/webhook.rb +0 -59
- data/lib/twilio-ruby/rest/conversations/v1/service/configuration.rb +0 -59
- data/lib/twilio-ruby/rest/conversations/v1/service/conversation_with_participants.rb +0 -59
- data/lib/twilio-ruby/rest/conversations/v2/action.rb +0 -59
- data/lib/twilio-ruby/rest/conversations/v2/configuration.rb +525 -0
- data/lib/twilio-ruby/rest/conversations/v2/operation.rb +0 -59
- data/lib/twilio-ruby/rest/conversations/v2.rb +10 -4
- data/lib/twilio-ruby/rest/events/v1/schema.rb +0 -59
- data/lib/twilio-ruby/rest/events/v1/sink/sink_test.rb +0 -59
- data/lib/twilio-ruby/rest/events/v1/sink/sink_validate.rb +0 -59
- data/lib/twilio-ruby/rest/flex_api/v1/assessments.rb +12 -14
- data/lib/twilio-ruby/rest/flex_api/v1/configuration.rb +0 -59
- data/lib/twilio-ruby/rest/flex_api/v1/insights_assessments_comment.rb +12 -14
- data/lib/twilio-ruby/rest/flex_api/v1/insights_conversations.rb +12 -14
- data/lib/twilio-ruby/rest/flex_api/v1/insights_questionnaires.rb +12 -14
- data/lib/twilio-ruby/rest/flex_api/v1/insights_questionnaires_category.rb +2 -4
- data/lib/twilio-ruby/rest/flex_api/v1/insights_questionnaires_question.rb +12 -14
- data/lib/twilio-ruby/rest/flex_api/v1/insights_segments.rb +12 -14
- data/lib/twilio-ruby/rest/flex_api/v1/insights_session.rb +0 -59
- data/lib/twilio-ruby/rest/flex_api/v1/insights_settings_answer_sets.rb +0 -59
- data/lib/twilio-ruby/rest/flex_api/v1/insights_settings_comment.rb +0 -59
- data/lib/twilio-ruby/rest/flex_api/v1/insights_user_roles.rb +0 -59
- data/lib/twilio-ruby/rest/flex_api/v1/interaction/interaction_channel/interaction_transfer.rb +0 -59
- data/lib/twilio-ruby/rest/flex_api/v1/interaction.rb +0 -59
- data/lib/twilio-ruby/rest/flex_api/v1/plugin/plugin_versions.rb +2 -4
- data/lib/twilio-ruby/rest/flex_api/v1/plugin.rb +2 -4
- data/lib/twilio-ruby/rest/flex_api/v1/plugin_archive.rb +0 -59
- data/lib/twilio-ruby/rest/flex_api/v1/plugin_configuration/configured_plugin.rb +2 -4
- data/lib/twilio-ruby/rest/flex_api/v1/plugin_configuration.rb +2 -4
- data/lib/twilio-ruby/rest/flex_api/v1/plugin_configuration_archive.rb +0 -59
- data/lib/twilio-ruby/rest/flex_api/v1/plugin_release.rb +2 -4
- data/lib/twilio-ruby/rest/flex_api/v1/plugin_version_archive.rb +0 -59
- data/lib/twilio-ruby/rest/flex_api/v1/provisioning_status.rb +0 -59
- data/lib/twilio-ruby/rest/flex_api/v2/flex_user.rb +0 -59
- data/lib/twilio-ruby/rest/flex_api/v2/web_channels.rb +0 -59
- data/lib/twilio-ruby/rest/frontline_api/v1/user.rb +0 -59
- data/lib/twilio-ruby/rest/iam/v1/api_key.rb +0 -59
- data/lib/twilio-ruby/rest/iam/v1/new_api_key.rb +0 -59
- data/lib/twilio-ruby/rest/iam/v1/o_auth_app.rb +0 -59
- data/lib/twilio-ruby/rest/iam/v1/token.rb +0 -59
- data/lib/twilio-ruby/rest/insights/v1/call/annotation.rb +0 -59
- data/lib/twilio-ruby/rest/insights/v1/call/call_summary.rb +0 -59
- data/lib/twilio-ruby/rest/insights/v1/call.rb +0 -59
- data/lib/twilio-ruby/rest/insights/v1/setting.rb +0 -59
- data/lib/twilio-ruby/rest/insights/v2/inbound.rb +2 -261
- data/lib/twilio-ruby/rest/insights/v2/inbound_report.rb +258 -0
- data/lib/twilio-ruby/rest/insights/v2/outbound.rb +18 -299
- data/lib/twilio-ruby/rest/insights/v2/outbound_report.rb +258 -0
- data/lib/twilio-ruby/rest/insights/v2/report.rb +27 -184
- data/lib/twilio-ruby/rest/insights/v2.rb +14 -4
- data/lib/twilio-ruby/rest/insights/v3/metadata.rb +1 -60
- data/lib/twilio-ruby/rest/insights/v3/query.rb +1 -60
- data/lib/twilio-ruby/rest/insights/v3/query_job.rb +654 -0
- data/lib/twilio-ruby/rest/insights/v3/result.rb +195 -0
- data/lib/twilio-ruby/rest/insights/v3.rb +17 -1
- data/lib/twilio-ruby/rest/intelligence/v2/operator_attachment.rb +0 -59
- data/lib/twilio-ruby/rest/intelligence/v2/operator_attachments.rb +0 -59
- data/lib/twilio-ruby/rest/intelligence/v2/transcript/encrypted_operator_results.rb +0 -59
- data/lib/twilio-ruby/rest/intelligence/v2/transcript/encrypted_sentences.rb +0 -59
- data/lib/twilio-ruby/rest/intelligence/v2/transcript/media.rb +0 -59
- data/lib/twilio-ruby/rest/intelligence/v3/rule_execution.rb +0 -59
- data/lib/twilio-ruby/rest/knowledge/v1/knowledge/knowledge_status.rb +0 -59
- data/lib/twilio-ruby/rest/knowledge/v2/operation.rb +0 -59
- data/lib/twilio-ruby/rest/knowledge/v2/search.rb +0 -59
- data/lib/twilio-ruby/rest/lookups/v1/phone_number.rb +0 -59
- data/lib/twilio-ruby/rest/lookups/v2/bucket.rb +0 -59
- data/lib/twilio-ruby/rest/lookups/v2/lookup_override.rb +0 -59
- data/lib/twilio-ruby/rest/lookups/v2/phone_number.rb +0 -59
- data/lib/twilio-ruby/rest/lookups/v2/query.rb +0 -59
- data/lib/twilio-ruby/rest/lookups/v2/rate_limit.rb +0 -59
- data/lib/twilio-ruby/rest/marketplace/v1/installed_add_on/installed_add_on_usage.rb +0 -59
- data/lib/twilio-ruby/rest/marketplace/v1/module_data.rb +0 -59
- data/lib/twilio-ruby/rest/marketplace/v1/module_data_management.rb +0 -59
- data/lib/twilio-ruby/rest/marketplace/v1/referral_conversion.rb +0 -59
- data/lib/twilio-ruby/rest/memory/v1/bulk.rb +0 -59
- data/lib/twilio-ruby/rest/memory/v1/conversation_summary.rb +2 -4
- data/lib/twilio-ruby/rest/memory/v1/identifier.rb +0 -80
- data/lib/twilio-ruby/rest/memory/v1/identity_resolution_setting.rb +0 -59
- data/lib/twilio-ruby/rest/memory/v1/lookup.rb +0 -59
- data/lib/twilio-ruby/rest/memory/v1/observation.rb +2 -4
- data/lib/twilio-ruby/rest/memory/v1/operation.rb +0 -59
- data/lib/twilio-ruby/rest/memory/v1/recall.rb +0 -59
- data/lib/twilio-ruby/rest/memory/v1/revision.rb +2 -4
- data/lib/twilio-ruby/rest/messaging/v1/brand_registration/brand_registration_otp.rb +0 -59
- data/lib/twilio-ruby/rest/messaging/v1/deactivations.rb +0 -59
- data/lib/twilio-ruby/rest/messaging/v1/domain_certs.rb +0 -59
- data/lib/twilio-ruby/rest/messaging/v1/domain_config.rb +0 -59
- data/lib/twilio-ruby/rest/messaging/v1/domain_config_messaging_service.rb +0 -59
- data/lib/twilio-ruby/rest/messaging/v1/domain_validate_dn.rb +0 -59
- data/lib/twilio-ruby/rest/messaging/v1/external_campaign.rb +0 -59
- data/lib/twilio-ruby/rest/messaging/v1/linkshortening_messaging_service.rb +0 -59
- data/lib/twilio-ruby/rest/messaging/v1/linkshortening_messaging_service_domain_association.rb +0 -59
- data/lib/twilio-ruby/rest/messaging/v1/request_managed_cert.rb +0 -59
- data/lib/twilio-ruby/rest/messaging/v1/service/us_app_to_person.rb +2 -4
- data/lib/twilio-ruby/rest/messaging/v1/service/us_app_to_person_usecase.rb +0 -59
- data/lib/twilio-ruby/rest/messaging/v1/usecase.rb +0 -59
- data/lib/twilio-ruby/rest/messaging/v2/domain_certs.rb +0 -59
- data/lib/twilio-ruby/rest/messaging/v2/typing_indicator.rb +0 -59
- data/lib/twilio-ruby/rest/messaging/v3/typing_indicator.rb +0 -59
- data/lib/twilio-ruby/rest/notify/v1/service/notification.rb +0 -59
- data/lib/twilio-ruby/rest/numbers/v1/bulk_eligibility.rb +0 -59
- data/lib/twilio-ruby/rest/numbers/v1/eligibility.rb +0 -59
- data/lib/twilio-ruby/rest/numbers/v1/embedded_session.rb +0 -59
- data/lib/twilio-ruby/rest/numbers/v1/porting_port_in.rb +0 -59
- data/lib/twilio-ruby/rest/numbers/v1/porting_port_in_phone_number.rb +0 -59
- data/lib/twilio-ruby/rest/numbers/v1/porting_portability.rb +0 -59
- data/lib/twilio-ruby/rest/numbers/v1/porting_webhook_configuration.rb +0 -59
- data/lib/twilio-ruby/rest/numbers/v1/porting_webhook_configuration_delete.rb +0 -59
- data/lib/twilio-ruby/rest/numbers/v1/sender_id_registration.rb +0 -59
- data/lib/twilio-ruby/rest/numbers/v1/sms_verification.rb +0 -59
- data/lib/twilio-ruby/rest/numbers/v1/sms_verification_check.rb +0 -59
- data/lib/twilio-ruby/rest/numbers/v1/voice_verification.rb +0 -59
- data/lib/twilio-ruby/rest/numbers/v1/voice_verification_check.rb +0 -59
- data/lib/twilio-ruby/rest/numbers/v1/webhook.rb +0 -59
- data/lib/twilio-ruby/rest/numbers/v2/bulk_hosted_number_order.rb +0 -59
- data/lib/twilio-ruby/rest/numbers/v2/bundle_clone.rb +0 -59
- data/lib/twilio-ruby/rest/numbers/v2/regulatory_compliance/bundle/replace_items.rb +0 -59
- data/lib/twilio-ruby/rest/numbers/v2/regulatory_compliance.rb +0 -59
- data/lib/twilio-ruby/rest/numbers/v2.rb +0 -16
- data/lib/twilio-ruby/rest/numbers/v3/hosted_number_order.rb +0 -59
- data/lib/twilio-ruby/rest/oauth/v1/authorize.rb +0 -59
- data/lib/twilio-ruby/rest/oauth/v1/token.rb +0 -59
- data/lib/twilio-ruby/rest/oauth/v2/authorize.rb +0 -59
- data/lib/twilio-ruby/rest/oauth/v2/oauth_authorization_server.rb +0 -59
- data/lib/twilio-ruby/rest/oauth/v2/token.rb +2 -61
- data/lib/twilio-ruby/rest/preview/wireless/sim/usage.rb +0 -59
- data/lib/twilio-ruby/rest/preview_iam/v1/authorize.rb +0 -59
- data/lib/twilio-ruby/rest/preview_iam/v1/token.rb +0 -59
- data/lib/twilio-ruby/rest/preview_iam/versionless/organization.rb +0 -59
- data/lib/twilio-ruby/rest/pricing/v1/messaging.rb +0 -59
- data/lib/twilio-ruby/rest/pricing/v1/phone_number.rb +0 -59
- data/lib/twilio-ruby/rest/pricing/v1/voice/number.rb +0 -59
- data/lib/twilio-ruby/rest/pricing/v1/voice.rb +0 -59
- data/lib/twilio-ruby/rest/pricing/v2/number.rb +0 -59
- data/lib/twilio-ruby/rest/pricing/v2/voice/number.rb +0 -59
- data/lib/twilio-ruby/rest/pricing/v2/voice.rb +0 -59
- data/lib/twilio-ruby/rest/routes/v2/phone_number.rb +0 -59
- data/lib/twilio-ruby/rest/routes/v2/sip_domain.rb +0 -59
- data/lib/twilio-ruby/rest/routes/v2/trunk.rb +0 -59
- data/lib/twilio-ruby/rest/routes/v3/phone_number.rb +0 -59
- data/lib/twilio-ruby/rest/serverless/v1/service/build/build_status.rb +0 -59
- data/lib/twilio-ruby/rest/serverless/v1/service/function/function_version/function_version_content.rb +0 -59
- data/lib/twilio-ruby/rest/studio/v1/flow/engagement/engagement_context.rb +0 -59
- data/lib/twilio-ruby/rest/studio/v1/flow/engagement/step/step_context.rb +0 -59
- data/lib/twilio-ruby/rest/studio/v1/flow/execution/execution_context.rb +0 -59
- data/lib/twilio-ruby/rest/studio/v1/flow/execution/execution_step/execution_step_context.rb +0 -59
- data/lib/twilio-ruby/rest/studio/v2/flow/execution/execution_context.rb +0 -59
- data/lib/twilio-ruby/rest/studio/v2/flow/execution/execution_step/execution_step_context.rb +0 -59
- data/lib/twilio-ruby/rest/studio/v2/flow/flow_test_user.rb +0 -59
- data/lib/twilio-ruby/rest/studio/v2/flow_validate.rb +0 -59
- data/lib/twilio-ruby/rest/sync/v1/service/sync_stream/stream_message.rb +0 -59
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace/task_queue/task_queue_bulk_real_time_statistics.rb +0 -59
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace/task_queue/task_queue_cumulative_statistics.rb +0 -59
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace/task_queue/task_queue_real_time_statistics.rb +0 -59
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace/task_queue/task_queue_statistics.rb +0 -59
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace/worker/worker_statistics.rb +0 -59
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace/worker/workers_cumulative_statistics.rb +0 -59
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace/worker/workers_real_time_statistics.rb +0 -59
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace/worker/workers_statistics.rb +0 -59
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace/workflow/workflow_cumulative_statistics.rb +0 -59
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace/workflow/workflow_real_time_statistics.rb +0 -59
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace/workflow/workflow_statistics.rb +0 -59
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace/workspace_cumulative_statistics.rb +0 -59
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace/workspace_real_time_statistics.rb +0 -59
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace/workspace_statistics.rb +0 -59
- data/lib/twilio-ruby/rest/trunking/v1/trunk/recording.rb +0 -59
- data/lib/twilio-ruby/rest/trusthub/v1/a2p_brand_registration.rb +0 -59
- data/lib/twilio-ruby/rest/trusthub/v1/a2p_brand_registration_embedded_session.rb +0 -59
- data/lib/twilio-ruby/rest/trusthub/v1/a2p_campaign_registration.rb +0 -59
- data/lib/twilio-ruby/rest/trusthub/v1/a2p_campaign_registration_embedded_session.rb +0 -59
- data/lib/twilio-ruby/rest/trusthub/v1/compliance_inquiries.rb +0 -59
- data/lib/twilio-ruby/rest/trusthub/v1/compliance_registration_inquiries.rb +0 -59
- data/lib/twilio-ruby/rest/trusthub/v1/compliance_tollfree_inquiries.rb +0 -59
- data/lib/twilio-ruby/rest/trusthub/v1/customer_profiles_provisional_copy.rb +0 -59
- data/lib/twilio-ruby/rest/trusthub/v1/trust_products_provisional_copy.rb +0 -59
- data/lib/twilio-ruby/rest/verify/v2/form.rb +0 -59
- data/lib/twilio-ruby/rest/verify/v2/safelist.rb +0 -59
- data/lib/twilio-ruby/rest/verify/v2/service/access_token.rb +0 -59
- data/lib/twilio-ruby/rest/verify/v2/service/approve_challenge.rb +0 -59
- data/lib/twilio-ruby/rest/verify/v2/service/entity/challenge/notification.rb +0 -59
- data/lib/twilio-ruby/rest/verify/v2/service/entity/new_factor.rb +0 -59
- data/lib/twilio-ruby/rest/verify/v2/service/new_challenge.rb +3 -62
- data/lib/twilio-ruby/rest/verify/v2/service/new_factor.rb +0 -59
- data/lib/twilio-ruby/rest/verify/v2/service/new_verify_factor.rb +0 -59
- data/lib/twilio-ruby/rest/verify/v2/service/verification.rb +8 -61
- data/lib/twilio-ruby/rest/verify/v2/service/verification_check.rb +0 -59
- data/lib/twilio-ruby/rest/verify/v2/verification_attempts_summary.rb +0 -59
- data/lib/twilio-ruby/rest/video/v1/composition_settings.rb +0 -59
- data/lib/twilio-ruby/rest/video/v1/recording_settings.rb +0 -59
- data/lib/twilio-ruby/rest/video/v1/room/participant/anonymize.rb +0 -59
- data/lib/twilio-ruby/rest/video/v1/room/participant/subscribe_rules.rb +0 -59
- data/lib/twilio-ruby/rest/video/v1/room/recording_rules.rb +0 -59
- data/lib/twilio-ruby/rest/voice/v1/archived_call.rb +0 -59
- data/lib/twilio-ruby/rest/voice/v1/dialing_permissions/bulk_country_update.rb +0 -59
- data/lib/twilio-ruby/rest/voice/v1/dialing_permissions/settings.rb +0 -59
- data/lib/twilio-ruby/rest/voice/v1/dialing_permissions.rb +0 -59
- data/lib/twilio-ruby/rest/voice/v2/account_default_configuration.rb +0 -59
- data/lib/twilio-ruby/rest/voice/v2/configuration/default.rb +0 -59
- data/lib/twilio-ruby/rest/voice/v2/configuration.rb +0 -59
- data/lib/twilio-ruby/rest/voice/v2/recording.rb +0 -59
- data/lib/twilio-ruby/rest/voice/v2/transcription.rb +0 -59
- data/lib/twilio-ruby/rest/voice/v2/type.rb +0 -59
- data/lib/twilio-ruby/rest/voice/v3/transcription.rb +259 -50
- data/lib/twilio-ruby/version.rb +1 -1
- metadata +6 -4
- data/lib/twilio-ruby/rest/memory/v1/event.rb +0 -320
- data/lib/twilio-ruby/rest/numbers/v2/caller_id.rb +0 -515
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: e4972b2e50e8c249c2d1363eda7d1ef843f042ff384c69bc6d1750074d770a9b
|
|
4
|
+
data.tar.gz: c8a9a2fecaecd06a3b52dcbc56ff98b53e27b88447feeed5fc3fe8cde2677e67
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: a8de116b65103df280495f5a3f0a796053124899bcbc92a0bfe2a73045ccbcd803cf79c2cbe5276173cfa094ba7793d90e17ba950d3236c601a6b89e28846edf
|
|
7
|
+
data.tar.gz: 8aec018fb3f7037a632125a49c9f744422d39cb0c3beddc6aeb2f4abb19b63c569c4dd890abbc43c6d247fa77c530ff79ca48159fbc5cac59c6044527781aac1
|
data/CHANGES.md
CHANGED
|
@@ -1,5 +1,226 @@
|
|
|
1
1
|
twilio-ruby changelog
|
|
2
2
|
=====================
|
|
3
|
+
[2026-09-09] Version 7.11.2
|
|
4
|
+
---------------------------
|
|
5
|
+
**Library - Chore**
|
|
6
|
+
- [PR #804](https://github.com/twilio/twilio-ruby/pull/804): Update RubyGems publishing steps in workflow. Thanks to [@manisha1997](https://github.com/manisha1997)!
|
|
7
|
+
- [PR #803](https://github.com/twilio/twilio-ruby/pull/803): Update Rakefile. Thanks to [@manisha1997](https://github.com/manisha1997)!
|
|
8
|
+
- [PR #799](https://github.com/twilio/twilio-ruby/pull/799): release gems. Thanks to [@manisha1997](https://github.com/manisha1997)!
|
|
9
|
+
- [PR #798](https://github.com/twilio/twilio-ruby/pull/798): Remove docker push. Thanks to [@manisha1997](https://github.com/manisha1997)!
|
|
10
|
+
- [PR #797](https://github.com/twilio/twilio-ruby/pull/797): version upgrade. Thanks to [@manisha1997](https://github.com/manisha1997)!
|
|
11
|
+
- [PR #796](https://github.com/twilio/twilio-ruby/pull/796): change permission. Thanks to [@manisha1997](https://github.com/manisha1997)!
|
|
12
|
+
|
|
13
|
+
**Audiences**
|
|
14
|
+
- ## 2026-09-01
|
|
15
|
+
- Backticked brace- and angle-bracket-bearing tokens in descriptions for MDX safety.
|
|
16
|
+
- Updated a prose reference to the renamed `FetchCohortSnapshot` operation.
|
|
17
|
+
- ## 2026-08-26
|
|
18
|
+
- **Removed 5 path(s)**:
|
|
19
|
+
- `/preview/Audiences` (AdminListAudiences)
|
|
20
|
+
- `/preview/Audiences/{audienceId}` (AdminGetAudience)
|
|
21
|
+
- `/preview/Snapshots` (AdminListSnapshots)
|
|
22
|
+
- `/preview/Snapshots/{snapshotId}` (AdminGetSnapshot)
|
|
23
|
+
- `/preview/Operations/{operationId}` (AdminGetOperation)
|
|
24
|
+
- ## 2026-08-25
|
|
25
|
+
- Minor updates (formatting, metadata)
|
|
26
|
+
- ## 2026-08-24
|
|
27
|
+
- **Added 1 new path(s)**:
|
|
28
|
+
- `/preview/Snapshots/{cohortSnapshotId}/Operations` (AdminListSnapshotOperations)
|
|
29
|
+
- **Removed 1 path(s)**:
|
|
30
|
+
- `/preview/Snapshots/{snapshotId}/Operations` (ListAdminSnapshotOperations)
|
|
31
|
+
- ## 2026-08-20
|
|
32
|
+
- Renamed all 13 operations so the operationId keyword leads (`AdminGetCohort` -> `FetchAdminCohort`) to meet standard.
|
|
33
|
+
- Set `info` `libraryVisibility` to `hidden` to exclude this admin spec from generation.
|
|
34
|
+
- Added the standard `pageSize`/`pageToken` query parameters to `ListAdminSnapshotOperations`, the only list operation missing them.
|
|
35
|
+
- ## 2026-08-19
|
|
36
|
+
- **Added 5 new path(s)**:
|
|
37
|
+
- `/preview/Cohorts` (AdminListCohorts)
|
|
38
|
+
- `/preview/Cohorts/{cohortId}` (AdminGetCohort)
|
|
39
|
+
- `/preview/CohortSnapshots` (AdminListCohortSnapshots)
|
|
40
|
+
- `/preview/CohortSnapshots/{cohortSnapshotId}` (AdminGetCohortSnapshot)
|
|
41
|
+
- `/preview/CohortOperations/{cohortOperationId}` (AdminGetCohortOperation)
|
|
42
|
+
- ## 2026-09-01
|
|
43
|
+
- Renamed 3 `Get*` operations to `Fetch*` to match the operationId standard: `FetchCohort`, `FetchCohortSnapshot`, `FetchCohortOperation`. The transpiler skips operations whose operationId does not start with a standard keyword, which had been dropping all three from generated output.
|
|
44
|
+
- Set `libraryVisibility` to `private` (was `hidden`) so the spec is eligible for the private docs pipeline.
|
|
45
|
+
- Backticked brace- and angle-bracket-bearing tokens in descriptions for MDX safety.
|
|
46
|
+
- ## 2026-08-28
|
|
47
|
+
- **Removed 6 path(s)**:
|
|
48
|
+
- `/preview/Audiences` (ListAudiences, CreateAudience)
|
|
49
|
+
- `/preview/Audiences/{audienceId}` (FetchAudience, UpdateAudience, DeleteAudience)
|
|
50
|
+
- `/preview/Snapshots` (ListSnapshots, CreateSnapshot)
|
|
51
|
+
- `/preview/Snapshots/{snapshotId}` (FetchSnapshot, DeleteSnapshot)
|
|
52
|
+
- `/preview/Snapshots/{snapshotId}/Profiles` (ListSnapshotProfiles)
|
|
53
|
+
- `/preview/Operations/{operationId}` (FetchOperation)
|
|
54
|
+
- ## 2026-08-20
|
|
55
|
+
- Renamed 6 `Get*` operations to `Fetch*` to match the operationId standard.
|
|
56
|
+
- Hid the deprecated Audiences/Snapshots paths and `/preview/Operations/{operationId}`.
|
|
57
|
+
- Backticked 11 brace-bearing tokens in descriptions for MDX safety.
|
|
58
|
+
|
|
59
|
+
**Conversations**
|
|
60
|
+
- Add PATCH support for partial updates to Configuration
|
|
61
|
+
- Add `VIDEO` to the Conversations v2 Communication channel enum.
|
|
62
|
+
|
|
63
|
+
**Data-ingress**
|
|
64
|
+
- # API Changes
|
|
65
|
+
- ## 2026-09-01
|
|
66
|
+
- Minor updates (formatting, metadata)
|
|
67
|
+
- ## 2026-08-12
|
|
68
|
+
- Minor updates (formatting, metadata)
|
|
69
|
+
- ## 2026-08-12
|
|
70
|
+
- Initial release with 13 paths and 13 operations
|
|
71
|
+
|
|
72
|
+
**Destinations**
|
|
73
|
+
- ## 2026-09-08
|
|
74
|
+
- Added `prod-ie1` to `supportedRealms` and `iamOperationEnabledRealms` for all endpoints
|
|
75
|
+
- ## 2026-09-01
|
|
76
|
+
- Removed the unused `admin-api` placeholder from `supportedRealms` on the public endpoints;
|
|
77
|
+
- One Admin routes now live in `admin_openapi.yaml`.
|
|
78
|
+
- **Added 6 new path(s)** (admin_openapi.yaml):
|
|
79
|
+
- `/v1/ControlPlane/Destinations` (AdminListDestinations)
|
|
80
|
+
- `/v1/ControlPlane/Destinations/{destinationId}` (AdminGetDestination)
|
|
81
|
+
- `/v1/ControlPlane/Subscriptions` (AdminListSubscriptions)
|
|
82
|
+
- `/v1/ControlPlane/Subscriptions/{subscriptionId}` (AdminGetSubscription)
|
|
83
|
+
- `/v1/ControlPlane/Subscriptions/{subscriptionId}/EventTypes` (AdminListSubscribedEvents)
|
|
84
|
+
- `/v1/ControlPlane/Subscriptions/{subscriptionId}/EventTypes/{eventType}` (AdminGetSubscribedEvent)
|
|
85
|
+
- ## 2026-08-26
|
|
86
|
+
- Minor updates (formatting, metadata)
|
|
87
|
+
- ## 2026-08-26
|
|
88
|
+
- Minor updates (formatting, metadata)
|
|
89
|
+
- ## 2026-08-25
|
|
90
|
+
- **Content updates**:
|
|
91
|
+
- Updated description for `CreateDestination`
|
|
92
|
+
- ## 2026-08-12
|
|
93
|
+
- Minor updates (formatting, metadata)
|
|
94
|
+
|
|
95
|
+
**Email**
|
|
96
|
+
- # API Changes
|
|
97
|
+
- ## 2026-09-02
|
|
98
|
+
- **Added 1 new path(s)**:
|
|
99
|
+
- `/v1/Sends/Cohorts` (sendCohort)
|
|
100
|
+
- ## 2026-08-28
|
|
101
|
+
- **Content updates**:
|
|
102
|
+
- Updated summary for `sendTransactional`
|
|
103
|
+
- Added parameter(s) to `sendTransactional`: X-Twilio-Version
|
|
104
|
+
- Updated schema description for `SuppressionsGroup`
|
|
105
|
+
- Added properties to `SuppressionsGroup`: type
|
|
106
|
+
- Removed properties from `SuppressionsGroup`: mode
|
|
107
|
+
- Updated schema description for `SuppressionsGlobal`
|
|
108
|
+
- Added properties to `SuppressionsGlobal`: type
|
|
109
|
+
- Removed properties from `SuppressionsGlobal`: mode
|
|
110
|
+
- Updated schema description for `Suppressions`
|
|
111
|
+
- Updated schema description for `LongRunningOperationResponse`
|
|
112
|
+
- ## 2026-08-27
|
|
113
|
+
- **Content updates**:
|
|
114
|
+
- Updated description for `SendEmail`
|
|
115
|
+
- Added parameter(s) to `SendEmail`: Content-Encoding, Idempotency-Key
|
|
116
|
+
- Updated schema description for `Envelope`
|
|
117
|
+
- Updated schema description for `SuppressionsGroup`
|
|
118
|
+
- Updated schema description for `SuppressionsGlobal`
|
|
119
|
+
|
|
120
|
+
**Iam**
|
|
121
|
+
- Removed redirect_urls from the GET /v1/Account/AuthorizedApps/{consentSid} response
|
|
122
|
+
- Added company_name, homepage_url, tos_url, and redirect_urls to the GET /v1/Account/AuthorizedApps/{consentSid} response
|
|
123
|
+
- Added GET /v1/Account/AuthorizedApps/{consentSid} - fetch authorized app details, including allowed permissions, by consent identifier SID
|
|
124
|
+
- added container-scoped entitlements endpoint (GET /v2/Container/{containerId}/Entitlements)
|
|
125
|
+
|
|
126
|
+
**Instrumentation**
|
|
127
|
+
- # API Changes
|
|
128
|
+
- ## 2026-09-04
|
|
129
|
+
- **Content updates**:
|
|
130
|
+
- Added `IdempotencyKeyHeader` to Create/Patch/Delete `AutoInstrumentationRule`; corrected the shared header's description
|
|
131
|
+
- Added `operationId`/`createdAt` to `LongRunningOperationResponse`; corrected example `status` from `RUNNING` to `PENDING`
|
|
132
|
+
- Renamed `Signal.timestamp` → `occurredAt`, `HourlyStats.hourTimestamp` → `hourAt`; uppercased `Signal.type` and `ListSignals`' `signalType` enums to SCREAMING_SNAKE_CASE
|
|
133
|
+
- Renamed `UserBehaviors` request/response fields to camelCase; added the `summaryDelivery` webhook callback
|
|
134
|
+
- Reshaped `PaginationMeta` (added required `key`, corrected `pageSize` bounds) and all 6 list operations (`ListEventSources`, `ListEventSourceDatasets`, `ListEventSchemas`, `ListAutoInstrumentationRules`, `ListSignals`, `ListSignalStats`) to the `meta` envelope; added `ListSignalStats`' `500` response
|
|
135
|
+
- Narrowed the domain's default `supportedRealms` to `dev-us1` only; `POST /v1/UserBehaviors` (`AnalyzeUserBehaviors`) keeps its own `dev-us1`/`stage-us1` override (prod withheld pending stage validation) — every other operation is now dev-only
|
|
136
|
+
- ## 2026-08-31
|
|
137
|
+
- **Content updates**:
|
|
138
|
+
- Fixed stale `tdi_` TTID prefix throughout (path params, examples, transaction URLs) to `events_`; unified dataset/schema ID formats (`tdi_dat_`/`tdi_dataset_` → `events_dataset_`, `tdi_schema_` → `events_evsch_`); fixed rule-version examples to match the real `version: integer` field
|
|
139
|
+
- Fixed `operationId` to use the domain-agnostic `proc_job_` TTID prefix; corrected the `OperationId` parameter's length constraint (`max=34` → `max=35`) and added a `pattern`
|
|
140
|
+
- Fixed two length constraints hardcoded for the old `tdi_` prefix length: `IngestEventBatch`'s `sourceId` path parameter (`maxLength` 37 → 40); removed the stale, redundant `Twilio-Write-Key` header parameter
|
|
141
|
+
- Added the missing `AutoInstrumentationRuleId` regex `pattern`
|
|
142
|
+
- Fixed `info.title` ("Twilio Data Ingress - Instrumentation API" → "Events Domain - Instrumentation API")
|
|
143
|
+
- **Added 1 new API path**:
|
|
144
|
+
- `/v1/UserBehaviors` (AnalyzeUserBehaviors)
|
|
145
|
+
- ## 2026-07-28
|
|
146
|
+
- **Initial release** — 21 paths, 37 operations across three API surfaces:
|
|
147
|
+
- **Control Plane** (`/v1/ControlPlane/…`):
|
|
148
|
+
- `/v1/ControlPlane/EventSources` (CreateEventSource, ListEventSources)
|
|
149
|
+
- `/v1/ControlPlane/EventSources/{sourceId}` (FetchEventSource, PatchEventSource, DeleteEventSource)
|
|
150
|
+
- `/v1/ControlPlane/EventSources/{sourceId}/WriteKeys` (CreateWriteKey, ListWriteKeys)
|
|
151
|
+
- `/v1/ControlPlane/EventSources/{sourceId}/WriteKeys/{writeKey}` (DeleteWriteKey)
|
|
152
|
+
- `/v1/ControlPlane/EventSources/{sourceId}/Datasets` (CreateEventSourceDataset, ListEventSourceDatasets)
|
|
153
|
+
- `/v1/ControlPlane/EventSources/{sourceId}/Datasets/{datasetId}` (FetchEventSourceDataset, PatchEventSourceDataset, DeleteEventSourceDataset)
|
|
154
|
+
- `/v1/ControlPlane/EventSources/{sourceId}/EventSchemas` (CreateEventSchema, ListEventSchemas)
|
|
155
|
+
- `/v1/ControlPlane/EventSources/{sourceId}/EventSchemas/{schemaId}` (FetchEventSchema, PatchEventSchema, DeleteEventSchema)
|
|
156
|
+
- `/v1/ControlPlane/EventSources/{sourceId}/AutoInstrumentationRules` (CreateAutoInstrumentationRule, ListAutoInstrumentationRules)
|
|
157
|
+
- `/v1/ControlPlane/EventSources/{sourceId}/AutoInstrumentationRules/{autoInstrumentationRuleId}` (FetchAutoInstrumentationRule, PatchAutoInstrumentationRule, DeleteAutoInstrumentationRule)
|
|
158
|
+
- `/v1/ControlPlane/EventSources/{sourceId}/AutoInstrumentationRules/{autoInstrumentationRuleId}/Versions` (ListAutoInstrumentationRuleVersions)
|
|
159
|
+
- `/v1/ControlPlane/EventSources/{sourceId}/AutoInstrumentationRules/{autoInstrumentationRuleId}/Versions/{version}` (FetchAutoInstrumentationRuleVersion)
|
|
160
|
+
- `/v1/ControlPlane/Datasets` (ListDatasets)
|
|
161
|
+
- `/v1/ControlPlane/Datasets/{datasetId}` (FetchDataset)
|
|
162
|
+
- `/v1/ControlPlane/Operations/{operationId}` (FetchControlPlaneOperationStatus)
|
|
163
|
+
- `/v1/ControlPlane/Datasets` (ListDatasets)
|
|
164
|
+
- `/v1/ControlPlane/Datasets/{datasetId}` (FetchDataset)
|
|
165
|
+
- **Event Ingestion** (`/v1/EventSources/…`):
|
|
166
|
+
- `/v1/EventSources/{sourceId}/Batch` (IngestEventBatch)
|
|
167
|
+
- `/v1/EventSources/{sourceId}/AutoInstrumentationRules/{autoInstrumentationRuleId}/Preview` (TriggerAutoInstrumentationPreview)
|
|
168
|
+
- `/v1/EventSources/{sourceId}/AutoInstrumentationRules/{autoInstrumentationRuleId}/Preview/{operationId}` (GetAutoInstrumentationPreviewResult)
|
|
169
|
+
- **Signal API** (`/v1/EventSources/…`):
|
|
170
|
+
- `/v1/EventSources/{sourceId}/Signals` (IngestSignals, ListSignals)
|
|
171
|
+
- `/v1/EventSources/{sourceId}/Signals/{signalKey}` (GetSignalBySignalKey)
|
|
172
|
+
- `/v1/EventSources/{sourceId}/SignalStats` (ListSignalStats)
|
|
173
|
+
|
|
174
|
+
**Memory**
|
|
175
|
+
- ## 2026-08-18
|
|
176
|
+
- **Breaking change**:
|
|
177
|
+
- Removed the deprecated `CSV` and `DATASET` values from the `DataMappingType` enum.
|
|
178
|
+
- `INGRESS`, `DATASET_CLOUDAPP`, and `DATASET_WAREHOUSE` are the only valid values now.
|
|
179
|
+
- Removed the `DataMappingFromCSV` and `DataMappingFromDataSet` schemas and their
|
|
180
|
+
- `oneOf`/discriminator entries on `DataMappingFromTypes`, along with the corresponding
|
|
181
|
+
- `CSV`/`DATASET` discriminator mapping keys.
|
|
182
|
+
- Any caller still sending `type: CSV` or `type: DATASET` on `AdminListDataMappings`
|
|
183
|
+
- (filtering by those values) will get a 400.
|
|
184
|
+
- ## 2026-08-27
|
|
185
|
+
- **Added 2 new path(s)** for Trait Extraction Strategies:
|
|
186
|
+
- `/v1/ControlPlane/TraitExtractionStrategies` (ListTraitExtractionStrategies, CreateTraitExtractionStrategy)
|
|
187
|
+
- `/v1/ControlPlane/TraitExtractionStrategies/{traitStrategyId}` (FetchTraitExtractionStrategy, UpdateTraitExtractionStrategy, DeleteTraitExtractionStrategy)
|
|
188
|
+
- ## 2026-08-18
|
|
189
|
+
- **Breaking change**:
|
|
190
|
+
- Removed the deprecated `CSV` and `DATASET` values from the `DataMappingType` enum.
|
|
191
|
+
- `INGRESS`, `DATASET_CLOUDAPP`, and `DATASET_WAREHOUSE` are the only valid values now.
|
|
192
|
+
- Removed the `DataMappingFromCSV` and `DataMappingFromDataSet` schemas and their
|
|
193
|
+
- `oneOf`/discriminator entries on `DataMappingFromTypes`, along with the corresponding
|
|
194
|
+
- `CSV`/`DATASET` discriminator mapping keys.
|
|
195
|
+
- Any caller still sending `type: CSV` or `type: DATASET` on `CreateDataMapping` or
|
|
196
|
+
- `UpdateDataMapping` (or filtering `ListDataMappings`/`ListDataMappingSuggestions` by
|
|
197
|
+
- those values) will get a 400.
|
|
198
|
+
|
|
199
|
+
**Messaging**
|
|
200
|
+
- Add SenderIdentity, SenderType, and SenderRegion filter query parameters to list numbers and senders endpoint (beta)
|
|
201
|
+
- Add capabilities field to the numbers and senders response (beta)
|
|
202
|
+
- Remove the WhatsApp Senders v1 endpoints (`/v1/Channels/WhatsApp/Senders`) from RestProxy; the sender was routed to the sunsetting `messaging-whatsapp-k8s-orch` downstream. Use the Senders v2 API (`/v2/Channels/Senders`) instead.
|
|
203
|
+
|
|
204
|
+
**Verify**
|
|
205
|
+
- Add `Templates` optional parameter on Verification creation (a stringified JSON array of `sid`/`substitutions` entries). When provided, `Templates` takes precedence over `TemplateSid`.
|
|
206
|
+
|
|
207
|
+
**Voice**
|
|
208
|
+
- ## 2026-09-03
|
|
209
|
+
- Added `links.conversation` to Transcription resources as the absolute Conversations API URL for the
|
|
210
|
+
- transcript's `conversationId`. It is present once the transcript has been stored; the `links` object
|
|
211
|
+
- is omitted otherwise.
|
|
212
|
+
- ## 2026-09-01
|
|
213
|
+
- Removed `mediaUrl` from `CreateRequestWithMediaUrl`'s required fields so a request with neither `sourceId` nor `mediaUrl` reaches the downstream service, which rejects it with the specific error code 17500 instead of a generic gateway 400
|
|
214
|
+
- Set `additionalProperties: false` on both `CreateRequestWithSourceId` and `CreateRequestWithMediaUrl` so the two `oneOf` variants stay mutually exclusive: `sourceId` is undeclared on the media-URL variant and `mediaUrl` is undeclared on the source-ID variant, keeping every request shape resolvable to exactly one variant
|
|
215
|
+
- ## 2026-08-05
|
|
216
|
+
- Added GET /v3/Transcriptions to list and filter transcriptions (status, sourceId, languageCode, createdAfter/createdBefore) with pageSize/pageToken pagination. createdAfter is inclusive and createdBefore exclusive. Returns 422 (error code 17535) when a sourceId's historical item count exceeds the service scan cap
|
|
217
|
+
|
|
218
|
+
**Webhooks**
|
|
219
|
+
- # API Changes
|
|
220
|
+
- ## 2026-08-24
|
|
221
|
+
- **Changed**: Created Webhooks Config API ( https://docs.google.com/document/d/1zkAJD8a8MgoxWifdYDl_d465Az3W6CcD9fuCC2xlSXE/edit?tab=t.0#heading=h.u9e0ry6oe89j ), that includes 7 new resource(s)**: SharedKeys, AuthProfiles, Settings, Rules, Operations, Tests, EdgeZones in /v1/Webhooks referencing webhooks-config downstream.
|
|
222
|
+
|
|
223
|
+
|
|
3
224
|
[2026-08-13] Version 7.11.1
|
|
4
225
|
---------------------------
|
|
5
226
|
- chore: change permission
|
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
twilio-ruby (7.11.
|
|
4
|
+
twilio-ruby (7.11.2)
|
|
5
5
|
faraday (>= 2.0, < 3.0)
|
|
6
6
|
jwt (>= 1.5, < 4.0)
|
|
7
7
|
nokogiri (>= 1.6, < 2.0)
|
|
@@ -144,7 +144,7 @@ CHECKSUMS
|
|
|
144
144
|
rubocop-ast (1.50.0) sha256=b9ca88300da0803ee222ad20cdb30494c0a784eed06fdc35d254b06d662788db
|
|
145
145
|
ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33
|
|
146
146
|
simplecov (1.0.3) sha256=38ef0514f16ae7562f0d0f4df02610071115103d301b6de7dacbcc000082e39b
|
|
147
|
-
twilio-ruby (7.11.
|
|
147
|
+
twilio-ruby (7.11.2)
|
|
148
148
|
unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42
|
|
149
149
|
unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f
|
|
150
150
|
uri (1.1.1) sha256=379fa58d27ffb1387eaada68c749d1426738bd0f654d812fcc07e7568f5c57c6
|
data/README.md
CHANGED
|
@@ -39,13 +39,13 @@ This library supports the following Ruby implementations:
|
|
|
39
39
|
To install using [Bundler][bundler] grab the latest stable version:
|
|
40
40
|
|
|
41
41
|
```ruby
|
|
42
|
-
gem 'twilio-ruby', '~> 7.11.
|
|
42
|
+
gem 'twilio-ruby', '~> 7.11.2'
|
|
43
43
|
```
|
|
44
44
|
|
|
45
45
|
To manually install `twilio-ruby` via [Rubygems][rubygems] simply gem install:
|
|
46
46
|
|
|
47
47
|
```bash
|
|
48
|
-
gem install twilio-ruby -v 7.11.
|
|
48
|
+
gem install twilio-ruby -v 7.11.2
|
|
49
49
|
```
|
|
50
50
|
|
|
51
51
|
To build and install the development branch yourself from the latest source:
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require 'rack/media_type'
|
|
4
|
+
require 'rack/utils'
|
|
4
5
|
|
|
5
6
|
module Rack
|
|
6
7
|
# Middleware that authenticates webhooks from Twilio using the request
|
|
@@ -33,7 +34,7 @@ module Rack
|
|
|
33
34
|
end
|
|
34
35
|
|
|
35
36
|
def call(env)
|
|
36
|
-
return @app.call(env) unless env['PATH_INFO']
|
|
37
|
+
return @app.call(env) unless protected_path?(env['PATH_INFO'])
|
|
37
38
|
request = Rack::Request.new(env)
|
|
38
39
|
original_url = request.url
|
|
39
40
|
params = extract_params!(request)
|
|
@@ -51,6 +52,48 @@ module Rack
|
|
|
51
52
|
end
|
|
52
53
|
end
|
|
53
54
|
|
|
55
|
+
# Decide whether a request path needs its signature validated.
|
|
56
|
+
#
|
|
57
|
+
# PATH_INFO arrives percent-encoded, but the routers we sit in front of
|
|
58
|
+
# (Rails, Sinatra) decode and normalize the path before matching it against
|
|
59
|
+
# their routes. Comparing the configured patterns against the raw PATH_INFO
|
|
60
|
+
# alone therefore lets a request like `/%76oice` slip past this middleware
|
|
61
|
+
# unvalidated and still reach the `/voice` action.
|
|
62
|
+
#
|
|
63
|
+
# We compare against every form the path could take downstream and validate
|
|
64
|
+
# if any of them matches. Erring towards validating means a path we can't
|
|
65
|
+
# make sense of is still checked rather than waved through.
|
|
66
|
+
def protected_path?(path)
|
|
67
|
+
path = path.to_s
|
|
68
|
+
candidates = [path, decode(path)]
|
|
69
|
+
candidates << remove_dot_segments(candidates.last)
|
|
70
|
+
candidates.uniq.any? { |candidate| candidate.match(@path_regex) }
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# Percent-decode a path the way a downstream router would. `unescape_path`
|
|
74
|
+
# (rather than `unescape`) leaves `+` alone, since a plus is a literal plus
|
|
75
|
+
# in a path and only means a space in a query string. Undecodable bytes are
|
|
76
|
+
# scrubbed, as matching a Regexp against invalid UTF-8 raises.
|
|
77
|
+
def decode(path)
|
|
78
|
+
decoded = Rack::Utils.unescape_path(path)
|
|
79
|
+
decoded.valid_encoding? ? decoded : decoded.scrub
|
|
80
|
+
rescue ArgumentError
|
|
81
|
+
path
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# Collapse `.`, `..` and repeated slashes, so an anchored pattern such as
|
|
85
|
+
# %r{\A/voice\z} still recognizes `/sms/../voice`.
|
|
86
|
+
def remove_dot_segments(path)
|
|
87
|
+
segments = path.split('/').each_with_object([]) do |segment, resolved|
|
|
88
|
+
case segment
|
|
89
|
+
when '', '.' then next
|
|
90
|
+
when '..' then resolved.pop
|
|
91
|
+
else resolved << segment
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
"/#{segments.join('/')}"
|
|
95
|
+
end
|
|
96
|
+
|
|
54
97
|
# Extract the params from the the request that we can use to determine the
|
|
55
98
|
# signature. This _may_ modify the passed in request since it may read/rewind
|
|
56
99
|
# the body.
|
|
@@ -67,6 +110,6 @@ module Rack
|
|
|
67
110
|
end
|
|
68
111
|
end
|
|
69
112
|
|
|
70
|
-
private :extract_params
|
|
113
|
+
private :extract_params!, :protected_path?, :decode, :remove_dot_segments
|
|
71
114
|
end
|
|
72
115
|
end
|
|
@@ -205,65 +205,6 @@ module Twilio
|
|
|
205
205
|
end
|
|
206
206
|
end
|
|
207
207
|
|
|
208
|
-
class AuthTokenPromotionPageMetadata < PageMetadata
|
|
209
|
-
attr_reader :auth_token_promotion_page
|
|
210
|
-
|
|
211
|
-
def initialize(version, response, solution, limit)
|
|
212
|
-
super(version, response)
|
|
213
|
-
@auth_token_promotion_page = []
|
|
214
|
-
@limit = limit
|
|
215
|
-
key = get_key(response.body)
|
|
216
|
-
records = 0
|
|
217
|
-
while( limit != :unset && records < limit )
|
|
218
|
-
@auth_token_promotion_page << AuthTokenPromotionListResponse.new(version, @payload, key, limit - records)
|
|
219
|
-
@payload = self.next_page
|
|
220
|
-
break unless @payload
|
|
221
|
-
records += (@payload.body[key] || []).size
|
|
222
|
-
end
|
|
223
|
-
# Path Solution
|
|
224
|
-
@solution = solution
|
|
225
|
-
end
|
|
226
|
-
|
|
227
|
-
def each
|
|
228
|
-
@auth_token_promotion_page.each do |record|
|
|
229
|
-
yield record
|
|
230
|
-
end
|
|
231
|
-
end
|
|
232
|
-
|
|
233
|
-
def to_s
|
|
234
|
-
'<Twilio::REST::Accounts::V1PageMetadata>';
|
|
235
|
-
end
|
|
236
|
-
end
|
|
237
|
-
class AuthTokenPromotionListResponse < InstanceListResource
|
|
238
|
-
|
|
239
|
-
# @param [Array<AuthTokenPromotionInstance>] instance
|
|
240
|
-
# @param [Hash{String => Object}] headers
|
|
241
|
-
# @param [Integer] status_code
|
|
242
|
-
def initialize(version, payload, key, limit = :unset)
|
|
243
|
-
data_list = payload.body[key] || []
|
|
244
|
-
if limit != :unset
|
|
245
|
-
data_list = data_list[0, limit]
|
|
246
|
-
end
|
|
247
|
-
@auth_token_promotion = data_list.map do |data|
|
|
248
|
-
AuthTokenPromotionInstance.new(version, data)
|
|
249
|
-
end
|
|
250
|
-
@headers = payload.headers
|
|
251
|
-
@status_code = payload.status_code
|
|
252
|
-
end
|
|
253
|
-
|
|
254
|
-
def auth_token_promotion
|
|
255
|
-
@auth_token_promotion
|
|
256
|
-
end
|
|
257
|
-
|
|
258
|
-
def headers
|
|
259
|
-
@headers
|
|
260
|
-
end
|
|
261
|
-
|
|
262
|
-
def status_code
|
|
263
|
-
@status_code
|
|
264
|
-
end
|
|
265
|
-
end
|
|
266
|
-
|
|
267
208
|
class AuthTokenPromotionInstance < InstanceResource
|
|
268
209
|
##
|
|
269
210
|
# Initialize the AuthTokenPromotionInstance
|
|
@@ -126,65 +126,6 @@ module Twilio
|
|
|
126
126
|
end
|
|
127
127
|
end
|
|
128
128
|
|
|
129
|
-
class BulkConsentsPageMetadata < PageMetadata
|
|
130
|
-
attr_reader :bulk_consents_page
|
|
131
|
-
|
|
132
|
-
def initialize(version, response, solution, limit)
|
|
133
|
-
super(version, response)
|
|
134
|
-
@bulk_consents_page = []
|
|
135
|
-
@limit = limit
|
|
136
|
-
key = get_key(response.body)
|
|
137
|
-
records = 0
|
|
138
|
-
while( limit != :unset && records < limit )
|
|
139
|
-
@bulk_consents_page << BulkConsentsListResponse.new(version, @payload, key, limit - records)
|
|
140
|
-
@payload = self.next_page
|
|
141
|
-
break unless @payload
|
|
142
|
-
records += (@payload.body[key] || []).size
|
|
143
|
-
end
|
|
144
|
-
# Path Solution
|
|
145
|
-
@solution = solution
|
|
146
|
-
end
|
|
147
|
-
|
|
148
|
-
def each
|
|
149
|
-
@bulk_consents_page.each do |record|
|
|
150
|
-
yield record
|
|
151
|
-
end
|
|
152
|
-
end
|
|
153
|
-
|
|
154
|
-
def to_s
|
|
155
|
-
'<Twilio::REST::Accounts::V1PageMetadata>';
|
|
156
|
-
end
|
|
157
|
-
end
|
|
158
|
-
class BulkConsentsListResponse < InstanceListResource
|
|
159
|
-
|
|
160
|
-
# @param [Array<BulkConsentsInstance>] instance
|
|
161
|
-
# @param [Hash{String => Object}] headers
|
|
162
|
-
# @param [Integer] status_code
|
|
163
|
-
def initialize(version, payload, key, limit = :unset)
|
|
164
|
-
data_list = payload.body[key] || []
|
|
165
|
-
if limit != :unset
|
|
166
|
-
data_list = data_list[0, limit]
|
|
167
|
-
end
|
|
168
|
-
@bulk_consents = data_list.map do |data|
|
|
169
|
-
BulkConsentsInstance.new(version, data)
|
|
170
|
-
end
|
|
171
|
-
@headers = payload.headers
|
|
172
|
-
@status_code = payload.status_code
|
|
173
|
-
end
|
|
174
|
-
|
|
175
|
-
def bulk_consents
|
|
176
|
-
@bulk_consents
|
|
177
|
-
end
|
|
178
|
-
|
|
179
|
-
def headers
|
|
180
|
-
@headers
|
|
181
|
-
end
|
|
182
|
-
|
|
183
|
-
def status_code
|
|
184
|
-
@status_code
|
|
185
|
-
end
|
|
186
|
-
end
|
|
187
|
-
|
|
188
129
|
class BulkConsentsInstance < InstanceResource
|
|
189
130
|
##
|
|
190
131
|
# Initialize the BulkConsentsInstance
|
|
@@ -126,65 +126,6 @@ module Twilio
|
|
|
126
126
|
end
|
|
127
127
|
end
|
|
128
128
|
|
|
129
|
-
class BulkContactsPageMetadata < PageMetadata
|
|
130
|
-
attr_reader :bulk_contacts_page
|
|
131
|
-
|
|
132
|
-
def initialize(version, response, solution, limit)
|
|
133
|
-
super(version, response)
|
|
134
|
-
@bulk_contacts_page = []
|
|
135
|
-
@limit = limit
|
|
136
|
-
key = get_key(response.body)
|
|
137
|
-
records = 0
|
|
138
|
-
while( limit != :unset && records < limit )
|
|
139
|
-
@bulk_contacts_page << BulkContactsListResponse.new(version, @payload, key, limit - records)
|
|
140
|
-
@payload = self.next_page
|
|
141
|
-
break unless @payload
|
|
142
|
-
records += (@payload.body[key] || []).size
|
|
143
|
-
end
|
|
144
|
-
# Path Solution
|
|
145
|
-
@solution = solution
|
|
146
|
-
end
|
|
147
|
-
|
|
148
|
-
def each
|
|
149
|
-
@bulk_contacts_page.each do |record|
|
|
150
|
-
yield record
|
|
151
|
-
end
|
|
152
|
-
end
|
|
153
|
-
|
|
154
|
-
def to_s
|
|
155
|
-
'<Twilio::REST::Accounts::V1PageMetadata>';
|
|
156
|
-
end
|
|
157
|
-
end
|
|
158
|
-
class BulkContactsListResponse < InstanceListResource
|
|
159
|
-
|
|
160
|
-
# @param [Array<BulkContactsInstance>] instance
|
|
161
|
-
# @param [Hash{String => Object}] headers
|
|
162
|
-
# @param [Integer] status_code
|
|
163
|
-
def initialize(version, payload, key, limit = :unset)
|
|
164
|
-
data_list = payload.body[key] || []
|
|
165
|
-
if limit != :unset
|
|
166
|
-
data_list = data_list[0, limit]
|
|
167
|
-
end
|
|
168
|
-
@bulk_contacts = data_list.map do |data|
|
|
169
|
-
BulkContactsInstance.new(version, data)
|
|
170
|
-
end
|
|
171
|
-
@headers = payload.headers
|
|
172
|
-
@status_code = payload.status_code
|
|
173
|
-
end
|
|
174
|
-
|
|
175
|
-
def bulk_contacts
|
|
176
|
-
@bulk_contacts
|
|
177
|
-
end
|
|
178
|
-
|
|
179
|
-
def headers
|
|
180
|
-
@headers
|
|
181
|
-
end
|
|
182
|
-
|
|
183
|
-
def status_code
|
|
184
|
-
@status_code
|
|
185
|
-
end
|
|
186
|
-
end
|
|
187
|
-
|
|
188
129
|
class BulkContactsInstance < InstanceResource
|
|
189
130
|
##
|
|
190
131
|
# Initialize the BulkContactsInstance
|
|
@@ -98,65 +98,6 @@ module Twilio
|
|
|
98
98
|
end
|
|
99
99
|
end
|
|
100
100
|
|
|
101
|
-
class CredentialPageMetadata < PageMetadata
|
|
102
|
-
attr_reader :credential_page
|
|
103
|
-
|
|
104
|
-
def initialize(version, response, solution, limit)
|
|
105
|
-
super(version, response)
|
|
106
|
-
@credential_page = []
|
|
107
|
-
@limit = limit
|
|
108
|
-
key = get_key(response.body)
|
|
109
|
-
records = 0
|
|
110
|
-
while( limit != :unset && records < limit )
|
|
111
|
-
@credential_page << CredentialListResponse.new(version, @payload, key, limit - records)
|
|
112
|
-
@payload = self.next_page
|
|
113
|
-
break unless @payload
|
|
114
|
-
records += (@payload.body[key] || []).size
|
|
115
|
-
end
|
|
116
|
-
# Path Solution
|
|
117
|
-
@solution = solution
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
def each
|
|
121
|
-
@credential_page.each do |record|
|
|
122
|
-
yield record
|
|
123
|
-
end
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
def to_s
|
|
127
|
-
'<Twilio::REST::Accounts::V1PageMetadata>';
|
|
128
|
-
end
|
|
129
|
-
end
|
|
130
|
-
class CredentialListResponse < InstanceListResource
|
|
131
|
-
|
|
132
|
-
# @param [Array<CredentialInstance>] instance
|
|
133
|
-
# @param [Hash{String => Object}] headers
|
|
134
|
-
# @param [Integer] status_code
|
|
135
|
-
def initialize(version, payload, key, limit = :unset)
|
|
136
|
-
data_list = payload.body[key] || []
|
|
137
|
-
if limit != :unset
|
|
138
|
-
data_list = data_list[0, limit]
|
|
139
|
-
end
|
|
140
|
-
@credential = data_list.map do |data|
|
|
141
|
-
CredentialInstance.new(version, data)
|
|
142
|
-
end
|
|
143
|
-
@headers = payload.headers
|
|
144
|
-
@status_code = payload.status_code
|
|
145
|
-
end
|
|
146
|
-
|
|
147
|
-
def credential
|
|
148
|
-
@credential
|
|
149
|
-
end
|
|
150
|
-
|
|
151
|
-
def headers
|
|
152
|
-
@headers
|
|
153
|
-
end
|
|
154
|
-
|
|
155
|
-
def status_code
|
|
156
|
-
@status_code
|
|
157
|
-
end
|
|
158
|
-
end
|
|
159
|
-
|
|
160
101
|
class CredentialInstance < InstanceResource
|
|
161
102
|
##
|
|
162
103
|
# Initialize the CredentialInstance
|